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

Side by Side Diff: base/file_util_posix.cc

Issue 3983005: Revert 63600 - Thread IO safety: annotate file_util, and block IO thread from... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 2 months 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | base/shared_memory_posix.cc » ('j') | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/file_util.h" 5 #include "base/file_util.h"
6 6
7 #include <dirent.h> 7 #include <dirent.h>
8 #include <errno.h> 8 #include <errno.h>
9 #include <fcntl.h> 9 #include <fcntl.h>
10 #include <fnmatch.h> 10 #include <fnmatch.h>
(...skipping 21 matching lines...) Expand all
32 32
33 #include "base/basictypes.h" 33 #include "base/basictypes.h"
34 #include "base/eintr_wrapper.h" 34 #include "base/eintr_wrapper.h"
35 #include "base/file_path.h" 35 #include "base/file_path.h"
36 #include "base/lock.h" 36 #include "base/lock.h"
37 #include "base/logging.h" 37 #include "base/logging.h"
38 #include "base/scoped_ptr.h" 38 #include "base/scoped_ptr.h"
39 #include "base/singleton.h" 39 #include "base/singleton.h"
40 #include "base/string_util.h" 40 #include "base/string_util.h"
41 #include "base/sys_string_conversions.h" 41 #include "base/sys_string_conversions.h"
42 #include "base/thread_restrictions.h"
43 #include "base/time.h" 42 #include "base/time.h"
44 #include "base/utf_string_conversions.h" 43 #include "base/utf_string_conversions.h"
45 44
46 namespace file_util { 45 namespace file_util {
47 46
48 namespace { 47 namespace {
49 48
50 // Helper for NormalizeFilePath(), defined below. 49 // Helper for NormalizeFilePath(), defined below.
51 bool RealPath(const FilePath& path, FilePath* real_path) { 50 bool RealPath(const FilePath& path, FilePath* real_path) {
52 base::ThreadRestrictions::AssertIOAllowed(); // For realpath().
53 FilePath::CharType buf[PATH_MAX]; 51 FilePath::CharType buf[PATH_MAX];
54 if (!realpath(path.value().c_str(), buf)) 52 if (!realpath(path.value().c_str(), buf))
55 return false; 53 return false;
56 54
57 *real_path = FilePath(buf); 55 *real_path = FilePath(buf);
58 return true; 56 return true;
59 } 57 }
60 58
61 } // namespace 59 } // namespace
62 60
63 #if defined(OS_OPENBSD) || defined(OS_FREEBSD) || \ 61 #if defined(OS_OPENBSD) || defined(OS_FREEBSD) || \
64 (defined(OS_MACOSX) && \ 62 (defined(OS_MACOSX) && \
65 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) 63 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
66 typedef struct stat stat_wrapper_t; 64 typedef struct stat stat_wrapper_t;
67 static int CallStat(const char *path, stat_wrapper_t *sb) { 65 static int CallStat(const char *path, stat_wrapper_t *sb) {
68 base::ThreadRestrictions::AssertIOAllowed();
69 return stat(path, sb); 66 return stat(path, sb);
70 } 67 }
71 #else 68 #else
72 typedef struct stat64 stat_wrapper_t; 69 typedef struct stat64 stat_wrapper_t;
73 static int CallStat(const char *path, stat_wrapper_t *sb) { 70 static int CallStat(const char *path, stat_wrapper_t *sb) {
74 base::ThreadRestrictions::AssertIOAllowed();
75 return stat64(path, sb); 71 return stat64(path, sb);
76 } 72 }
77 #endif 73 #endif
78 74
79 75
80 #if defined(GOOGLE_CHROME_BUILD) 76 #if defined(GOOGLE_CHROME_BUILD)
81 static const char* kTempFileName = ".com.google.chrome.XXXXXX"; 77 static const char* kTempFileName = ".com.google.chrome.XXXXXX";
82 #else 78 #else
83 static const char* kTempFileName = ".org.chromium.XXXXXX"; 79 static const char* kTempFileName = ".org.chromium.XXXXXX";
84 #endif 80 #endif
85 81
86 bool AbsolutePath(FilePath* path) { 82 bool AbsolutePath(FilePath* path) {
87 base::ThreadRestrictions::AssertIOAllowed(); // For realpath().
88 char full_path[PATH_MAX]; 83 char full_path[PATH_MAX];
89 if (realpath(path->value().c_str(), full_path) == NULL) 84 if (realpath(path->value().c_str(), full_path) == NULL)
90 return false; 85 return false;
91 *path = FilePath(full_path); 86 *path = FilePath(full_path);
92 return true; 87 return true;
93 } 88 }
94 89
95 int CountFilesCreatedAfter(const FilePath& path, 90 int CountFilesCreatedAfter(const FilePath& path,
96 const base::Time& comparison_time) { 91 const base::Time& comparison_time) {
97 base::ThreadRestrictions::AssertIOAllowed();
98 int file_count = 0; 92 int file_count = 0;
99 93
100 DIR* dir = opendir(path.value().c_str()); 94 DIR* dir = opendir(path.value().c_str());
101 if (dir) { 95 if (dir) {
102 #if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \ 96 #if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \
103 !defined(OS_OPENBSD) && !defined(OS_SOLARIS) 97 !defined(OS_OPENBSD) && !defined(OS_SOLARIS)
104 #error Port warning: depending on the definition of struct dirent, \ 98 #error Port warning: depending on the definition of struct dirent, \
105 additional space for pathname may be needed 99 additional space for pathname may be needed
106 #endif 100 #endif
107 struct dirent ent_buf; 101 struct dirent ent_buf;
(...skipping 30 matching lines...) Expand all
138 closedir(dir); 132 closedir(dir);
139 } 133 }
140 return file_count; 134 return file_count;
141 } 135 }
142 136
143 // TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*" 137 // TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*"
144 // which works both with and without the recursive flag. I'm not sure we need 138 // which works both with and without the recursive flag. I'm not sure we need
145 // that functionality. If not, remove from file_util_win.cc, otherwise add it 139 // that functionality. If not, remove from file_util_win.cc, otherwise add it
146 // here. 140 // here.
147 bool Delete(const FilePath& path, bool recursive) { 141 bool Delete(const FilePath& path, bool recursive) {
148 base::ThreadRestrictions::AssertIOAllowed();
149 const char* path_str = path.value().c_str(); 142 const char* path_str = path.value().c_str();
150 stat_wrapper_t file_info; 143 stat_wrapper_t file_info;
151 int test = CallStat(path_str, &file_info); 144 int test = CallStat(path_str, &file_info);
152 if (test != 0) { 145 if (test != 0) {
153 // The Windows version defines this condition as success. 146 // The Windows version defines this condition as success.
154 bool ret = (errno == ENOENT || errno == ENOTDIR); 147 bool ret = (errno == ENOENT || errno == ENOTDIR);
155 return ret; 148 return ret;
156 } 149 }
157 if (!S_ISDIR(file_info.st_mode)) 150 if (!S_ISDIR(file_info.st_mode))
158 return (unlink(path_str) == 0); 151 return (unlink(path_str) == 0);
(...skipping 19 matching lines...) Expand all
178 171
179 while (success && !directories.empty()) { 172 while (success && !directories.empty()) {
180 FilePath dir = FilePath(directories.top()); 173 FilePath dir = FilePath(directories.top());
181 directories.pop(); 174 directories.pop();
182 success = (rmdir(dir.value().c_str()) == 0); 175 success = (rmdir(dir.value().c_str()) == 0);
183 } 176 }
184 return success; 177 return success;
185 } 178 }
186 179
187 bool Move(const FilePath& from_path, const FilePath& to_path) { 180 bool Move(const FilePath& from_path, const FilePath& to_path) {
188 base::ThreadRestrictions::AssertIOAllowed();
189 // Windows compatibility: if to_path exists, from_path and to_path 181 // Windows compatibility: if to_path exists, from_path and to_path
190 // must be the same type, either both files, or both directories. 182 // must be the same type, either both files, or both directories.
191 stat_wrapper_t to_file_info; 183 stat_wrapper_t to_file_info;
192 if (CallStat(to_path.value().c_str(), &to_file_info) == 0) { 184 if (CallStat(to_path.value().c_str(), &to_file_info) == 0) {
193 stat_wrapper_t from_file_info; 185 stat_wrapper_t from_file_info;
194 if (CallStat(from_path.value().c_str(), &from_file_info) == 0) { 186 if (CallStat(from_path.value().c_str(), &from_file_info) == 0) {
195 if (S_ISDIR(to_file_info.st_mode) != S_ISDIR(from_file_info.st_mode)) 187 if (S_ISDIR(to_file_info.st_mode) != S_ISDIR(from_file_info.st_mode))
196 return false; 188 return false;
197 } else { 189 } else {
198 return false; 190 return false;
199 } 191 }
200 } 192 }
201 193
202 if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0) 194 if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0)
203 return true; 195 return true;
204 196
205 if (!CopyDirectory(from_path, to_path, true)) 197 if (!CopyDirectory(from_path, to_path, true))
206 return false; 198 return false;
207 199
208 Delete(from_path, true); 200 Delete(from_path, true);
209 return true; 201 return true;
210 } 202 }
211 203
212 bool ReplaceFile(const FilePath& from_path, const FilePath& to_path) { 204 bool ReplaceFile(const FilePath& from_path, const FilePath& to_path) {
213 base::ThreadRestrictions::AssertIOAllowed();
214 return (rename(from_path.value().c_str(), to_path.value().c_str()) == 0); 205 return (rename(from_path.value().c_str(), to_path.value().c_str()) == 0);
215 } 206 }
216 207
217 bool CopyDirectory(const FilePath& from_path, 208 bool CopyDirectory(const FilePath& from_path,
218 const FilePath& to_path, 209 const FilePath& to_path,
219 bool recursive) { 210 bool recursive) {
220 base::ThreadRestrictions::AssertIOAllowed();
221 // Some old callers of CopyDirectory want it to support wildcards. 211 // Some old callers of CopyDirectory want it to support wildcards.
222 // After some discussion, we decided to fix those callers. 212 // After some discussion, we decided to fix those callers.
223 // Break loudly here if anyone tries to do this. 213 // Break loudly here if anyone tries to do this.
224 // TODO(evanm): remove this once we're sure it's ok. 214 // TODO(evanm): remove this once we're sure it's ok.
225 DCHECK(to_path.value().find('*') == std::string::npos); 215 DCHECK(to_path.value().find('*') == std::string::npos);
226 DCHECK(from_path.value().find('*') == std::string::npos); 216 DCHECK(from_path.value().find('*') == std::string::npos);
227 217
228 char top_dir[PATH_MAX]; 218 char top_dir[PATH_MAX];
229 if (base::strlcpy(top_dir, from_path.value().c_str(), 219 if (base::strlcpy(top_dir, from_path.value().c_str(),
230 arraysize(top_dir)) >= arraysize(top_dir)) { 220 arraysize(top_dir)) >= arraysize(top_dir)) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 } 300 }
311 301
312 current = traversal.Next(); 302 current = traversal.Next();
313 traversal.GetFindInfo(&info); 303 traversal.GetFindInfo(&info);
314 } 304 }
315 305
316 return success; 306 return success;
317 } 307 }
318 308
319 bool PathExists(const FilePath& path) { 309 bool PathExists(const FilePath& path) {
320 base::ThreadRestrictions::AssertIOAllowed();
321 return access(path.value().c_str(), F_OK) == 0; 310 return access(path.value().c_str(), F_OK) == 0;
322 } 311 }
323 312
324 bool PathIsWritable(const FilePath& path) { 313 bool PathIsWritable(const FilePath& path) {
325 base::ThreadRestrictions::AssertIOAllowed();
326 return access(path.value().c_str(), W_OK) == 0; 314 return access(path.value().c_str(), W_OK) == 0;
327 } 315 }
328 316
329 bool DirectoryExists(const FilePath& path) { 317 bool DirectoryExists(const FilePath& path) {
330 base::ThreadRestrictions::AssertIOAllowed();
331 stat_wrapper_t file_info; 318 stat_wrapper_t file_info;
332 if (CallStat(path.value().c_str(), &file_info) == 0) 319 if (CallStat(path.value().c_str(), &file_info) == 0)
333 return S_ISDIR(file_info.st_mode); 320 return S_ISDIR(file_info.st_mode);
334 return false; 321 return false;
335 } 322 }
336 323
337 // TODO(erikkay): implement 324 // TODO(erikkay): implement
338 #if 0 325 #if 0
339 bool GetFileCreationLocalTimeFromHandle(int fd, 326 bool GetFileCreationLocalTimeFromHandle(int fd,
340 LPSYSTEMTIME creation_time) { 327 LPSYSTEMTIME creation_time) {
(...skipping 30 matching lines...) Expand all
371 break; 358 break;
372 total_read += bytes_read; 359 total_read += bytes_read;
373 } 360 }
374 return total_read == bytes; 361 return total_read == bytes;
375 } 362 }
376 363
377 // Creates and opens a temporary file in |directory|, returning the 364 // Creates and opens a temporary file in |directory|, returning the
378 // file descriptor. |path| is set to the temporary file path. 365 // file descriptor. |path| is set to the temporary file path.
379 // This function does NOT unlink() the file. 366 // This function does NOT unlink() the file.
380 int CreateAndOpenFdForTemporaryFile(FilePath directory, FilePath* path) { 367 int CreateAndOpenFdForTemporaryFile(FilePath directory, FilePath* path) {
381 base::ThreadRestrictions::AssertIOAllowed(); // For call to mkstemp().
382 *path = directory.Append(kTempFileName); 368 *path = directory.Append(kTempFileName);
383 const std::string& tmpdir_string = path->value(); 369 const std::string& tmpdir_string = path->value();
384 // this should be OK since mkstemp just replaces characters in place 370 // this should be OK since mkstemp just replaces characters in place
385 char* buffer = const_cast<char*>(tmpdir_string.c_str()); 371 char* buffer = const_cast<char*>(tmpdir_string.c_str());
386 372
387 return mkstemp(buffer); 373 return mkstemp(buffer);
388 } 374 }
389 375
390 bool CreateTemporaryFile(FilePath* path) { 376 bool CreateTemporaryFile(FilePath* path) {
391 base::ThreadRestrictions::AssertIOAllowed(); // For call to close().
392 FilePath directory; 377 FilePath directory;
393 if (!GetTempDir(&directory)) 378 if (!GetTempDir(&directory))
394 return false; 379 return false;
395 int fd = CreateAndOpenFdForTemporaryFile(directory, path); 380 int fd = CreateAndOpenFdForTemporaryFile(directory, path);
396 if (fd < 0) 381 if (fd < 0)
397 return false; 382 return false;
398 close(fd); 383 close(fd);
399 return true; 384 return true;
400 } 385 }
401 386
402 FILE* CreateAndOpenTemporaryShmemFile(FilePath* path) { 387 FILE* CreateAndOpenTemporaryShmemFile(FilePath* path) {
403 FilePath directory; 388 FilePath directory;
404 if (!GetShmemTempDir(&directory)) 389 if (!GetShmemTempDir(&directory))
405 return NULL; 390 return NULL;
406 391
407 return CreateAndOpenTemporaryFileInDir(directory, path); 392 return CreateAndOpenTemporaryFileInDir(directory, path);
408 } 393 }
409 394
410 FILE* CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* path) { 395 FILE* CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* path) {
411 int fd = CreateAndOpenFdForTemporaryFile(dir, path); 396 int fd = CreateAndOpenFdForTemporaryFile(dir, path);
412 if (fd < 0) 397 if (fd < 0)
413 return NULL; 398 return NULL;
414 399
415 return fdopen(fd, "a+"); 400 return fdopen(fd, "a+");
416 } 401 }
417 402
418 bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { 403 bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) {
419 base::ThreadRestrictions::AssertIOAllowed(); // For call to close().
420 int fd = CreateAndOpenFdForTemporaryFile(dir, temp_file); 404 int fd = CreateAndOpenFdForTemporaryFile(dir, temp_file);
421 return ((fd >= 0) && !close(fd)); 405 return ((fd >= 0) && !close(fd));
422 } 406 }
423 407
424 static bool CreateTemporaryDirInDirImpl(const FilePath& base_dir, 408 static bool CreateTemporaryDirInDirImpl(const FilePath& base_dir,
425 const FilePath::StringType& name_tmpl, 409 const FilePath::StringType& name_tmpl,
426 FilePath* new_dir) { 410 FilePath* new_dir) {
427 base::ThreadRestrictions::AssertIOAllowed(); // For call to mkdtemp().
428 CHECK(name_tmpl.find("XXXXXX") != FilePath::StringType::npos) 411 CHECK(name_tmpl.find("XXXXXX") != FilePath::StringType::npos)
429 << "Directory name template must contain \"XXXXXX\"."; 412 << "Directory name template must contain \"XXXXXX\".";
430 413
431 FilePath sub_dir = base_dir.Append(name_tmpl); 414 FilePath sub_dir = base_dir.Append(name_tmpl);
432 std::string sub_dir_string = sub_dir.value(); 415 std::string sub_dir_string = sub_dir.value();
433 416
434 // this should be OK since mkdtemp just replaces characters in place 417 // this should be OK since mkdtemp just replaces characters in place
435 char* buffer = const_cast<char*>(sub_dir_string.c_str()); 418 char* buffer = const_cast<char*>(sub_dir_string.c_str());
436 char* dtemp = mkdtemp(buffer); 419 char* dtemp = mkdtemp(buffer);
437 if (!dtemp) { 420 if (!dtemp) {
(...skipping 15 matching lines...) Expand all
453 bool CreateNewTempDirectory(const FilePath::StringType& prefix, 436 bool CreateNewTempDirectory(const FilePath::StringType& prefix,
454 FilePath* new_temp_path) { 437 FilePath* new_temp_path) {
455 FilePath tmpdir; 438 FilePath tmpdir;
456 if (!GetTempDir(&tmpdir)) 439 if (!GetTempDir(&tmpdir))
457 return false; 440 return false;
458 441
459 return CreateTemporaryDirInDirImpl(tmpdir, kTempFileName, new_temp_path); 442 return CreateTemporaryDirInDirImpl(tmpdir, kTempFileName, new_temp_path);
460 } 443 }
461 444
462 bool CreateDirectory(const FilePath& full_path) { 445 bool CreateDirectory(const FilePath& full_path) {
463 base::ThreadRestrictions::AssertIOAllowed(); // For call to mkdir().
464 std::vector<FilePath> subpaths; 446 std::vector<FilePath> subpaths;
465 447
466 // Collect a list of all parent directories. 448 // Collect a list of all parent directories.
467 FilePath last_path = full_path; 449 FilePath last_path = full_path;
468 subpaths.push_back(full_path); 450 subpaths.push_back(full_path);
469 for (FilePath path = full_path.DirName(); 451 for (FilePath path = full_path.DirName();
470 path.value() != last_path.value(); path = path.DirName()) { 452 path.value() != last_path.value(); path = path.DirName()) {
471 subpaths.push_back(path); 453 subpaths.push_back(path);
472 last_path = path; 454 last_path = path;
473 } 455 }
(...skipping 21 matching lines...) Expand all
495 return false; 477 return false;
496 results->is_directory = S_ISDIR(file_info.st_mode); 478 results->is_directory = S_ISDIR(file_info.st_mode);
497 results->size = file_info.st_size; 479 results->size = file_info.st_size;
498 results->last_modified = base::Time::FromTimeT(file_info.st_mtime); 480 results->last_modified = base::Time::FromTimeT(file_info.st_mtime);
499 results->last_accessed = base::Time::FromTimeT(file_info.st_atime); 481 results->last_accessed = base::Time::FromTimeT(file_info.st_atime);
500 results->creation_time = base::Time::FromTimeT(file_info.st_ctime); 482 results->creation_time = base::Time::FromTimeT(file_info.st_ctime);
501 return true; 483 return true;
502 } 484 }
503 485
504 bool GetInode(const FilePath& path, ino_t* inode) { 486 bool GetInode(const FilePath& path, ino_t* inode) {
505 base::ThreadRestrictions::AssertIOAllowed(); // For call to stat().
506 struct stat buffer; 487 struct stat buffer;
507 int result = stat(path.value().c_str(), &buffer); 488 int result = stat(path.value().c_str(), &buffer);
508 if (result < 0) 489 if (result < 0)
509 return false; 490 return false;
510 491
511 *inode = buffer.st_ino; 492 *inode = buffer.st_ino;
512 return true; 493 return true;
513 } 494 }
514 495
515 FILE* OpenFile(const std::string& filename, const char* mode) { 496 FILE* OpenFile(const std::string& filename, const char* mode) {
516 return OpenFile(FilePath(filename), mode); 497 return OpenFile(FilePath(filename), mode);
517 } 498 }
518 499
519 FILE* OpenFile(const FilePath& filename, const char* mode) { 500 FILE* OpenFile(const FilePath& filename, const char* mode) {
520 base::ThreadRestrictions::AssertIOAllowed();
521 return fopen(filename.value().c_str(), mode); 501 return fopen(filename.value().c_str(), mode);
522 } 502 }
523 503
524 int ReadFile(const FilePath& filename, char* data, int size) { 504 int ReadFile(const FilePath& filename, char* data, int size) {
525 base::ThreadRestrictions::AssertIOAllowed();
526 int fd = open(filename.value().c_str(), O_RDONLY); 505 int fd = open(filename.value().c_str(), O_RDONLY);
527 if (fd < 0) 506 if (fd < 0)
528 return -1; 507 return -1;
529 508
530 ssize_t bytes_read = HANDLE_EINTR(read(fd, data, size)); 509 ssize_t bytes_read = HANDLE_EINTR(read(fd, data, size));
531 if (int ret = HANDLE_EINTR(close(fd)) < 0) 510 if (int ret = HANDLE_EINTR(close(fd)) < 0)
532 return ret; 511 return ret;
533 return bytes_read; 512 return bytes_read;
534 } 513 }
535 514
536 int WriteFile(const FilePath& filename, const char* data, int size) { 515 int WriteFile(const FilePath& filename, const char* data, int size) {
537 base::ThreadRestrictions::AssertIOAllowed();
538 int fd = creat(filename.value().c_str(), 0666); 516 int fd = creat(filename.value().c_str(), 0666);
539 if (fd < 0) 517 if (fd < 0)
540 return -1; 518 return -1;
541 519
542 int bytes_written = WriteFileDescriptor(fd, data, size); 520 int bytes_written = WriteFileDescriptor(fd, data, size);
543 if (int ret = HANDLE_EINTR(close(fd)) < 0) 521 if (int ret = HANDLE_EINTR(close(fd)) < 0)
544 return ret; 522 return ret;
545 return bytes_written; 523 return bytes_written;
546 } 524 }
547 525
548 int WriteFileDescriptor(const int fd, const char* data, int size) { 526 int WriteFileDescriptor(const int fd, const char* data, int size) {
549 // Allow for partial writes. 527 // Allow for partial writes.
550 ssize_t bytes_written_total = 0; 528 ssize_t bytes_written_total = 0;
551 for (ssize_t bytes_written_partial = 0; bytes_written_total < size; 529 for (ssize_t bytes_written_partial = 0; bytes_written_total < size;
552 bytes_written_total += bytes_written_partial) { 530 bytes_written_total += bytes_written_partial) {
553 bytes_written_partial = 531 bytes_written_partial =
554 HANDLE_EINTR(write(fd, data + bytes_written_total, 532 HANDLE_EINTR(write(fd, data + bytes_written_total,
555 size - bytes_written_total)); 533 size - bytes_written_total));
556 if (bytes_written_partial < 0) 534 if (bytes_written_partial < 0)
557 return -1; 535 return -1;
558 } 536 }
559 537
560 return bytes_written_total; 538 return bytes_written_total;
561 } 539 }
562 540
563 // Gets the current working directory for the process. 541 // Gets the current working directory for the process.
564 bool GetCurrentDirectory(FilePath* dir) { 542 bool GetCurrentDirectory(FilePath* dir) {
565 // getcwd can return ENOENT, which implies it checks against the disk.
566 base::ThreadRestrictions::AssertIOAllowed();
567
568 char system_buffer[PATH_MAX] = ""; 543 char system_buffer[PATH_MAX] = "";
569 if (!getcwd(system_buffer, sizeof(system_buffer))) { 544 if (!getcwd(system_buffer, sizeof(system_buffer))) {
570 NOTREACHED(); 545 NOTREACHED();
571 return false; 546 return false;
572 } 547 }
573 *dir = FilePath(system_buffer); 548 *dir = FilePath(system_buffer);
574 return true; 549 return true;
575 } 550 }
576 551
577 // Sets the current working directory for the process. 552 // Sets the current working directory for the process.
578 bool SetCurrentDirectory(const FilePath& path) { 553 bool SetCurrentDirectory(const FilePath& path) {
579 base::ThreadRestrictions::AssertIOAllowed();
580 int ret = chdir(path.value().c_str()); 554 int ret = chdir(path.value().c_str());
581 return !ret; 555 return !ret;
582 } 556 }
583 557
584 /////////////////////////////////////////////// 558 ///////////////////////////////////////////////
585 // FileEnumerator 559 // FileEnumerator
586 560
587 FileEnumerator::FileEnumerator(const FilePath& root_path, 561 FileEnumerator::FileEnumerator(const FilePath& root_path,
588 bool recursive, 562 bool recursive,
589 FileEnumerator::FILE_TYPE file_type) 563 FileEnumerator::FILE_TYPE file_type)
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 directory_entries_.push_back(*i); 648 directory_entries_.push_back(*i);
675 } 649 }
676 } 650 }
677 651
678 return root_path_.Append(directory_entries_[current_directory_entry_ 652 return root_path_.Append(directory_entries_[current_directory_entry_
679 ].filename); 653 ].filename);
680 } 654 }
681 655
682 bool FileEnumerator::ReadDirectory(std::vector<DirectoryEntryInfo>* entries, 656 bool FileEnumerator::ReadDirectory(std::vector<DirectoryEntryInfo>* entries,
683 const FilePath& source, bool show_links) { 657 const FilePath& source, bool show_links) {
684 base::ThreadRestrictions::AssertIOAllowed();
685 DIR* dir = opendir(source.value().c_str()); 658 DIR* dir = opendir(source.value().c_str());
686 if (!dir) 659 if (!dir)
687 return false; 660 return false;
688 661
689 #if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \ 662 #if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \
690 !defined(OS_OPENBSD) && !defined(OS_SOLARIS) 663 !defined(OS_OPENBSD) && !defined(OS_SOLARIS)
691 #error Port warning: depending on the definition of struct dirent, \ 664 #error Port warning: depending on the definition of struct dirent, \
692 additional space for pathname may be needed 665 additional space for pathname may be needed
693 #endif 666 #endif
694 667
(...skipping 28 matching lines...) Expand all
723 /////////////////////////////////////////////// 696 ///////////////////////////////////////////////
724 // MemoryMappedFile 697 // MemoryMappedFile
725 698
726 MemoryMappedFile::MemoryMappedFile() 699 MemoryMappedFile::MemoryMappedFile()
727 : file_(base::kInvalidPlatformFileValue), 700 : file_(base::kInvalidPlatformFileValue),
728 data_(NULL), 701 data_(NULL),
729 length_(0) { 702 length_(0) {
730 } 703 }
731 704
732 bool MemoryMappedFile::MapFileToMemoryInternal() { 705 bool MemoryMappedFile::MapFileToMemoryInternal() {
733 base::ThreadRestrictions::AssertIOAllowed();
734
735 struct stat file_stat; 706 struct stat file_stat;
736 if (fstat(file_, &file_stat) == base::kInvalidPlatformFileValue) { 707 if (fstat(file_, &file_stat) == base::kInvalidPlatformFileValue) {
737 LOG(ERROR) << "Couldn't fstat " << file_ << ", errno " << errno; 708 LOG(ERROR) << "Couldn't fstat " << file_ << ", errno " << errno;
738 return false; 709 return false;
739 } 710 }
740 length_ = file_stat.st_size; 711 length_ = file_stat.st_size;
741 712
742 data_ = static_cast<uint8*>( 713 data_ = static_cast<uint8*>(
743 mmap(NULL, length_, PROT_READ, MAP_SHARED, file_, 0)); 714 mmap(NULL, length_, PROT_READ, MAP_SHARED, file_, 0));
744 if (data_ == MAP_FAILED) 715 if (data_ == MAP_FAILED)
745 LOG(ERROR) << "Couldn't mmap " << file_ << ", errno " << errno; 716 LOG(ERROR) << "Couldn't mmap " << file_ << ", errno " << errno;
746 717
747 return data_ != MAP_FAILED; 718 return data_ != MAP_FAILED;
748 } 719 }
749 720
750 void MemoryMappedFile::CloseHandles() { 721 void MemoryMappedFile::CloseHandles() {
751 base::ThreadRestrictions::AssertIOAllowed();
752
753 if (data_ != NULL) 722 if (data_ != NULL)
754 munmap(data_, length_); 723 munmap(data_, length_);
755 if (file_ != base::kInvalidPlatformFileValue) 724 if (file_ != base::kInvalidPlatformFileValue)
756 close(file_); 725 close(file_);
757 726
758 data_ = NULL; 727 data_ = NULL;
759 length_ = 0; 728 length_ = 0;
760 file_ = base::kInvalidPlatformFileValue; 729 file_ = base::kInvalidPlatformFileValue;
761 } 730 }
762 731
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 bool GetShmemTempDir(FilePath* path) { 763 bool GetShmemTempDir(FilePath* path) {
795 *path = FilePath("/dev/shm"); 764 *path = FilePath("/dev/shm");
796 return true; 765 return true;
797 } 766 }
798 767
799 FilePath GetHomeDir() { 768 FilePath GetHomeDir() {
800 const char* home_dir = getenv("HOME"); 769 const char* home_dir = getenv("HOME");
801 if (home_dir && home_dir[0]) 770 if (home_dir && home_dir[0])
802 return FilePath(home_dir); 771 return FilePath(home_dir);
803 772
804 // g_get_home_dir calls getpwent, which can fall through to LDAP calls.
805 base::ThreadRestrictions::AssertIOAllowed();
806
807 home_dir = g_get_home_dir(); 773 home_dir = g_get_home_dir();
808 if (home_dir && home_dir[0]) 774 if (home_dir && home_dir[0])
809 return FilePath(home_dir); 775 return FilePath(home_dir);
810 776
811 FilePath rv; 777 FilePath rv;
812 if (file_util::GetTempDir(&rv)) 778 if (file_util::GetTempDir(&rv))
813 return rv; 779 return rv;
814 780
815 // Last resort. 781 // Last resort.
816 return FilePath("/tmp"); 782 return FilePath("/tmp");
817 } 783 }
818 784
819 bool CopyFile(const FilePath& from_path, const FilePath& to_path) { 785 bool CopyFile(const FilePath& from_path, const FilePath& to_path) {
820 base::ThreadRestrictions::AssertIOAllowed();
821 int infile = open(from_path.value().c_str(), O_RDONLY); 786 int infile = open(from_path.value().c_str(), O_RDONLY);
822 if (infile < 0) 787 if (infile < 0)
823 return false; 788 return false;
824 789
825 int outfile = creat(to_path.value().c_str(), 0666); 790 int outfile = creat(to_path.value().c_str(), 0666);
826 if (outfile < 0) { 791 if (outfile < 0) {
827 close(infile); 792 close(infile);
828 return false; 793 return false;
829 } 794 }
830 795
(...skipping 27 matching lines...) Expand all
858 if (HANDLE_EINTR(close(infile)) < 0) 823 if (HANDLE_EINTR(close(infile)) < 0)
859 result = false; 824 result = false;
860 if (HANDLE_EINTR(close(outfile)) < 0) 825 if (HANDLE_EINTR(close(outfile)) < 0)
861 result = false; 826 result = false;
862 827
863 return result; 828 return result;
864 } 829 }
865 #endif // defined(OS_MACOSX) 830 #endif // defined(OS_MACOSX)
866 831
867 } // namespace file_util 832 } // namespace file_util
OLDNEW
« no previous file with comments | « no previous file | base/shared_memory_posix.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698