diff options
author | dumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-31 19:30:27 +0000 |
---|---|---|
committer | dumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-31 19:30:27 +0000 |
commit | ed65fece343181e91b4d36e161434cc763475de7 (patch) | |
tree | 27af7d7cb8a12f65b24dba3ebd5ede3d592e2d8e /base/platform_file_posix.cc | |
parent | 2d723bc66e60bedd617ebd464996ee2388c0c365 (diff) | |
download | chromium_src-ed65fece343181e91b4d36e161434cc763475de7.zip chromium_src-ed65fece343181e91b4d36e161434cc763475de7.tar.gz chromium_src-ed65fece343181e91b4d36e161434cc763475de7.tar.bz2 |
Add an optional parameter to CreatePlatformFile() to report the type
of error that occured while trying to open/create a file.
TEST=none
BUG=none
Review URL: http://codereview.chromium.org/3223007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58045 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/platform_file_posix.cc')
-rw-r--r-- | base/platform_file_posix.cc | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/base/platform_file_posix.cc b/base/platform_file_posix.cc index 46039b9..1afb250 100644 --- a/base/platform_file_posix.cc +++ b/base/platform_file_posix.cc @@ -16,7 +16,7 @@ namespace base { // TODO(erikkay): does it make sense to support PLATFORM_FILE_EXCLUSIVE_* here? PlatformFile CreatePlatformFile(const FilePath& name, int flags, - bool* created) { + bool* created, PlatformFileError* error_code) { int open_flags = 0; if (flags & PLATFORM_FILE_CREATE) open_flags = O_CREAT | O_EXCL; @@ -30,6 +30,8 @@ PlatformFile CreatePlatformFile(const FilePath& name, int flags, !(flags & PLATFORM_FILE_OPEN_ALWAYS)) { NOTREACHED(); errno = EOPNOTSUPP; + if (error_code) + *error_code = PLATFORM_FILE_ERROR_FAILED; return kInvalidPlatformFileValue; } @@ -41,6 +43,11 @@ PlatformFile CreatePlatformFile(const FilePath& name, int flags, NOTREACHED(); } + if (flags & PLATFORM_FILE_TRUNCATE) { + DCHECK(flags & PLATFORM_FILE_WRITE); + open_flags |= O_TRUNC; + } + DCHECK(O_RDONLY == 0); int descriptor = open(name.value().c_str(), open_flags, S_IRUSR | S_IWUSR); @@ -61,16 +68,51 @@ PlatformFile CreatePlatformFile(const FilePath& name, int flags, } } - if ((descriptor > 0) && (flags & PLATFORM_FILE_DELETE_ON_CLOSE)) { + if ((descriptor < 0) && (flags & PLATFORM_FILE_DELETE_ON_CLOSE)) { unlink(name.value().c_str()); } + if ((descriptor < 0) && error_code) { + switch (errno) { + case EACCES: + case EISDIR: + case EROFS: + case EPERM: + *error_code = PLATFORM_FILE_ERROR_ACCESS_DENIED; + break; + case ETXTBSY: + *error_code = PLATFORM_FILE_ERROR_IN_USE; + break; + case EEXIST: + *error_code = PLATFORM_FILE_ERROR_EXISTS; + break; + case ENOENT: + *error_code = PLATFORM_FILE_ERROR_NOT_FOUND; + break; + case EMFILE: + *error_code = PLATFORM_FILE_ERROR_TOO_MANY_OPENED; + break; + case ENOMEM: + *error_code = PLATFORM_FILE_ERROR_NO_MEMORY; + break; + case ENOSPC: + *error_code = PLATFORM_FILE_ERROR_NO_SPACE; + break; + case ENOTDIR: + *error_code = PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; + break; + default: + *error_code = PLATFORM_FILE_ERROR_FAILED; + } + } + return descriptor; } PlatformFile CreatePlatformFile(const std::wstring& name, int flags, bool* created) { - return CreatePlatformFile(FilePath::FromWStringHack(name), flags, created); + return CreatePlatformFile(FilePath::FromWStringHack(name), flags, + created, NULL); } bool ClosePlatformFile(PlatformFile file) { |