mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-22 20:20:03 +00:00
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:
parent
fcdd82e4a9
commit
77cc91deaa
@ -391,6 +391,22 @@ namespace sys {
|
||||
StatusInfo info; getStatusInfo(info); return info.fileSize;
|
||||
}
|
||||
|
||||
/// This method attempts to make the file referenced by the Path object
|
||||
/// available for reading so that the readable() method will return true.
|
||||
/// @brief Make the file readable;
|
||||
void makeReadable();
|
||||
|
||||
/// This method attempts to make the file referenced by the Path object
|
||||
/// available for writing so that the writable() method will return true.
|
||||
/// @brief Make the file writable;
|
||||
void makeWriteable();
|
||||
|
||||
/// This method attempts to make the file referenced by the Path object
|
||||
/// available for execution so that the executable() method will return
|
||||
/// true.
|
||||
/// @brief Make the file readable;
|
||||
void makeExecutable();
|
||||
|
||||
/// This method attempts to set the Path object to \p unverified_path
|
||||
/// and interpret the name as a directory name. The \p unverified_path
|
||||
/// is verified. If verification succeeds then \p unverified_path
|
||||
|
@ -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())
|
||||
|
@ -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())
|
||||
|
@ -287,6 +287,15 @@ Path::getLast() const {
|
||||
return path.substr(pos+1);
|
||||
}
|
||||
|
||||
void Path::makeReadable() {
|
||||
}
|
||||
|
||||
void Path::makeWriteable() {
|
||||
}
|
||||
|
||||
void Path::makeExecutable() {
|
||||
}
|
||||
|
||||
bool
|
||||
Path::setDirectory(const std::string& a_path) {
|
||||
if (a_path.size() == 0)
|
||||
|
@ -287,6 +287,15 @@ Path::getLast() const {
|
||||
return path.substr(pos+1);
|
||||
}
|
||||
|
||||
void Path::makeReadable() {
|
||||
}
|
||||
|
||||
void Path::makeWriteable() {
|
||||
}
|
||||
|
||||
void Path::makeExecutable() {
|
||||
}
|
||||
|
||||
bool
|
||||
Path::setDirectory(const std::string& a_path) {
|
||||
if (a_path.size() == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user