diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 379898e11..5eef48879 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -858,19 +858,13 @@ bool cmSystemTools::DoesFileExistWithExtensions( bool cmSystemTools::cmCopyFile(const char* source, const char* destination) { - mode_t perm = 0; - return cmSystemTools::GetPermissions(source, perm) && - Superclass::CopyFileAlways(source, destination) && - cmSystemTools::SetPermissions(destination, perm); + return Superclass::CopyFileAlways(source, destination); } bool cmSystemTools::CopyFileIfDifferent(const char* source, const char* destination) { - mode_t perm = 0; - return cmSystemTools::GetPermissions(source, perm) && - Superclass::CopyFileIfDifferent(source, destination) && - cmSystemTools::SetPermissions(destination, perm); + return Superclass::CopyFileIfDifferent(source, destination); } void cmSystemTools::Glob(const char *directory, const char *regexp, @@ -1283,36 +1277,3 @@ bool cmSystemTools::PutEnv(const char* value) return ret == 0; } -bool cmSystemTools::GetPermissions(const char* file, mode_t& mode) -{ - if ( !file ) - { - return false; - } - - struct stat st; - if ( stat(file, &st) < 0 ) - { - return false; - } - mode = st.st_mode; - return true; -} - -bool cmSystemTools::SetPermissions(const char* file, mode_t mode) -{ - if ( !file ) - { - return false; - } - if ( !cmSystemTools::FileExists(file) ) - { - return false; - } - if ( chmod(file, mode) < 0 ) - { - return false; - } - - return true; -} diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 0cac0f077..ad2fe43d6 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -20,7 +20,6 @@ #include "cmStandardIncludes.h" #include -#include /** \class cmSystemTools * \brief A collection of useful functions for CMake. @@ -278,10 +277,6 @@ public: of the form var=value */ static bool PutEnv(const char* value); - ///! Get permissions of the file - static bool GetPermissions(const char* file, mode_t& mode); - static bool SetPermissions(const char* file, mode_t mode); - private: static bool s_ForceUnixPaths; static bool s_RunCommandHideConsole; diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index f909312a6..f08a50ff9 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -930,6 +930,10 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination) { return true; } + + mode_t perm = 0; + bool perms = SystemTools::GetPermissions(source, perm); + const int bufferSize = 4096; char buffer[bufferSize]; @@ -1022,6 +1026,13 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination) { return false; } + if ( perms ) + { + if ( !SystemTools::SetPermissions(destination, perm) ) + { + return false; + } + } return true; } @@ -1886,6 +1897,40 @@ int SystemTools::GetTerminalWidth() #endif return width; } + +bool SystemTools::GetPermissions(const char* file, mode_t& mode) +{ + if ( !file ) + { + return false; + } + + struct stat st; + if ( stat(file, &st) < 0 ) + { + return false; + } + mode = st.st_mode; + return true; +} + +bool SystemTools::SetPermissions(const char* file, mode_t mode) +{ + if ( !file ) + { + return false; + } + if ( !SystemTools::FileExists(file) ) + { + return false; + } + if ( chmod(file, mode) < 0 ) + { + return false; + } + + return true; +} } // namespace KWSYS_NAMESPACE #if defined(_MSC_VER) && defined(_DEBUG) diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in index 02caf2a1c..2c253dc49 100644 --- a/Source/kwsys/SystemTools.hxx.in +++ b/Source/kwsys/SystemTools.hxx.in @@ -20,6 +20,8 @@ #include <@KWSYS_NAMESPACE@/Configure.h> +#include + /* Define these macros temporarily to keep the code readable. */ #if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS # define kwsys_stl @KWSYS_NAMESPACE@_stl @@ -284,6 +286,12 @@ public: */ static int GetTerminalWidth(); + /** + * Get and set permissions of the file. + */ + static bool GetPermissions(const char* file, mode_t& mode); + static bool SetPermissions(const char* file, mode_t mode); + protected: // these two functions can be called from ConvertToOutputPath /** @@ -299,6 +307,7 @@ protected: * if there are spaces in the string it is double quoted. */ static kwsys_stl::string ConvertToWindowsOutputPath(const char*); + }; } // namespace @KWSYS_NAMESPACE@