- break;
- }
-
- file = &flist->files[i];
- fname = file->name;
-
- if (local_name)
- fname = local_name;
-
- if (dry_run) {
- if (!am_server && verbose)
- printf("%s\n",fname);
- continue;
- }
-
- if (verbose > 2)
- fprintf(FERROR,"recv_files(%s)\n",fname);
-
- /* open the file */
- fd1 = open(fname,O_RDONLY);
-
- if (fd1 != -1 && fstat(fd1,&st) != 0) {
- fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
- close(fd1);
- return -1;
- }
-
- if (fd1 != -1 && !S_ISREG(st.st_mode)) {
- fprintf(FERROR,"%s : not a regular file\n",fname);
- close(fd1);
- return -1;
- }
-
- if (fd1 != -1 && st.st_size > 0) {
- buf = map_file(fd1,st.st_size);
- } else {
- buf = NULL;
- }
-
- if (verbose > 2)
- fprintf(FERROR,"mapped %s of size %d\n",fname,(int)st.st_size);
-
- /* open tmp file */
- sprintf(fnametmp,"%s.XXXXXX",fname);
- if (NULL == mktemp(fnametmp)) {
- fprintf(FERROR,"mktemp %s failed\n",fnametmp);
- return -1;
- }
- fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
- if (fd2 == -1) {
- fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
- return -1;
- }
-
- cleanup_fname = fnametmp;
-
- if (!am_server && verbose)
- printf("%s\n",fname);
-
- /* recv file data */
- receive_data(f_in,buf,fd2,fname);
-
- if (fd1 != -1) {
- unmap_file(buf);
- close(fd1);
- }
- close(fd2);
-
- if (verbose > 2)
- fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
-
- if (make_backups) {
- char fnamebak[MAXPATHLEN];
- sprintf(fnamebak,"%s%s",fname,backup_suffix);
- if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
- fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
- exit_cleanup(1);
+ 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, fnamecmp,
+ 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);