diff options
author | Anas Nashif <anas.nashif@intel.com> | 2013-08-13 07:48:01 -0400 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2013-08-13 07:48:01 -0400 |
commit | 297c63fa65327491a2b50e521b661c5835a19fe4 (patch) | |
tree | cf30d58014e240eb5e4417727d8f137cdbe75828 /Source/cmSystemTools.cxx | |
parent | ef8aa19c33e83ff019595fd7f8fdc29c35c336a3 (diff) | |
download | cmake-297c63fa65327491a2b50e521b661c5835a19fe4.tar.gz cmake-297c63fa65327491a2b50e521b661c5835a19fe4.tar.bz2 cmake-297c63fa65327491a2b50e521b661c5835a19fe4.zip |
Imported Upstream version 2.8.11.2upstream/2.8.11.2sandbox/pcoval/previous/upstream
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r-- | Source/cmSystemTools.cxx | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 544f7e43e..67f302391 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -52,7 +52,6 @@ #endif #if defined(CMAKE_BUILD_WITH_CMAKE) -# include <memory> // auto_ptr # include <fcntl.h> # include "cmCryptoHash.h" #endif @@ -204,13 +203,13 @@ std::string cmSystemTools::EscapeQuotes(const char* str) std::string cmSystemTools::TrimWhitespace(const std::string& s) { std::string::const_iterator start = s.begin(); - while(start != s.end() && *start == ' ') + while(start != s.end() && *start <= ' ') ++start; if (start == s.end()) return ""; std::string::const_iterator stop = s.end()-1; - while(*stop == ' ') + while(*stop <= ' ') --stop; return std::string(start, stop+1); } @@ -1181,46 +1180,35 @@ bool cmSystemTools::CopyFileIfDifferent(const char* source, bool cmSystemTools::RenameFile(const char* oldname, const char* newname) { #ifdef _WIN32 - /* On Windows the move functions will not replace existing files. - Check if the destination exists. */ - struct stat newFile; - if(stat(newname, &newFile) == 0) +# ifndef INVALID_FILE_ATTRIBUTES +# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +# endif + /* Windows MoveFileEx may not replace read-only or in-use files. If it + fails then remove the read-only attribute from any existing destination. + Try multiple times since we may be racing against another process + creating/opening the destination file just before our MoveFileEx. */ + int tries = 5; + while(!MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING) && --tries) { - /* The destination exists. We have to replace it carefully. The - MoveFileEx function does what we need but is not available on - Win9x. */ - OSVERSIONINFO osv; - DWORD attrs; - - /* Make sure the destination is not read only. */ - attrs = GetFileAttributes(newname); - if(attrs & FILE_ATTRIBUTE_READONLY) + // Try again only if failure was due to access permissions. + if(GetLastError() != ERROR_ACCESS_DENIED) { - SetFileAttributes(newname, attrs & ~FILE_ATTRIBUTE_READONLY); + return false; } - - /* Check the windows version number. */ - osv.dwOSVersionInfoSize = sizeof(osv); - GetVersionEx(&osv); - if(osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + DWORD attrs = GetFileAttributes(newname); + if((attrs != INVALID_FILE_ATTRIBUTES) && + (attrs & FILE_ATTRIBUTE_READONLY)) { - /* This is Win9x. There is no MoveFileEx implementation. We - cannot quite rename the file atomically. Just delete the - destination and then move the file. */ - DeleteFile(newname); - return MoveFile(oldname, newname) != 0; + // Remove the read-only attribute from the destination file. + SetFileAttributes(newname, attrs & ~FILE_ATTRIBUTE_READONLY); } else { - /* This is not Win9x. Use the MoveFileEx implementation. */ - return MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING) != 0; + // The file may be temporarily in use so wait a bit. + cmSystemTools::Delay(100); } } - else - { - /* The destination does not exist. Just move the file. */ - return MoveFile(oldname, newname) != 0; - } + return tries > 0; #else /* On UNIX we have an OS-provided call to do this atomically. */ return rename(oldname, newname) == 0; |