Merge topic 'file-WRITE-chmod'

bdd0174df1 file(WRITE): Avoid toggling permissions between 644 and 664

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2246
This commit is contained in:
Brad King
2018-08-06 11:55:16 +00:00
committed by Kitware Robot
2 changed files with 18 additions and 10 deletions

View File

@@ -208,16 +208,20 @@ bool cmFileCommand::HandleWriteCommand(std::vector<std::string> const& args,
cmSystemTools::MakeDirectory(dir);
mode_t mode = 0;
bool writable = false;
// Set permissions to writable
if (cmSystemTools::GetPermissions(fileName.c_str(), mode)) {
cmSystemTools::SetPermissions(fileName.c_str(),
#if defined(_MSC_VER) || defined(__MINGW32__)
mode | S_IWRITE
writable = mode & S_IWRITE;
mode_t newMode = mode | S_IWRITE;
#else
mode | S_IWUSR | S_IWGRP
writable = mode & S_IWUSR;
mode_t newMode = mode | S_IWUSR | S_IWGRP;
#endif
);
if (!writable) {
cmSystemTools::SetPermissions(fileName.c_str(), newMode);
}
}
// If GetPermissions fails, pretend like it is ok. File open will fail if
// the file is not writable
@@ -242,7 +246,7 @@ bool cmFileCommand::HandleWriteCommand(std::vector<std::string> const& args,
return false;
}
file.close();
if (mode) {
if (mode && !writable) {
cmSystemTools::SetPermissions(fileName.c_str(), mode);
}
return true;

View File

@@ -45,16 +45,20 @@ bool cmWriteFileCommand::InitialPass(std::vector<std::string> const& args,
cmSystemTools::MakeDirectory(dir);
mode_t mode = 0;
bool writable = false;
// Set permissions to writable
if (cmSystemTools::GetPermissions(fileName.c_str(), mode)) {
cmSystemTools::SetPermissions(fileName.c_str(),
#if defined(_MSC_VER) || defined(__MINGW32__)
mode | S_IWRITE
writable = mode & S_IWRITE;
mode_t newMode = mode | S_IWRITE;
#else
mode | S_IWUSR | S_IWGRP
writable = mode & S_IWUSR;
mode_t newMode = mode | S_IWUSR | S_IWGRP;
#endif
);
if (!writable) {
cmSystemTools::SetPermissions(fileName.c_str(), newMode);
}
}
// If GetPermissions fails, pretend like it is ok. File open will fail if
// the file is not writable
@@ -69,7 +73,7 @@ bool cmWriteFileCommand::InitialPass(std::vector<std::string> const& args,
}
file << message << std::endl;
file.close();
if (mode) {
if (mode && !writable) {
cmSystemTools::SetPermissions(fileName.c_str(), mode);
}