Index: base/file_util_posix.cc |
diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc |
index e3bab95dd8e32554c81d8b41466909e5406e0027..04a111ea47a99fea370706c72e53e37d401787ef 100644 |
--- a/base/file_util_posix.cc |
+++ b/base/file_util_posix.cc |
@@ -457,6 +457,40 @@ bool ReadSymbolicLink(const FilePath& symlink_path, |
return true; |
} |
+bool GetPosixFilePermissions(const FilePath& path, int* mode) { |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ DCHECK(mode); |
+ |
+ stat_wrapper_t file_info; |
+ // Uses stat(), because on symbolic link, lstat() does not return valid |
+ // permission bits in st_mode |
+ if (CallStat(path.value().c_str(), &file_info) != 0) |
+ return false; |
+ |
+ *mode = file_info.st_mode & FILE_PERMISSION_MASK; |
+ return true; |
+} |
+ |
+bool SetPosixFilePermissions(const FilePath& path, |
+ int mode) { |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ DCHECK((mode & ~FILE_PERMISSION_MASK) == 0); |
+ |
+ // Calls stat() so that we can preserve the higher bits like S_ISGID. |
+ stat_wrapper_t stat_buf; |
+ if (CallStat(path.value().c_str(), &stat_buf) != 0) |
+ return false; |
+ |
+ // Clears the existing permission bits, and adds the new ones. |
+ mode_t updated_mode_bits = stat_buf.st_mode & ~FILE_PERMISSION_MASK; |
+ updated_mode_bits |= mode & FILE_PERMISSION_MASK; |
+ |
+ if (HANDLE_EINTR(chmod(path.value().c_str(), updated_mode_bits)) != 0) |
+ return false; |
+ |
+ return true; |
+} |
+ |
// Creates and opens a temporary file in |directory|, returning the |
// file descriptor. |path| is set to the temporary file path. |
// This function does NOT unlink() the file. |