From 77cc91deaaa06913047869726d9d2890f951aba7 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Mon, 13 Dec 2004 19:59:50 +0000 Subject: [PATCH] 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 --- include/llvm/System/Path.h | 16 ++++++++++++++++ lib/System/Unix/Path.cpp | 36 ++++++++++++++++++++++++++++++++++++ lib/System/Unix/Path.inc | 36 ++++++++++++++++++++++++++++++++++++ lib/System/Win32/Path.cpp | 9 +++++++++ lib/System/Win32/Path.inc | 9 +++++++++ 5 files changed, 106 insertions(+) diff --git a/include/llvm/System/Path.h b/include/llvm/System/Path.h index 57cbc6c64d9..3731a9c7a31 100644 --- a/include/llvm/System/Path.h +++ b/include/llvm/System/Path.h @@ -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 diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp index 6e07427608d..6733f03e441 100644 --- a/lib/System/Unix/Path.cpp +++ b/lib/System/Unix/Path.cpp @@ -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& result) const { if (!isDirectory()) diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index 6e07427608d..6733f03e441 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -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& result) const { if (!isDirectory()) diff --git a/lib/System/Win32/Path.cpp b/lib/System/Win32/Path.cpp index e847154e583..43d553bbd99 100644 --- a/lib/System/Win32/Path.cpp +++ b/lib/System/Win32/Path.cpp @@ -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) diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc index e847154e583..43d553bbd99 100644 --- a/lib/System/Win32/Path.inc +++ b/lib/System/Win32/Path.inc @@ -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)