For PR351:

Implement three new functions to allow setting access/permission bits on
the file referenced by a path. The makeReadable and makeExecutable methods
replace the FileUtilities MakeFileReadable and MakeFileExecutable
functions. The makeWritable function is new and provided for consistency
since Path has a writable() method.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18907 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer
2004-12-13 19:59:50 +00:00
parent fcdd82e4a9
commit 77cc91deaa
5 changed files with 106 additions and 0 deletions

View File

@@ -256,6 +256,42 @@ Path::getStatusInfo(StatusInfo& info) const {
path += '/';
}
static bool AddPermissionBits(const std::string& Filename, int bits) {
// Get the umask value from the operating system. We want to use it
// when changing the file's permissions. Since calling umask() sets
// the umask and returns its old value, we must call it a second
// time to reset it to the user's preference.
int mask = umask(0777); // The arg. to umask is arbitrary.
umask(mask); // Restore the umask.
// Get the file's current mode.
struct stat st;
if ((stat(Filename.c_str(), &st)) == -1)
return false;
// Change the file to have whichever permissions bits from 'bits'
// that the umask would not disable.
if ((chmod(Filename.c_str(), (st.st_mode | (bits & ~mask)))) == -1)
return false;
return true;
}
void Path::makeReadable() {
if (!AddPermissionBits(path,0444))
ThrowErrno(path + ": can't make file readable");
}
void Path::makeWriteable() {
if (!AddPermissionBits(path,0222))
ThrowErrno(path + ": can't make file writable");
}
void Path::makeExecutable() {
if (!AddPermissionBits(path,0111))
ThrowErrno(path + ": can't make file executable");
}
bool
Path::getDirectoryContents(std::set<Path>& result) const {
if (!isDirectory())