Chromium Code Reviews| OLD | NEW |
|---|---|
| 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_util.h" | 5 #include "base/files/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 <libgen.h> | 10 #include <libgen.h> |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 if (mprotect(mapping, pagesize, PROT_READ | PROT_EXEC) == 0) | 178 if (mprotect(mapping, pagesize, PROT_READ | PROT_EXEC) == 0) |
| 179 result = true; | 179 result = true; |
| 180 munmap(mapping, pagesize); | 180 munmap(mapping, pagesize); |
| 181 } | 181 } |
| 182 } | 182 } |
| 183 return result; | 183 return result; |
| 184 } | 184 } |
| 185 #endif // defined(OS_LINUX) | 185 #endif // defined(OS_LINUX) |
| 186 #endif // !defined(OS_NACL_NONSFI) | 186 #endif // !defined(OS_NACL_NONSFI) |
| 187 | 187 |
| 188 // Appends |mode_char| to |mode| before the optional character set encoding for | |
| 189 // non-Mac platforms (which do not support this); see | |
|
Mark Mentovai
2017/02/09 15:15:16
Why even bother defining this on Mac? Since you ne
grt (UTC plus 2)
2017/02/10 09:37:21
Done.
| |
| 190 // https://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html for | |
| 191 // details. | |
| 192 std::string AppendModeCharacter(StringPiece mode, char mode_char) { | |
| 193 // Add |mode_char| immediately before the comma or at the end of the string. | |
| 194 std::string result(mode.as_string()); | |
| 195 #if !defined(OS_MACOSX) | |
| 196 size_t comma_pos = result.find(L','); | |
|
Mark Mentovai
2017/02/09 15:15:16
No L
grt (UTC plus 2)
2017/02/10 09:37:21
Done.
| |
| 197 result.insert(comma_pos == std::string::npos ? result.length() : comma_pos, 1, | |
| 198 mode_char); | |
| 199 #endif | |
| 200 return result; | |
| 201 } | |
| 202 | |
| 188 } // namespace | 203 } // namespace |
| 189 | 204 |
| 190 #if !defined(OS_NACL_NONSFI) | 205 #if !defined(OS_NACL_NONSFI) |
| 191 FilePath MakeAbsoluteFilePath(const FilePath& input) { | 206 FilePath MakeAbsoluteFilePath(const FilePath& input) { |
| 192 ThreadRestrictions::AssertIOAllowed(); | 207 ThreadRestrictions::AssertIOAllowed(); |
| 193 char full_path[PATH_MAX]; | 208 char full_path[PATH_MAX]; |
| 194 if (realpath(input.value().c_str(), full_path) == NULL) | 209 if (realpath(input.value().c_str(), full_path) == NULL) |
| 195 return FilePath(); | 210 return FilePath(); |
| 196 return FilePath(full_path); | 211 return FilePath(full_path); |
| 197 } | 212 } |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 703 #if defined(OS_ANDROID) | 718 #if defined(OS_ANDROID) |
| 704 } | 719 } |
| 705 #endif // defined(OS_ANDROID) | 720 #endif // defined(OS_ANDROID) |
| 706 | 721 |
| 707 results->FromStat(file_info); | 722 results->FromStat(file_info); |
| 708 return true; | 723 return true; |
| 709 } | 724 } |
| 710 #endif // !defined(OS_NACL_NONSFI) | 725 #endif // !defined(OS_NACL_NONSFI) |
| 711 | 726 |
| 712 FILE* OpenFile(const FilePath& filename, const char* mode) { | 727 FILE* OpenFile(const FilePath& filename, const char* mode) { |
| 728 // 'e' is unconditionally added below, so be sure there is not one already | |
| 729 // present before a comma in |mode|. | |
| 730 DCHECK(::strchr(mode, 'e') == nullptr || | |
|
Mark Mentovai
2017/02/09 15:15:16
No ::
grt (UTC plus 2)
2017/02/10 09:37:21
Done.
| |
| 731 (::strchr(mode, ',') != nullptr && | |
| 732 ::strchr(mode, 'e') > ::strchr(mode, ','))); | |
| 713 ThreadRestrictions::AssertIOAllowed(); | 733 ThreadRestrictions::AssertIOAllowed(); |
| 714 FILE* result = NULL; | 734 FILE* result = NULL; |
| 735 std::string mode_with_e(AppendModeCharacter(mode, 'e')); | |
| 715 do { | 736 do { |
| 716 result = fopen(filename.value().c_str(), mode); | 737 result = fopen(filename.value().c_str(), mode_with_e.c_str()); |
| 717 } while (!result && errno == EINTR); | 738 } while (!result && errno == EINTR); |
| 739 #if defined(OS_MACOSX) | |
| 740 // Mark the descriptor as close-on-exec. | |
| 741 if (result) | |
| 742 SetCloseOnExec(fileno(result)); | |
| 743 #endif | |
| 718 return result; | 744 return result; |
| 719 } | 745 } |
| 720 | 746 |
| 721 // NaCl doesn't implement system calls to open files directly. | 747 // NaCl doesn't implement system calls to open files directly. |
| 722 #if !defined(OS_NACL) | 748 #if !defined(OS_NACL) |
| 723 FILE* FileToFILE(File file, const char* mode) { | 749 FILE* FileToFILE(File file, const char* mode) { |
| 724 FILE* stream = fdopen(file.GetPlatformFile(), mode); | 750 FILE* stream = fdopen(file.GetPlatformFile(), mode); |
| 725 if (stream) | 751 if (stream) |
| 726 file.TakePlatformFile(); | 752 file.TakePlatformFile(); |
| 727 return stream; | 753 return stream; |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 982 return false; | 1008 return false; |
| 983 | 1009 |
| 984 DeleteFile(from_path, true); | 1010 DeleteFile(from_path, true); |
| 985 return true; | 1011 return true; |
| 986 } | 1012 } |
| 987 | 1013 |
| 988 } // namespace internal | 1014 } // namespace internal |
| 989 | 1015 |
| 990 #endif // !defined(OS_NACL_NONSFI) | 1016 #endif // !defined(OS_NACL_NONSFI) |
| 991 } // namespace base | 1017 } // namespace base |
| OLD | NEW |