summaryrefslogtreecommitdiffstats
path: root/drivers/unix/dir_access_unix.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-10-04 11:21:58 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-10-04 11:21:58 +0200
commit6e03910578f240b465f5e56952eb5694dc513787 (patch)
tree507854b44d39cb3c4134038660a52130b455d3d5 /drivers/unix/dir_access_unix.cpp
parentdedb2ff21772c27add308b4bfbf5baeddd97de6f (diff)
parent4cc9d2f4376adc6e07129ff133f7665c0f5e749a (diff)
downloadredot-engine-6e03910578f240b465f5e56952eb5694dc513787.tar.gz
Merge pull request #97719 from bruvzg/cross_dev_rename
[Linux/BSD] Fix cross-device rename.
Diffstat (limited to 'drivers/unix/dir_access_unix.cpp')
-rw-r--r--drivers/unix/dir_access_unix.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp
index e4bad88083..816ffd7a32 100644
--- a/drivers/unix/dir_access_unix.cpp
+++ b/drivers/unix/dir_access_unix.cpp
@@ -410,7 +410,17 @@ Error DirAccessUnix::rename(String p_path, String p_new_path) {
p_new_path = p_new_path.left(-1);
}
- return ::rename(p_path.utf8().get_data(), p_new_path.utf8().get_data()) == 0 ? OK : FAILED;
+ int res = ::rename(p_path.utf8().get_data(), p_new_path.utf8().get_data());
+ if (res != 0 && errno == EXDEV) { // Cross-device move, use copy and remove.
+ Error err = OK;
+ err = copy(p_path, p_new_path);
+ if (err != OK) {
+ return err;
+ }
+ return remove(p_path);
+ } else {
+ return (res == 0) ? OK : FAILED;
+ }
}
Error DirAccessUnix::remove(String p_path) {