Support replacing files in rename for better compatibility with POSIX (#483)

This commit is contained in:
Aly Cerruti 2021-04-16 14:01:40 -07:00 committed by GitHub
parent 2a9f86fcbc
commit 1f4669fa4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -980,12 +980,29 @@ archive_rename(struct _reent *r,
}
rc = FSUSER_RenameFile(sourceDevice->archive, fs_path_old, sourceDevice->archive, fs_path_new);
if(R_SUCCEEDED(rc))
return 0;
/* if the file at the target destination exists, overwrite it */
if(R_FAILED(rc) && R_DESCRIPTION(rc) == RD_ALREADY_EXISTS) {
rc = FSUSER_DeleteFile(sourceDevice->archive, fs_path_new);
if(R_FAILED(rc)) {
r->_errno = archive_translate_error(rc);
return -1;
}
rc = FSUSER_RenameFile(sourceDevice->archive, fs_path_old, sourceDevice->archive, fs_path_new);
if(R_SUCCEEDED(rc)) return 0;
} else if(R_SUCCEEDED(rc)) return 0;
rc = FSUSER_RenameDirectory(sourceDevice->archive, fs_path_old, sourceDevice->archive, fs_path_new);
if(R_SUCCEEDED(rc))
return 0;
/* if the directory at the target destination exists, overwrite it */
if(R_FAILED(rc) && R_DESCRIPTION(rc) == RD_ALREADY_EXISTS) {
/* only overwrite empty directories */
rc = FSUSER_DeleteDirectory(sourceDevice-> archive, fs_path_new);
if(R_FAILED(rc)) {
r->_errno = archive_translate_error(rc);
return -1;
}
rc = FSUSER_RenameDirectory(sourceDevice->archive, fs_path_old, sourceDevice->archive, fs_path_new);
if(R_SUCCEEDED(rc)) return 0;
} else if(R_SUCCEEDED(rc)) return 0;
r->_errno = archive_translate_error(rc);
return -1;