Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: base/files/file_posix.cc

Issue 1474713005: [base] fcntl, not fctnl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/files/file.h" 5 #include "base/files/file.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <sys/stat.h> 9 #include <sys/stat.h>
10 #include <unistd.h> 10 #include <unistd.h>
(...skipping 11 matching lines...) Expand all
22 namespace base { 22 namespace base {
23 23
24 // Make sure our Whence mappings match the system headers. 24 // Make sure our Whence mappings match the system headers.
25 static_assert(File::FROM_BEGIN == SEEK_SET && File::FROM_CURRENT == SEEK_CUR && 25 static_assert(File::FROM_BEGIN == SEEK_SET && File::FROM_CURRENT == SEEK_CUR &&
26 File::FROM_END == SEEK_END, 26 File::FROM_END == SEEK_END,
27 "whence mapping must match the system headers"); 27 "whence mapping must match the system headers");
28 28
29 namespace { 29 namespace {
30 30
31 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) 31 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL)
32 static int CallFstat(int fd, stat_wrapper_t *sb) { 32 int CallFstat(int fd, stat_wrapper_t *sb) {
33 ThreadRestrictions::AssertIOAllowed(); 33 ThreadRestrictions::AssertIOAllowed();
34 return fstat(fd, sb); 34 return fstat(fd, sb);
35 } 35 }
36 #else 36 #else
37 static int CallFstat(int fd, stat_wrapper_t *sb) { 37 int CallFstat(int fd, stat_wrapper_t *sb) {
38 ThreadRestrictions::AssertIOAllowed(); 38 ThreadRestrictions::AssertIOAllowed();
39 return fstat64(fd, sb); 39 return fstat64(fd, sb);
40 } 40 }
41 #endif 41 #endif
42 42
43 // NaCl doesn't provide the following system calls, so either simulate them or 43 // NaCl doesn't provide the following system calls, so either simulate them or
44 // wrap them in order to minimize the number of #ifdef's in this file. 44 // wrap them in order to minimize the number of #ifdef's in this file.
45 #if !defined(OS_NACL) 45 #if !defined(OS_NACL)
46 static bool IsOpenAppend(PlatformFile file) { 46 bool IsOpenAppend(PlatformFile file) {
47 return (fcntl(file, F_GETFL) & O_APPEND) != 0; 47 return (fcntl(file, F_GETFL) & O_APPEND) != 0;
48 } 48 }
49 49
50 static int CallFtruncate(PlatformFile file, int64 length) { 50 int CallFtruncate(PlatformFile file, int64 length) {
51 return HANDLE_EINTR(ftruncate(file, length)); 51 return HANDLE_EINTR(ftruncate(file, length));
52 } 52 }
53 53
54 static int CallFutimes(PlatformFile file, const struct timeval times[2]) { 54 int CallFutimes(PlatformFile file, const struct timeval times[2]) {
55 #ifdef __USE_XOPEN2K8 55 #ifdef __USE_XOPEN2K8
56 // futimens should be available, but futimes might not be 56 // futimens should be available, but futimes might not be
57 // http://pubs.opengroup.org/onlinepubs/9699919799/ 57 // http://pubs.opengroup.org/onlinepubs/9699919799/
58 58
59 timespec ts_times[2]; 59 timespec ts_times[2];
60 ts_times[0].tv_sec = times[0].tv_sec; 60 ts_times[0].tv_sec = times[0].tv_sec;
61 ts_times[0].tv_nsec = times[0].tv_usec * 1000; 61 ts_times[0].tv_nsec = times[0].tv_usec * 1000;
62 ts_times[1].tv_sec = times[1].tv_sec; 62 ts_times[1].tv_sec = times[1].tv_sec;
63 ts_times[1].tv_nsec = times[1].tv_usec * 1000; 63 ts_times[1].tv_nsec = times[1].tv_usec * 1000;
64 64
65 return futimens(file, ts_times); 65 return futimens(file, ts_times);
66 #else 66 #else
67 return futimes(file, times); 67 return futimes(file, times);
68 #endif 68 #endif
69 } 69 }
70 70
71 static File::Error CallFctnlFlock(PlatformFile file, bool do_lock) { 71 File::Error CallFcntlFlock(PlatformFile file, bool do_lock) {
72 struct flock lock; 72 struct flock lock;
73 lock.l_type = F_WRLCK; 73 lock.l_type = F_WRLCK;
74 lock.l_whence = SEEK_SET; 74 lock.l_whence = SEEK_SET;
75 lock.l_start = 0; 75 lock.l_start = 0;
76 lock.l_len = 0; // Lock entire file. 76 lock.l_len = 0; // Lock entire file.
77 if (HANDLE_EINTR(fcntl(file, do_lock ? F_SETLK : F_UNLCK, &lock)) == -1) 77 if (HANDLE_EINTR(fcntl(file, do_lock ? F_SETLK : F_UNLCK, &lock)) == -1)
78 return File::OSErrorToFileError(errno); 78 return File::OSErrorToFileError(errno);
79 return File::FILE_OK; 79 return File::FILE_OK;
80 } 80 }
81 #else // defined(OS_NACL) 81 #else // defined(OS_NACL)
82 82
83 static bool IsOpenAppend(PlatformFile file) { 83 bool IsOpenAppend(PlatformFile file) {
84 // NaCl doesn't implement fcntl. Since NaCl's write conforms to the POSIX 84 // NaCl doesn't implement fcntl. Since NaCl's write conforms to the POSIX
85 // standard and always appends if the file is opened with O_APPEND, just 85 // standard and always appends if the file is opened with O_APPEND, just
86 // return false here. 86 // return false here.
87 return false; 87 return false;
88 } 88 }
89 89
90 static int CallFtruncate(PlatformFile file, int64 length) { 90 int CallFtruncate(PlatformFile file, int64 length) {
91 NOTIMPLEMENTED(); // NaCl doesn't implement ftruncate. 91 NOTIMPLEMENTED(); // NaCl doesn't implement ftruncate.
92 return 0; 92 return 0;
93 } 93 }
94 94
95 static int CallFutimes(PlatformFile file, const struct timeval times[2]) { 95 int CallFutimes(PlatformFile file, const struct timeval times[2]) {
96 NOTIMPLEMENTED(); // NaCl doesn't implement futimes. 96 NOTIMPLEMENTED(); // NaCl doesn't implement futimes.
97 return 0; 97 return 0;
98 } 98 }
99 99
100 static File::Error CallFctnlFlock(PlatformFile file, bool do_lock) { 100 File::Error CallFcntlFlock(PlatformFile file, bool do_lock) {
101 NOTIMPLEMENTED(); // NaCl doesn't implement flock struct. 101 NOTIMPLEMENTED(); // NaCl doesn't implement flock struct.
102 return File::FILE_ERROR_INVALID_OPERATION; 102 return File::FILE_ERROR_INVALID_OPERATION;
103 } 103 }
104 #endif // defined(OS_NACL) 104 #endif // defined(OS_NACL)
105 105
106 } // namespace 106 } // namespace
107 107
108 void File::Info::FromStat(const stat_wrapper_t& stat_info) { 108 void File::Info::FromStat(const stat_wrapper_t& stat_info) {
109 is_directory = S_ISDIR(stat_info.st_mode); 109 is_directory = S_ISDIR(stat_info.st_mode);
110 is_symbolic_link = S_ISLNK(stat_info.st_mode); 110 is_symbolic_link = S_ISLNK(stat_info.st_mode);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 stat_wrapper_t file_info; 353 stat_wrapper_t file_info;
354 if (CallFstat(file_.get(), &file_info)) 354 if (CallFstat(file_.get(), &file_info))
355 return false; 355 return false;
356 356
357 info->FromStat(file_info); 357 info->FromStat(file_info);
358 return true; 358 return true;
359 } 359 }
360 360
361 File::Error File::Lock() { 361 File::Error File::Lock() {
362 SCOPED_FILE_TRACE("Lock"); 362 SCOPED_FILE_TRACE("Lock");
363 return CallFctnlFlock(file_.get(), true); 363 return CallFcntlFlock(file_.get(), true);
364 } 364 }
365 365
366 File::Error File::Unlock() { 366 File::Error File::Unlock() {
367 SCOPED_FILE_TRACE("Unlock"); 367 SCOPED_FILE_TRACE("Unlock");
368 return CallFctnlFlock(file_.get(), false); 368 return CallFcntlFlock(file_.get(), false);
369 } 369 }
370 370
371 File File::Duplicate() { 371 File File::Duplicate() {
372 if (!IsValid()) 372 if (!IsValid())
373 return File(); 373 return File();
374 374
375 SCOPED_FILE_TRACE("Duplicate"); 375 SCOPED_FILE_TRACE("Duplicate");
376 376
377 PlatformFile other_fd = dup(GetPlatformFile()); 377 PlatformFile other_fd = dup(GetPlatformFile());
378 if (other_fd == -1) 378 if (other_fd == -1)
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 return !HANDLE_EINTR(fsync(file_.get())); 522 return !HANDLE_EINTR(fsync(file_.get()));
523 #endif 523 #endif
524 } 524 }
525 525
526 void File::SetPlatformFile(PlatformFile file) { 526 void File::SetPlatformFile(PlatformFile file) {
527 DCHECK(!file_.is_valid()); 527 DCHECK(!file_.is_valid());
528 file_.reset(file); 528 file_.reset(file);
529 } 529 }
530 530
531 } // namespace base 531 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698