Index: base/file_util_posix.cc |
=================================================================== |
--- base/file_util_posix.cc (revision 7416) |
+++ base/file_util_posix.cc (working copy) |
@@ -85,7 +85,7 @@ |
continue; |
break; |
case FTS_DP: |
- rmdir(fts_ent->fts_accpath); |
+ success = (rmdir(fts_ent->fts_accpath) == 0); |
break; |
case FTS_D: |
break; |
@@ -93,7 +93,7 @@ |
case FTS_F: |
case FTS_SL: |
case FTS_SLNONE: |
- unlink(fts_ent->fts_accpath); |
+ success = (unlink(fts_ent->fts_accpath) == 0); |
break; |
default: |
DCHECK(false); |
@@ -215,6 +215,26 @@ |
return (stat64(path.value().c_str(), &file_info) == 0); |
} |
+bool PathIsWritable(const FilePath& path) { |
+ FilePath test_path(path); |
+ struct stat64 file_info; |
+ if (stat64(test_path.value().c_str(), &file_info) != 0) { |
+ // If the path doesn't exist, test the parent dir. |
+ test_path = test_path.DirName(); |
+ // If the parent dir doesn't exist, then return false (the path is not |
+ // directly writable). |
+ if (stat64(test_path.value().c_str(), &file_info) != 0) |
+ return false; |
+ } |
+ if (S_IWOTH & file_info.st_mode) |
+ return true; |
+ if (getegid() == file_info.st_gid && (S_IWGRP & file_info.st_mode)) |
+ return true; |
+ if (geteuid() == file_info.st_uid && (S_IWUSR & file_info.st_mode)) |
+ return true; |
+ return false; |
+} |
+ |
bool DirectoryExists(const FilePath& path) { |
struct stat64 file_info; |
if (stat64(path.value().c_str(), &file_info) == 0) |
@@ -274,8 +294,8 @@ |
return false; |
} |
-bool CreateNewTempDirectory(const std::wstring& prefix, |
- std::wstring* new_temp_path) { |
+bool CreateNewTempDirectory(const FilePath::StringType& prefix, |
+ FilePath* new_temp_path) { |
FilePath tmpdir; |
if (!GetTempDir(&tmpdir)) |
return false; |
@@ -286,7 +306,7 @@ |
char* dtemp = mkdtemp(buffer); |
if (!dtemp) |
return false; |
- *new_temp_path = UTF8ToWide(dtemp); |
+ *new_temp_path = FilePath(dtemp); |
return true; |
} |