Home | History | Annotate | Download | only in base
      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?
     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 
     71 PlatformFile CreatePlatformFile(const std::wstring& name, int flags,
     72                                 bool* created) {
     73   return CreatePlatformFile(FilePath::FromWStringHack(name), flags, created);
     74 }
     75 
     76 bool ClosePlatformFile(PlatformFile file) {
     77   return close(file);
     78 }
     79 
     80 }  // namespace base
     81