summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2004-09-29 16:20:52 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2004-09-29 16:20:52 (GMT)
commit3fc7dc5e70cd444731dd3adcc4599f9750e4936c (patch)
tree99f891a85d30981fa83a68c09ab33922356ec2fc /Source
parentcf8d34040e66e2ffb13b4f6598024b38e298633d (diff)
downloadCMake-3fc7dc5e70cd444731dd3adcc4599f9750e4936c.zip
CMake-3fc7dc5e70cd444731dd3adcc4599f9750e4936c.tar.gz
CMake-3fc7dc5e70cd444731dd3adcc4599f9750e4936c.tar.bz2
ENH: Move permissions code to kwsys so that copyfile can use it. Fixes Bug #1133 - cmake -E copy file dir sets the wrong permissions on the destination directory
Diffstat (limited to 'Source')
-rw-r--r--Source/cmSystemTools.cxx43
-rw-r--r--Source/cmSystemTools.h5
-rw-r--r--Source/kwsys/SystemTools.cxx45
-rw-r--r--Source/kwsys/SystemTools.hxx.in9
4 files changed, 56 insertions, 46 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 379898e..5eef488 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 0cac0f0..ad2fe43 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -20,7 +20,6 @@
#include "cmStandardIncludes.h"
#include <cmsys/SystemTools.hxx>
-#include <sys/types.h>
/** \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 f909312..f08a50f 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 02caf2a..2c253dc 100644
--- a/Source/kwsys/SystemTools.hxx.in
+++ b/Source/kwsys/SystemTools.hxx.in
@@ -20,6 +20,8 @@
#include <@KWSYS_NAMESPACE@/Configure.h>
+#include <sys/types.h>
+
/* 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@