• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/platform_file.h"
6 
7 #include <fcntl.h>
8 #include <errno.h>
9 #include <sys/stat.h>
10 
11 #include "base/file_path.h"
12 #include "base/logging.h"
13 #include "base/utf_string_conversions.h"
14 
15 namespace base {
16 
17 // TODO(erikkay): does it make sense to support PLATFORM_FILE_EXCLUSIVE_* here?
CreatePlatformFile(const FilePath & name,int flags,bool * created)18 PlatformFile CreatePlatformFile(const FilePath& name, int flags,
19                                 bool* created) {
20   int open_flags = 0;
21   if (flags & PLATFORM_FILE_CREATE)
22     open_flags = O_CREAT | O_EXCL;
23 
24   if (flags & PLATFORM_FILE_CREATE_ALWAYS) {
25     DCHECK(!open_flags);
26     open_flags = O_CREAT | O_TRUNC;
27   }
28 
29   if (!open_flags && !(flags & PLATFORM_FILE_OPEN) &&
30       !(flags & PLATFORM_FILE_OPEN_ALWAYS)) {
31     NOTREACHED();
32     errno = EOPNOTSUPP;
33     return kInvalidPlatformFileValue;
34   }
35 
36   if (flags & PLATFORM_FILE_WRITE && flags & PLATFORM_FILE_READ) {
37     open_flags |= O_RDWR;
38   } else if (flags & PLATFORM_FILE_WRITE) {
39     open_flags |= O_WRONLY;
40   } else if (!(flags & PLATFORM_FILE_READ)) {
41     NOTREACHED();
42   }
43 
44   DCHECK(O_RDONLY == 0);
45 
46   int descriptor = open(name.value().c_str(), open_flags, S_IRUSR | S_IWUSR);
47 
48   if (flags & PLATFORM_FILE_OPEN_ALWAYS) {
49     if (descriptor > 0) {
50       if (created)
51         *created = false;
52     } else {
53       open_flags |= O_CREAT;
54       if (flags & PLATFORM_FILE_EXCLUSIVE_READ ||
55           flags & PLATFORM_FILE_EXCLUSIVE_WRITE) {
56         open_flags |= O_EXCL;   // together with O_CREAT implies O_NOFOLLOW
57       }
58       descriptor = open(name.value().c_str(), open_flags, S_IRUSR | S_IWUSR);
59       if (created && descriptor > 0)
60         *created = true;
61     }
62   }
63 
64   if ((descriptor > 0) && (flags & PLATFORM_FILE_DELETE_ON_CLOSE)) {
65     unlink(name.value().c_str());
66   }
67 
68   return descriptor;
69 }
70 
CreatePlatformFile(const std::wstring & name,int flags,bool * created)71 PlatformFile CreatePlatformFile(const std::wstring& name, int flags,
72                                 bool* created) {
73   return CreatePlatformFile(FilePath::FromWStringHack(name), flags, created);
74 }
75 
ClosePlatformFile(PlatformFile file)76 bool ClosePlatformFile(PlatformFile file) {
77   return close(file);
78 }
79 
80 }  // namespace base
81