Index: base/platform_file_posix.cc |
diff --git a/base/platform_file_posix.cc b/base/platform_file_posix.cc |
index 7e6335e88451a090c54a6370f75b5a0122a6b8b3..4d2012a67b5a3b8238d8845049b6effa73f8b99e 100644 |
--- a/base/platform_file_posix.cc |
+++ b/base/platform_file_posix.cc |
@@ -27,7 +27,9 @@ COMPILE_ASSERT(PLATFORM_FILE_FROM_BEGIN == SEEK_SET && |
PLATFORM_FILE_FROM_CURRENT == SEEK_CUR && |
PLATFORM_FILE_FROM_END == SEEK_END, whence_matches_system); |
-#if defined(OS_BSD) || defined(OS_MACOSX) |
+namespace { |
+ |
+#if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) |
typedef struct stat stat_wrapper_t; |
static int CallFstat(int fd, stat_wrapper_t *sb) { |
base::ThreadRestrictions::AssertIOAllowed(); |
@@ -41,6 +43,32 @@ static int CallFstat(int fd, stat_wrapper_t *sb) { |
} |
#endif |
+// TODO(bbudge) Remove NaCl workarounds when it implements pread and pwrite. |
+#if !defined(OS_NACL) |
+static int CallPread(PlatformFile file, char* data, int size, int64 offset) { |
+ return HANDLE_EINTR(pread(file, data, size, offset)); |
+} |
+static int CallPwrite(PlatformFile file, const char* data, int size, |
+ int64 offset) { |
+ return HANDLE_EINTR(pwrite(file, data, size, offset)); |
+} |
+#else |
+static int CallPread(PlatformFile file, char* data, int size, int64 offset) { |
+ lseek(file, static_cast<off_t>(offset), SEEK_SET); |
+ return HANDLE_EINTR(read(file, data, size)); |
+} |
+static int CallPwrite(PlatformFile file, const char* data, int size, |
+ int64 offset) { |
+ lseek(file, static_cast<off_t>(offset), SEEK_SET); |
+ return HANDLE_EINTR(write(file, data, size)); |
+} |
+#endif |
+ |
+} // namespace |
+ |
+// NaCl lacks many file handling system calls, so exclude any platform file |
+// functions that can't be implemented there. |
+#if !defined(OS_NACL) |
// TODO(erikkay): does it make sense to support PLATFORM_FILE_EXCLUSIVE_* here? |
PlatformFile CreatePlatformFileUnsafe(const FilePath& name, |
int flags, |
@@ -139,6 +167,7 @@ PlatformFile CreatePlatformFileUnsafe(const FilePath& name, |
FILE* FdopenPlatformFile(PlatformFile file, const char* mode) { |
return fdopen(file, mode); |
} |
+#endif // !defined(OS_NACL) |
bool ClosePlatformFile(PlatformFile file) { |
base::ThreadRestrictions::AssertIOAllowed(); |
@@ -163,8 +192,8 @@ int ReadPlatformFile(PlatformFile file, int64 offset, char* data, int size) { |
int bytes_read = 0; |
int rv; |
do { |
- rv = HANDLE_EINTR(pread(file, data + bytes_read, |
- size - bytes_read, offset + bytes_read)); |
+ rv = CallPread(file, data + bytes_read, |
+ size - bytes_read, offset + bytes_read); |
if (rv <= 0) |
break; |
@@ -198,7 +227,7 @@ int ReadPlatformFileNoBestEffort(PlatformFile file, int64 offset, |
if (file < 0) |
return -1; |
- return HANDLE_EINTR(pread(file, data, size, offset)); |
+ return CallPread(file, data, size, offset); |
} |
int ReadPlatformFileCurPosNoBestEffort(PlatformFile file, |
@@ -214,8 +243,10 @@ int WritePlatformFile(PlatformFile file, int64 offset, |
const char* data, int size) { |
base::ThreadRestrictions::AssertIOAllowed(); |
+#if !defined(OS_NACL) // NaCl has no fcntl, but it shouldn't be needed here. |
if (fcntl(file, F_GETFL) & O_APPEND) |
return WritePlatformFileAtCurrentPos(file, data, size); |
+#endif // !defined(OS_NACL) |
if (file < 0 || size < 0) |
return -1; |
@@ -223,8 +254,8 @@ int WritePlatformFile(PlatformFile file, int64 offset, |
int bytes_written = 0; |
int rv; |
do { |
- rv = HANDLE_EINTR(pwrite(file, data + bytes_written, |
- size - bytes_written, offset + bytes_written)); |
+ rv = CallPwrite(file, data + bytes_written, |
+ size - bytes_written, offset + bytes_written); |
if (rv <= 0) |
break; |
@@ -262,6 +293,7 @@ int WritePlatformFileCurPosNoBestEffort(PlatformFile file, |
return HANDLE_EINTR(write(file, data, size)); |
} |
+#if !defined(OS_NACL) // NaCl has no ftruncate or fsync. |
bool TruncatePlatformFile(PlatformFile file, int64 length) { |
base::ThreadRestrictions::AssertIOAllowed(); |
return ((file >= 0) && !HANDLE_EINTR(ftruncate(file, length))); |
@@ -271,7 +303,9 @@ bool FlushPlatformFile(PlatformFile file) { |
base::ThreadRestrictions::AssertIOAllowed(); |
return !HANDLE_EINTR(fsync(file)); |
} |
+#endif // !defined(OS_NACL) |
+#if !defined(OS_NACL) |
bool TouchPlatformFile(PlatformFile file, const base::Time& last_access_time, |
const base::Time& last_modified_time) { |
base::ThreadRestrictions::AssertIOAllowed(); |
@@ -297,6 +331,7 @@ bool TouchPlatformFile(PlatformFile file, const base::Time& last_access_time, |
return !futimes(file, times); |
#endif |
} |
+#endif // !defined(OS_NACL) |
bool GetPlatformFileInfo(PlatformFile file, PlatformFileInfo* info) { |
if (!info) |
@@ -322,8 +357,10 @@ PlatformFileError ErrnoToPlatformFileError(int saved_errno) { |
case EROFS: |
case EPERM: |
return PLATFORM_FILE_ERROR_ACCESS_DENIED; |
+#if !defined(OS_NACL) // ETXTBSY not defined by NaCl. |
case ETXTBSY: |
return PLATFORM_FILE_ERROR_IN_USE; |
+#endif |
case EEXIST: |
return PLATFORM_FILE_ERROR_EXISTS; |
case ENOENT: |