summaryrefslogtreecommitdiffstats
path: root/Source/kwsys/SystemTools.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/kwsys/SystemTools.cxx')
-rw-r--r--Source/kwsys/SystemTools.cxx45
1 files changed, 45 insertions, 0 deletions
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)