diff options
author | John Criswell <criswell@uiuc.edu> | 2003-09-02 20:14:57 +0000 |
---|---|---|
committer | John Criswell <criswell@uiuc.edu> | 2003-09-02 20:14:57 +0000 |
commit | 6991a03753db092e2e5b269ebdc898ff5cfc43a8 (patch) | |
tree | 1d841e5d57190b10e9eefffacea49b225549f122 | |
parent | de73193f3e42d7aa80429588b69b8d447beb0c9f (diff) |
Added the MakeFileExecutable() method. This method takes a filename and
gives it execute access while respecting the user's umask.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8324 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/Support/FileUtilities.h | 15 | ||||
-rw-r--r-- | include/llvm/Support/FileUtilities.h | 15 | ||||
-rw-r--r-- | lib/Support/FileUtilities.cpp | 50 | ||||
-rw-r--r-- | support/lib/Support/FileUtilities.cpp | 50 |
4 files changed, 130 insertions, 0 deletions
diff --git a/include/Support/FileUtilities.h b/include/Support/FileUtilities.h index 2c8eba3949..47704946c8 100644 --- a/include/Support/FileUtilities.h +++ b/include/Support/FileUtilities.h @@ -36,4 +36,19 @@ void removeFile(const std::string &Filename); /// std::string getUniqueFilename(const std::string &FilenameBase); +/// +/// Method: MakeFileExecutable() +/// +/// Description: +/// This method turns on whatever access attributes are needed to make the +/// specified file executable. +/// +/// Return value: +/// True - The operation succeeded. +/// False - The operation failed. +/// +/// Notes: +/// In case of failure, the file's access attributes are unspecified. +/// +bool MakeFileExecutable (const std::string & Filename); #endif diff --git a/include/llvm/Support/FileUtilities.h b/include/llvm/Support/FileUtilities.h index 2c8eba3949..47704946c8 100644 --- a/include/llvm/Support/FileUtilities.h +++ b/include/llvm/Support/FileUtilities.h @@ -36,4 +36,19 @@ void removeFile(const std::string &Filename); /// std::string getUniqueFilename(const std::string &FilenameBase); +/// +/// Method: MakeFileExecutable() +/// +/// Description: +/// This method turns on whatever access attributes are needed to make the +/// specified file executable. +/// +/// Return value: +/// True - The operation succeeded. +/// False - The operation failed. +/// +/// Notes: +/// In case of failure, the file's access attributes are unspecified. +/// +bool MakeFileExecutable (const std::string & Filename); #endif diff --git a/lib/Support/FileUtilities.cpp b/lib/Support/FileUtilities.cpp index 3e4c270da5..01d7ca2126 100644 --- a/lib/Support/FileUtilities.cpp +++ b/lib/Support/FileUtilities.cpp @@ -7,6 +7,8 @@ #include "Support/FileUtilities.h" #include "Config/unistd.h" +#include "Config/sys/stat.h" +#include "Config/sys/types.h" #include <fstream> #include <iostream> #include <cstdio> @@ -90,3 +92,51 @@ std::string getUniqueFilename(const std::string &FilenameBase) { delete[] FNBuffer; return Result; } + +/// +/// Method: MakeFileExecutable () +/// +/// Description: +/// This method makes the specified filename executable by giving it +/// execute permission. +/// +/// For the UNIX version of this method, we turn on all of the read and +/// execute bits and then turn off anything specified in the umask. This +/// should help ensure that access to the file remains at the level that +/// the user desires. +/// +bool +MakeFileExecutable (const std::string & Filename) +{ + // Permissions masking value of the user + mode_t mask; + + // Permissions currently enabled on the file + struct stat fstat; + + // + // Grab the umask value from the operating system. We want to use it when + // changing the file's permissions. + // + // Note: + // Umask() is one of those annoying system calls. You have to call it + // to get the current value and then set it back. + // + mask = umask (0x777); + umask (mask); + + // + // Go fetch the file's current permission bits. We want to *add* execute + // access to the file. + // + if ((stat (Filename.c_str(), &fstat)) == -1) + { + return false; + } + + // Make the script executable... + chmod(Filename.c_str(), (fstat.st_mode | (0111 & ~mask))); + + return true; +} + diff --git a/support/lib/Support/FileUtilities.cpp b/support/lib/Support/FileUtilities.cpp index 3e4c270da5..01d7ca2126 100644 --- a/support/lib/Support/FileUtilities.cpp +++ b/support/lib/Support/FileUtilities.cpp @@ -7,6 +7,8 @@ #include "Support/FileUtilities.h" #include "Config/unistd.h" +#include "Config/sys/stat.h" +#include "Config/sys/types.h" #include <fstream> #include <iostream> #include <cstdio> @@ -90,3 +92,51 @@ std::string getUniqueFilename(const std::string &FilenameBase) { delete[] FNBuffer; return Result; } + +/// +/// Method: MakeFileExecutable () +/// +/// Description: +/// This method makes the specified filename executable by giving it +/// execute permission. +/// +/// For the UNIX version of this method, we turn on all of the read and +/// execute bits and then turn off anything specified in the umask. This +/// should help ensure that access to the file remains at the level that +/// the user desires. +/// +bool +MakeFileExecutable (const std::string & Filename) +{ + // Permissions masking value of the user + mode_t mask; + + // Permissions currently enabled on the file + struct stat fstat; + + // + // Grab the umask value from the operating system. We want to use it when + // changing the file's permissions. + // + // Note: + // Umask() is one of those annoying system calls. You have to call it + // to get the current value and then set it back. + // + mask = umask (0x777); + umask (mask); + + // + // Go fetch the file's current permission bits. We want to *add* execute + // access to the file. + // + if ((stat (Filename.c_str(), &fstat)) == -1) + { + return false; + } + + // Make the script executable... + chmod(Filename.c_str(), (fstat.st_mode | (0111 & ~mask))); + + return true; +} + |