- if (do_rename(fnametmp,fname) != 0) {
- if (errno == EXDEV) {
- /* rename failed on cross-filesystem link.
- Copy the file instead. */
- if (copy_file(fnametmp,fname, file->mode & INITACCESSPERMS)) {
- rprintf(FERROR,"copy %s -> %s : %s\n",
- fnametmp,fname,strerror(errno));
- } else {
- set_perms(fname,file,NULL,0);
- }
- do_unlink(fnametmp);
- } else {
- rprintf(FERROR,"rename %s -> %s : %s\n",
- fnametmp,fname,strerror(errno));
- do_unlink(fnametmp);
- }
- } else {
- set_perms(fname,file,NULL,0);
+ if (verbose > 2)
+ rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname);
+ ret = robust_rename(fnametmp, fname, partialptr,
+ file->mode & INITACCESSPERMS);
+ if (ret < 0) {
+ rsyserr(FERROR, errno, "%s %s -> \"%s\"",
+ ret == -2 ? "copy" : "rename",
+ full_fname(fnametmp), fname);
+ do_unlink(fnametmp);
+ return;
+ }
+ if (ret == 0) {
+ /* The file was moved into place (not copied), so it's done. */
+ return;
+ }
+ /* The file was copied, so tweak the perms of the copied file. If it
+ * was copied to partialptr, move it into its final destination. */
+ fnametmp = partialptr ? partialptr : fname;
+
+ do_set_file_attrs:
+ set_file_attrs(fnametmp, file, NULL,
+ ok_to_set_time ? 0 : ATTRS_SKIP_MTIME);
+
+ if (partialptr) {
+ if (do_rename(fnametmp, fname) < 0) {
+ rsyserr(FERROR, errno, "rename %s -> \"%s\"",
+ full_fname(fnametmp), fname);
+ } else
+ handle_partial_dir(partialptr, PDIR_DELETE);