Merge pull request #97719 from bruvzg/cross_dev_rename

[Linux/BSD] Fix cross-device rename.
This commit is contained in:
Rémi Verschelde 2024-10-04 11:21:58 +02:00
commit 6e03910578
No known key found for this signature in database
GPG key ID: C3336907360768E1

View file

@ -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) {