From c0dba635ba9d2cf29e39b9363cecc277974d62bb Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 23 Sep 2007 21:03:41 +0000 Subject: [PATCH] The --inplace code now properly handles creating a backup when the --whole-file and/or --read-batch options are specified. --- generator.c | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/generator.c b/generator.c index 271b55fa..d6bf4fda 100644 --- a/generator.c +++ b/generator.c @@ -899,7 +899,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx, #ifdef SUPPORT_HARD_LINKS try_a_copy: /* Copy the file locally. */ #endif - if (copy_file(cmpbuf, fname, file->mode) < 0) { + if (copy_file(cmpbuf, fname, file->mode, 0) < 0) { if (verbose) { rsyserr(FINFO, errno, "copy_file %s => %s", full_fname(cmpbuf), fname); @@ -1666,9 +1666,24 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, statret = 0; } - if (!do_xfers || read_batch || whole_file) + if (!do_xfers) goto notify_others; + if (read_batch || whole_file) { + if (inplace && make_backups > 0 && fnamecmp_type == FNAMECMP_FNAME) { + if (!(backupptr = get_backup_name(fname))) + goto cleanup; + if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) + goto pretend_missing; + if (copy_file(fname, backupptr, back_file->mode, 1) < 0) { + unmake_file(back_file); + back_file = NULL; + goto cleanup; + } + } + goto notify_others; + } + if (fuzzy_dirlist) { int j = flist_find(fuzzy_dirlist, file); if (j >= 0) /* don't use changing file as future fuzzy basis */ @@ -1676,9 +1691,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } /* open the file */ - fd = do_open(fnamecmp, O_RDONLY, 0); - - if (fd == -1) { + if ((fd = do_open(fnamecmp, O_RDONLY, 0)) < 0) { rsyserr(FERROR, errno, "failed to open %s, continuing", full_fname(fnamecmp)); pretend_missing: @@ -1706,6 +1719,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, rsyserr(FERROR, errno, "unlink %s", full_fname(backupptr)); unmake_file(back_file); + back_file = NULL; close(fd); goto cleanup; } @@ -1715,6 +1729,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, rsyserr(FERROR, errno, "open %s", full_fname(backupptr)); unmake_file(back_file); + back_file = NULL; close(fd); goto cleanup; } @@ -1769,15 +1784,17 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (read_batch) goto cleanup; - if (statret != 0 || whole_file) { + if (statret != 0 || whole_file) write_sum_head(f_out, NULL); - goto cleanup; + else { + generate_and_send_sums(fd, sx.st.st_size, f_out, f_copy); + close(fd); } - generate_and_send_sums(fd, sx.st.st_size, f_out, f_copy); - - if (f_copy >= 0) { - close(f_copy); + cleanup: + if (back_file) { + if (f_copy >= 0) + close(f_copy); set_file_attrs(backupptr, back_file, NULL, NULL, 0); if (verbose > 1) { rprintf(FINFO, "backed up %s to %s\n", @@ -1786,9 +1803,6 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, unmake_file(back_file); } - close(fd); - - cleanup: #ifdef SUPPORT_ACLS if (preserve_acls) free_acl(&sx); -- 2.34.1