From 45ff34f6c397f9a154d6b4acf8bfa8d13028f5da Mon Sep 17 00:00:00 2001 From: Unrud Date: Tue, 1 Feb 2022 11:28:33 +0100 Subject: [PATCH] Fallback if RENAME_EXCHANGE not supported by fs Fixes #1213 --- radicale/pathutils.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/radicale/pathutils.py b/radicale/pathutils.py index 5e87fa16..f8242380 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: