diff options
Diffstat (limited to 'net/disk_cache/os_file_posix.cc')
-rw-r--r-- | net/disk_cache/os_file_posix.cc | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/net/disk_cache/os_file_posix.cc b/net/disk_cache/os_file_posix.cc index 7b8fe0d..7b1da0b 100644 --- a/net/disk_cache/os_file_posix.cc +++ b/net/disk_cache/os_file_posix.cc @@ -4,13 +4,56 @@ #include "net/disk_cache/os_file.h" +#include <fcntl.h> + #include "base/logging.h" +#include "base/string_util.h" namespace disk_cache { OSFile CreateOSFile(const std::wstring& name, int flags, bool* created) { - NOTIMPLEMENTED(); - return 0; + int open_flags = 0; + if (flags & OS_FILE_CREATE) + open_flags = O_CREAT | O_EXCL; + + if (flags & OS_FILE_CREATE_ALWAYS) { + DCHECK(!open_flags); + open_flags = O_CREAT | O_TRUNC; + } + + if (!open_flags && !(flags & OS_FILE_OPEN) && + !(flags & OS_FILE_OPEN_ALWAYS)) { + NOTREACHED(); + return -1; + } + + if (flags & OS_FILE_WRITE && flags & OS_FILE_READ) { + open_flags |= O_RDWR; + } else if (flags & OS_FILE_WRITE) { + open_flags |= O_WRONLY; + } else if (!(flags & OS_FILE_READ)) { + NOTREACHED(); + } + + DCHECK(O_RDONLY == 0); + + int descriptor = open(WideToUTF8(name).c_str(), open_flags, + S_IRUSR | S_IWUSR); + + if (flags & OS_FILE_OPEN_ALWAYS) { + if (descriptor > 0) { + if (created) + *created = false; + } else { + open_flags |= O_CREAT; + descriptor = open(WideToUTF8(name).c_str(), open_flags, + S_IRUSR | S_IWUSR); + if (created && descriptor > 0) + *created = true; + } + } + + return descriptor; } } // namespace disk_cache |