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

Side by Side Diff: base/file_util_posix.cc

Issue 1869: POSIX/Linux related changes to file_util.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 12 years, 3 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
« base/file_util_linux.cc ('K') | « base/file_util_linux.cc ('k') | 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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 <fcntl.h> 7 #include <fcntl.h>
8 #include <fnmatch.h> 8 #include <fnmatch.h>
9 #include <fts.h> 9 #include <fts.h>
10 #include <libgen.h> 10 #include <libgen.h>
11 #include <sys/errno.h> 11 #include <sys/errno.h>
12 #include <sys/stat.h> 12 #include <sys/stat.h>
13 #include <time.h> 13 #include <time.h>
14 14
15 #include <fstream> 15 #include <fstream>
16 16
17 #include "base/basictypes.h" 17 #include "base/basictypes.h"
18 #include "base/logging.h" 18 #include "base/logging.h"
19 #include "base/string_util.h" 19 #include "base/string_util.h"
20 20
21 namespace file_util { 21 namespace file_util {
22 22
23 static const wchar_t* kTempFileName = L"com.google.chrome.XXXXXX";
Dean McNamee 2008/09/12 13:59:46 Seems a waste to make this wide, just when we're g
24
23 std::wstring GetDirectoryFromPath(const std::wstring& path) { 25 std::wstring GetDirectoryFromPath(const std::wstring& path) {
24 if (EndsWithSeparator(path)) { 26 if (EndsWithSeparator(path)) {
25 std::wstring dir = path; 27 std::wstring dir = path;
26 TrimTrailingSeparator(&dir); 28 TrimTrailingSeparator(&dir);
27 return dir; 29 return dir;
28 } else { 30 } else {
29 char full_path[PATH_MAX]; 31 char full_path[PATH_MAX];
30 base::strlcpy(full_path, WideToUTF8(path).c_str(), arraysize(full_path)); 32 base::strlcpy(full_path, WideToUTF8(path).c_str(), arraysize(full_path));
31 return UTF8ToWide(dirname(full_path)); 33 return UTF8ToWide(dirname(full_path));
32 } 34 }
33 } 35 }
34 36
35 bool AbsolutePath(std::wstring* path) { 37 bool AbsolutePath(std::wstring* path) {
36 char full_path[PATH_MAX]; 38 char full_path[PATH_MAX];
37 if (realpath(WideToUTF8(*path).c_str(), full_path) == NULL) 39 if (realpath(WideToUTF8(*path).c_str(), full_path) == NULL)
38 return false; 40 return false;
39 *path = UTF8ToWide(full_path); 41 *path = UTF8ToWide(full_path);
40 return true; 42 return true;
41 } 43 }
42 44
43 // TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*" 45 // TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*"
44 // which works both with and without the recursive flag. I'm not sure we need 46 // which works both with and without the recursive flag. I'm not sure we need
45 // that functionality. If not, remove from file_util_win.cc, otherwise add it 47 // that functionality. If not, remove from file_util_win.cc, otherwise add it
46 // here. 48 // here.
47 bool Delete(const std::wstring& path, bool recursive) { 49 bool Delete(const std::wstring& path, bool recursive) {
48 const char* utf8_path = WideToUTF8(path).c_str(); 50 std::string utf8_path_string = WideToUTF8(path);
51 const char* utf8_path = utf8_path_string.c_str();
49 struct stat64 file_info; 52 struct stat64 file_info;
50 int test = stat64(utf8_path, &file_info); 53 int test = stat64(utf8_path, &file_info);
51 if (test != 0) { 54 if (test != 0) {
52 // The Windows version defines this condition as success. 55 // The Windows version defines this condition as success.
53 bool ret = (errno == ENOENT || errno == ENOTDIR); 56 bool ret = (errno == ENOENT || errno == ENOTDIR);
54 return ret; 57 return ret;
55 } 58 }
56 if (!S_ISDIR(file_info.st_mode)) 59 if (!S_ISDIR(file_info.st_mode))
57 return (unlink(utf8_path) == 0); 60 return (unlink(utf8_path) == 0);
58 if (!recursive) 61 if (!recursive)
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 139 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
137 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)); 140 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
138 return GetFileCreationLocalTimeFromHandle(file_handle.Get(), creation_time); 141 return GetFileCreationLocalTimeFromHandle(file_handle.Get(), creation_time);
139 } 142 }
140 #endif 143 #endif
141 144
142 bool CreateTemporaryFileName(std::wstring* temp_file) { 145 bool CreateTemporaryFileName(std::wstring* temp_file) {
143 std::wstring tmpdir; 146 std::wstring tmpdir;
144 if (!GetTempDir(&tmpdir)) 147 if (!GetTempDir(&tmpdir))
145 return false; 148 return false;
146 tmpdir.append(L"com.google.chrome.XXXXXX"); 149 AppendToPath(&tmpdir, kTempFileName);
147 // this should be OK since mktemp just replaces characters in place 150 std::string tmpdir_string = WideToUTF8(tmpdir);
148 char* buffer = const_cast<char*>(WideToUTF8(tmpdir).c_str()); 151 // this should be OK since mkstemp just replaces characters in place
149 *temp_file = UTF8ToWide(mktemp(buffer)); 152 char* buffer = const_cast<char*>(tmpdir_string.c_str());
150 int fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666); 153 int fd = mkstemp(buffer);
151 if (fd < 0) 154 if (fd < 0)
152 return false; 155 return false;
153 close(fd); 156 *temp_file = UTF8ToWide(buffer);
157 close(fd);
154 return true; 158 return true;
155 } 159 }
156 160
157 bool CreateNewTempDirectory(const std::wstring& prefix, 161 bool CreateNewTempDirectory(const std::wstring& prefix,
158 std::wstring* new_temp_path) { 162 std::wstring* new_temp_path) {
159 std::wstring tmpdir; 163 std::wstring tmpdir;
160 if (!GetTempDir(&tmpdir)) 164 if (!GetTempDir(&tmpdir))
161 return false; 165 return false;
162 tmpdir.append(L"/com.google.chrome.XXXXXX"); 166 AppendToPath(&tmpdir, kTempFileName);
167 std::string tmpdir_string = WideToUTF8(tmpdir);
163 // this should be OK since mkdtemp just replaces characters in place 168 // this should be OK since mkdtemp just replaces characters in place
164 char* buffer = const_cast<char*>(WideToUTF8(tmpdir).c_str()); 169 char* buffer = const_cast<char*>(tmpdir_string.c_str());
165 char* dtemp = mkdtemp(buffer); 170 char* dtemp = mkdtemp(buffer);
166 if (!dtemp) 171 if (!dtemp)
167 return false; 172 return false;
168 *new_temp_path = UTF8ToWide(dtemp); 173 *new_temp_path = UTF8ToWide(dtemp);
169 return true; 174 return true;
170 } 175 }
171 176
172 bool CreateDirectory(const std::wstring& full_path) { 177 bool CreateDirectory(const std::wstring& full_path) {
173 std::vector<std::wstring> components; 178 std::vector<std::wstring> components;
174 PathComponents(full_path, &components); 179 PathComponents(full_path, &components);
(...skipping 24 matching lines...) Expand all
199 int fd = open(WideToUTF8(filename).c_str(), O_RDONLY); 204 int fd = open(WideToUTF8(filename).c_str(), O_RDONLY);
200 if (fd < 0) 205 if (fd < 0)
201 return -1; 206 return -1;
202 207
203 int ret_value = read(fd, data, size); 208 int ret_value = read(fd, data, size);
204 close(fd); 209 close(fd);
205 return ret_value; 210 return ret_value;
206 } 211 }
207 212
208 int WriteFile(const std::wstring& filename, const char* data, int size) { 213 int WriteFile(const std::wstring& filename, const char* data, int size) {
209 int fd = open(WideToUTF8(filename).c_str(), O_WRONLY | O_CREAT | O_TRUNC, 214 int fd = creat(WideToUTF8(filename).c_str(), 0666);
210 0666);
211 if (fd < 0) 215 if (fd < 0)
212 return -1; 216 return -1;
213 217
214 int ret_value = write(fd, data, size); 218 // Allow for partial writes
219 ssize_t bytes_written_total = 0;
220 do {
221 ssize_t bytes_written_partial = write(fd,
222 data + bytes_written_total,
223 size - bytes_written_total);
224 if (bytes_written_partial < 0) {
225 close(fd);
226 return -1;
227 }
228 bytes_written_total += bytes_written_partial;
229 } while (bytes_written_total < size);
230
215 close(fd); 231 close(fd);
216 return ret_value; 232 return bytes_written_total;
217 } 233 }
218 234
219 // Gets the current working directory for the process. 235 // Gets the current working directory for the process.
220 bool GetCurrentDirectory(std::wstring* dir) { 236 bool GetCurrentDirectory(std::wstring* dir) {
221 char system_buffer[PATH_MAX] = ""; 237 char system_buffer[PATH_MAX] = "";
222 getcwd(system_buffer, sizeof(system_buffer)); 238 getcwd(system_buffer, sizeof(system_buffer));
223 *dir = UTF8ToWide(system_buffer); 239 *dir = UTF8ToWide(system_buffer);
224 return true; 240 return true;
225 } 241 }
226 242
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 return Next(); 310 return Next();
295 } 311 }
296 312
297 // Level 0 is the top, which is always skipped. 313 // Level 0 is the top, which is always skipped.
298 if (fts_ent->fts_level == 0) 314 if (fts_ent->fts_level == 0)
299 return Next(); 315 return Next();
300 316
301 // Patterns are only matched on the items in the top-most directory. 317 // Patterns are only matched on the items in the top-most directory.
302 // (see Windows implementation) 318 // (see Windows implementation)
303 if (fts_ent->fts_level == 1 && pattern_.length() > 0) { 319 if (fts_ent->fts_level == 1 && pattern_.length() > 0) {
304 const char* utf8_pattern = WideToUTF8(pattern_).c_str(); 320 if (fnmatch(WideToUTF8(pattern_).c_str(), fts_ent->fts_path, 0) != 0) {
305 if (fnmatch(utf8_pattern, fts_ent->fts_path, 0) != 0) {
306 if (fts_ent->fts_info == FTS_D) 321 if (fts_ent->fts_info == FTS_D)
307 fts_set(fts_, fts_ent, FTS_SKIP); 322 fts_set(fts_, fts_ent, FTS_SKIP);
308 return Next(); 323 return Next();
309 } 324 }
310 } 325 }
311 326
312 std::wstring cur_file(UTF8ToWide(fts_ent->fts_path)); 327 std::wstring cur_file(UTF8ToWide(fts_ent->fts_path));
313 if (fts_ent->fts_info == FTS_D) { 328 if (fts_ent->fts_info == FTS_D) {
314 // If not recursive, then prune children. 329 // If not recursive, then prune children.
315 if (!recursive_) 330 if (!recursive_)
316 fts_set(fts_, fts_ent, FTS_SKIP); 331 fts_set(fts_, fts_ent, FTS_SKIP);
317 return (file_type_ & FileEnumerator::DIRECTORIES) ? cur_file : Next(); 332 return (file_type_ & FileEnumerator::DIRECTORIES) ? cur_file : Next();
318 } else if (fts_ent->fts_info == FTS_F) { 333 } else if (fts_ent->fts_info == FTS_F) {
319 return (file_type_ & FileEnumerator::FILES) ? cur_file : Next(); 334 return (file_type_ & FileEnumerator::FILES) ? cur_file : Next();
320 } 335 }
321 // TODO(erikkay) - verify that the other fts_info types aren't interesting 336 // TODO(erikkay) - verify that the other fts_info types aren't interesting
322 return Next(); 337 return Next();
323 } 338 }
324 339
325 340
326 } // namespace file_util 341 } // namespace file_util
327 342
328 343
OLDNEW
« base/file_util_linux.cc ('K') | « base/file_util_linux.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698