OSDN Git Service

workaround rename() and renameat2() limitation from QFileSystemEngine::renameFile()
authorIvailo Monev <xakepa10@gmail.com>
Mon, 31 Oct 2022 00:35:57 +0000 (02:35 +0200)
committerIvailo Monev <xakepa10@gmail.com>
Mon, 31 Oct 2022 00:35:57 +0000 (02:35 +0200)
already done in kdelibs mostly for temporary files, for reference:
https://osdn.net/projects/kde/scm/git/kdelibs/commits/4ff227e3367cb5d14b47d87b3c26582b4f2e691c

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/core/io/qfilesystemengine_unix.cpp

index 0981f4c..f2c9e4a 100644 (file)
@@ -378,8 +378,33 @@ bool QFileSystemEngine::renameFile(const QFileSystemEntry &source, const QFileSy
     if (::rename(spath.constData(), tpath.constData()) == 0)
         return true;
 #endif
+#ifdef EXDEV
+    // NOTE: rename() does not support cross-filesystem move so that is emulated
+    const int savederrno = errno;
+    if (errno == EXDEV) {
+        QT_STATBUF statbuf;
+        if (QT_STAT(tpath.constData(), &statbuf) == 0
+            && ::unlink(tpath.constData()) == -1) {
+            *error = EXDEV;
+            return false;
+        }
+        int dummy = 0;
+        if (copyFile(source, target, &dummy) == false) {
+            *error = EXDEV;
+            return false;
+        }
+        if (::unlink(spath.constData()) == -1) {
+            *error = EXDEV;
+            return false;
+        }
+        return true;
+    }
+    *error = savederrno;
+    return false;
+#else
     *error = errno;
     return false;
+#endif // EXDEV
 }
 
 //static