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 | 5357283c7a46ec51d74565f276215e135634307c (patch) | |
| tree | 29c283a1c91ac9a57cbe56451b407f438287edc4 | |
| parent | ce35f14050a9e2cfdc5a9d04ed49c73c9fb883ba (diff) | |
| download | bcm5719-llvm-5357283c7a46ec51d74565f276215e135634307c.tar.gz bcm5719-llvm-5357283c7a46ec51d74565f276215e135634307c.zip  | |
Added the MakeFileExecutable() method.  This method takes a filename and
gives it execute access while respecting the user's umask.
llvm-svn: 8324
| -rw-r--r-- | llvm/include/Support/FileUtilities.h | 15 | ||||
| -rw-r--r-- | llvm/lib/Support/FileUtilities.cpp | 50 | ||||
| -rw-r--r-- | llvm/support/lib/Support/FileUtilities.cpp | 50 | 
3 files changed, 115 insertions, 0 deletions
diff --git a/llvm/include/Support/FileUtilities.h b/llvm/include/Support/FileUtilities.h index 2c8eba39496..47704946c89 100644 --- a/llvm/include/Support/FileUtilities.h +++ b/llvm/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/llvm/lib/Support/FileUtilities.cpp b/llvm/lib/Support/FileUtilities.cpp index 3e4c270da56..01d7ca2126c 100644 --- a/llvm/lib/Support/FileUtilities.cpp +++ b/llvm/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/llvm/support/lib/Support/FileUtilities.cpp b/llvm/support/lib/Support/FileUtilities.cpp index 3e4c270da56..01d7ca2126c 100644 --- a/llvm/support/lib/Support/FileUtilities.cpp +++ b/llvm/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; +} +  | 

