diff --git a/radicale/pathutils.py b/radicale/pathutils.py index 5e87fa1..f824238 100644 --- a/radicale/pathutils.py +++ b/radicale/pathutils.py @@ -21,6 +21,7 @@ Helper functions for working with the file system. """ +import errno import os import posixpath import sys @@ -178,19 +179,21 @@ def rename_exchange(src: str, dst: str) -> None: try: if renameat2(src_dir_fd, src_base_bytes, dst_dir_fd, dst_base_bytes, - RENAME_EXCHANGE) != 0: - errno = ctypes.get_errno() - raise OSError(errno, os.strerror(errno)) + RENAME_EXCHANGE) == 0: + return + errno_ = ctypes.get_errno() + # Fallback if RENAME_EXCHANGE not supported by filesystem + if errno_ != errno.EINVAL: + raise OSError(errno_, os.strerror(errno_)) finally: os.close(dst_dir_fd) finally: os.close(src_dir_fd) - else: - with TemporaryDirectory(prefix=".Radicale.tmp-", dir=src_dir - ) as tmp_dir: - os.rename(dst, os.path.join(tmp_dir, "interim")) - os.rename(src, dst) - os.rename(os.path.join(tmp_dir, "interim"), src) + with TemporaryDirectory(prefix=".Radicale.tmp-", dir=src_dir + ) as tmp_dir: + os.rename(dst, os.path.join(tmp_dir, "interim")) + os.rename(src, dst) + os.rename(os.path.join(tmp_dir, "interim"), src) def fsync(fd: int) -> None: