diff options
author | Vasil Dimov <vd@FreeBSD.org> | 2020-03-14 20:58:55 +0100 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2022-02-10 08:16:05 +0000 |
commit | ee822d85d6de7db85416190cf843ad74147519cf (patch) | |
tree | a51d0bf0c2d02e9eec85e38c9ef81c40eb0f87cc /src/util | |
parent | 243a9c39250dee95b6fe62ac5ae2f8e3eafecf1b (diff) |
util: use stronger-guarantee rename method
Use std::filesystem::rename() instead of std::rename(). We rely on the
destination to be overwritten if it exists, but std::rename()'s behavior
is implementation-defined in this case.
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/system.cpp | 11 | ||||
-rw-r--r-- | src/util/system.h | 6 |
2 files changed, 10 insertions, 7 deletions
diff --git a/src/util/system.cpp b/src/util/system.cpp index 64d8ef38f0..5cef2be07a 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -74,6 +74,7 @@ #include <memory> #include <optional> #include <string> +#include <system_error> #include <thread> #include <typeinfo> @@ -1061,13 +1062,9 @@ void ArgsManager::LogArgs() const bool RenameOver(fs::path src, fs::path dest) { -#ifdef WIN32 - return MoveFileExW(src.wstring().c_str(), dest.wstring().c_str(), - MOVEFILE_REPLACE_EXISTING) != 0; -#else - int rc = std::rename(src.c_str(), dest.c_str()); - return (rc == 0); -#endif /* WIN32 */ + std::error_code error; + fs::rename(src, dest, error); + return !error; } /** diff --git a/src/util/system.h b/src/util/system.h index 6b7bd38cc2..a72ba3f3ed 100644 --- a/src/util/system.h +++ b/src/util/system.h @@ -69,7 +69,13 @@ void DirectoryCommit(const fs::path &dirname); bool TruncateFile(FILE *file, unsigned int length); int RaiseFileDescriptorLimit(int nMinFD); void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length); + +/** + * Rename src to dest. + * @return true if the rename was successful. + */ [[nodiscard]] bool RenameOver(fs::path src, fs::path dest); + bool LockDirectory(const fs::path& directory, const std::string lockfile_name, bool probe_only=false); void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name); bool DirIsWritable(const fs::path& directory); |