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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 | 49 |
50 #if defined(OS_ANDROID) | 50 #if defined(OS_ANDROID) |
51 #include "base/android/content_uri_utils.h" | 51 #include "base/android/content_uri_utils.h" |
52 #include "base/os_compat_android.h" | 52 #include "base/os_compat_android.h" |
53 #endif | 53 #endif |
54 | 54 |
55 #if !defined(OS_IOS) | 55 #if !defined(OS_IOS) |
56 #include <grp.h> | 56 #include <grp.h> |
57 #endif | 57 #endif |
58 | 58 |
| 59 // We need to do this on AIX due to some inconsistencies in how AIX |
| 60 // handles XOPEN_SOURCE and ALL_SOURCE. |
| 61 #if defined(OS_AIX) |
| 62 extern "C" char* mkdtemp(char* path); |
| 63 #endif |
| 64 |
59 namespace base { | 65 namespace base { |
60 | 66 |
61 namespace { | 67 namespace { |
62 | 68 |
63 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) | 69 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) |
64 static int CallStat(const char *path, stat_wrapper_t *sb) { | 70 static int CallStat(const char *path, stat_wrapper_t *sb) { |
65 ThreadRestrictions::AssertIOAllowed(); | 71 ThreadRestrictions::AssertIOAllowed(); |
66 return stat(path, sb); | 72 return stat(path, sb); |
67 } | 73 } |
68 static int CallLstat(const char *path, stat_wrapper_t *sb) { | 74 static int CallLstat(const char *path, stat_wrapper_t *sb) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 int CreateAndOpenFdForTemporaryFile(FilePath directory, FilePath* path) { | 155 int CreateAndOpenFdForTemporaryFile(FilePath directory, FilePath* path) { |
150 ThreadRestrictions::AssertIOAllowed(); // For call to mkstemp(). | 156 ThreadRestrictions::AssertIOAllowed(); // For call to mkstemp(). |
151 *path = directory.Append(base::TempFileName()); | 157 *path = directory.Append(base::TempFileName()); |
152 const std::string& tmpdir_string = path->value(); | 158 const std::string& tmpdir_string = path->value(); |
153 // this should be OK since mkstemp just replaces characters in place | 159 // this should be OK since mkstemp just replaces characters in place |
154 char* buffer = const_cast<char*>(tmpdir_string.c_str()); | 160 char* buffer = const_cast<char*>(tmpdir_string.c_str()); |
155 | 161 |
156 return HANDLE_EINTR(mkstemp(buffer)); | 162 return HANDLE_EINTR(mkstemp(buffer)); |
157 } | 163 } |
158 | 164 |
159 #if defined(OS_LINUX) | 165 #if defined(OS_LINUX) || defined(OS_AIX) |
160 // Determine if /dev/shm files can be mapped and then mprotect'd PROT_EXEC. | 166 // Determine if /dev/shm files can be mapped and then mprotect'd PROT_EXEC. |
161 // This depends on the mount options used for /dev/shm, which vary among | 167 // This depends on the mount options used for /dev/shm, which vary among |
162 // different Linux distributions and possibly local configuration. It also | 168 // different Linux distributions and possibly local configuration. It also |
163 // depends on details of kernel--ChromeOS uses the noexec option for /dev/shm | 169 // depends on details of kernel--ChromeOS uses the noexec option for /dev/shm |
164 // but its kernel allows mprotect with PROT_EXEC anyway. | 170 // but its kernel allows mprotect with PROT_EXEC anyway. |
165 bool DetermineDevShmExecutable() { | 171 bool DetermineDevShmExecutable() { |
166 bool result = false; | 172 bool result = false; |
167 FilePath path; | 173 FilePath path; |
168 | 174 |
169 ScopedFD fd(CreateAndOpenFdForTemporaryFile(FilePath("/dev/shm"), &path)); | 175 ScopedFD fd(CreateAndOpenFdForTemporaryFile(FilePath("/dev/shm"), &path)); |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 #endif // defined(OS_MACOSX) && !defined(OS_IOS) | 921 #endif // defined(OS_MACOSX) && !defined(OS_IOS) |
916 | 922 |
917 int GetMaximumPathComponentLength(const FilePath& path) { | 923 int GetMaximumPathComponentLength(const FilePath& path) { |
918 ThreadRestrictions::AssertIOAllowed(); | 924 ThreadRestrictions::AssertIOAllowed(); |
919 return pathconf(path.value().c_str(), _PC_NAME_MAX); | 925 return pathconf(path.value().c_str(), _PC_NAME_MAX); |
920 } | 926 } |
921 | 927 |
922 #if !defined(OS_ANDROID) | 928 #if !defined(OS_ANDROID) |
923 // This is implemented in file_util_android.cc for that platform. | 929 // This is implemented in file_util_android.cc for that platform. |
924 bool GetShmemTempDir(bool executable, FilePath* path) { | 930 bool GetShmemTempDir(bool executable, FilePath* path) { |
925 #if defined(OS_LINUX) | 931 #if defined(OS_LINUX) || defined(OS_AIX) |
926 bool use_dev_shm = true; | 932 bool use_dev_shm = true; |
927 if (executable) { | 933 if (executable) { |
928 static const bool s_dev_shm_executable = DetermineDevShmExecutable(); | 934 static const bool s_dev_shm_executable = DetermineDevShmExecutable(); |
929 use_dev_shm = s_dev_shm_executable; | 935 use_dev_shm = s_dev_shm_executable; |
930 } | 936 } |
931 if (use_dev_shm) { | 937 if (use_dev_shm) { |
932 *path = FilePath("/dev/shm"); | 938 *path = FilePath("/dev/shm"); |
933 return true; | 939 return true; |
934 } | 940 } |
935 #endif | 941 #endif |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 return false; | 1019 return false; |
1014 | 1020 |
1015 DeleteFile(from_path, true); | 1021 DeleteFile(from_path, true); |
1016 return true; | 1022 return true; |
1017 } | 1023 } |
1018 | 1024 |
1019 } // namespace internal | 1025 } // namespace internal |
1020 | 1026 |
1021 #endif // !defined(OS_NACL_NONSFI) | 1027 #endif // !defined(OS_NACL_NONSFI) |
1022 } // namespace base | 1028 } // namespace base |
OLD | NEW |