X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ffa8ab8eb55d6cce33d9772880b2c7983aad15ce..5e1f082d0c0af5fdb8096023772eb4f5013f78a0:/receiver.c diff --git a/receiver.c b/receiver.c index 9a8c2af8..60b6c2fb 100644 --- a/receiver.c +++ b/receiver.c @@ -27,7 +27,7 @@ extern int do_xfers; extern int am_server; extern int do_progress; extern int log_before_transfer; -extern int log_format_has_i; +extern int stdout_format_has_i; extern int logfile_format_has_i; extern int csum_length; extern int read_batch; @@ -40,7 +40,7 @@ extern int preserve_perms; extern int basis_dir_cnt; extern int make_backups; extern int cleanup_got_literal; -extern int remove_sent_files; +extern int remove_source_files; extern int append_mode; extern int sparse_files; extern int keep_partial; @@ -48,7 +48,7 @@ extern int checksum_seed; extern int inplace; extern int delay_updates; extern struct stats stats; -extern char *log_format; +extern char *stdout_format; extern char *tmpdir; extern char *partial_dir; extern char *basis_dir[]; @@ -57,6 +57,8 @@ extern struct filter_list_struct server_filter_list; static struct bitbag *delayed_bits = NULL; static int phase = 0; +/* We're either updating the basis file or an identical copy: */ +static int updating_basis; /* @@ -216,7 +218,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, sum_update(map, len); } - if (inplace) { + if (updating_basis) { if (offset == offset2 && fd != -1) { OFF_T pos; if (flush_write_file(fd) < 0) @@ -296,7 +298,7 @@ static void handle_delayed_updates(struct file_list *flist, char *local_name) "rename failed for %s (from %s)", full_fname(fname), partialptr); } else { - if (remove_sent_files + if (remove_source_files || (preserve_hard_links && file->link_u.links)) { SIVAL(numbuf, 0, i); @@ -344,7 +346,8 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) struct file_struct *file; struct stats initial_stats; int save_make_backups = make_backups; - int itemizing = am_server ? logfile_format_has_i : log_format_has_i; + int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i; + enum logcode log_code = log_before_transfer ? FLOG : FINFO; int max_phase = protocol_version >= 29 ? 2 : 1; int i, recv_ok; @@ -359,6 +362,8 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) if (delay_updates) delayed_bits = bitbag_create(flist->count); + updating_basis = inplace; + while (1) { cleanup_disable(); @@ -420,14 +425,13 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) } if (!do_xfers) { /* log the transfer */ - if (!am_server && log_format) - log_item(file, &stats, iflags, NULL); + log_item(FCLIENT, file, &stats, iflags, NULL); if (read_batch) discard_receive_data(f_in, file->length); continue; } if (write_batch < 0) { - log_item(file, &stats, iflags, NULL); + log_item(FINFO, file, &stats, iflags, NULL); if (!am_server) discard_receive_data(f_in, file->length); continue; @@ -459,6 +463,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) fnamecmp = get_backup_name(fname); break; case FNAMECMP_FUZZY: + updating_basis = 0; if (file->dirname) { pathjoin(fnamecmpbuf, MAXPATHLEN, file->dirname, xname); @@ -467,6 +472,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) fnamecmp = xname; break; default: + updating_basis = 0; if (fnamecmp_type >= basis_dir_cnt) { rprintf(FERROR, "invalid basis_dir index: %d.\n", @@ -546,7 +552,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) file->mode = dest_mode(file->mode, st.st_mode, exists); } - /* We now check to see if we are writing file "inplace" */ + /* We now check to see if we are writing the file "inplace" */ if (inplace) { fd2 = do_open(fname, O_WRONLY|O_CREAT, 0600); if (fd2 == -1) { @@ -591,13 +597,12 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) continue; } - if (keep_partial) - cleanup_set(fnametmp, partialptr, file, fd1, fd2); + cleanup_set(fnametmp, partialptr, file, fd1, fd2); } /* log the transfer */ if (log_before_transfer) - log_item(file, &initial_stats, iflags, NULL); + log_item(FCLIENT, file, &initial_stats, iflags, NULL); else if (!am_server && verbose && do_progress) rprintf(FINFO, "%s\n", fname); @@ -605,8 +610,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size, fname, fd2, file->length); - if (!log_before_transfer) - log_item(file, &initial_stats, iflags, NULL); + log_item(log_code, file, &initial_stats, iflags, NULL); if (fd1 != -1) close(fd1); @@ -646,7 +650,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) cleanup_disable(); if (recv_ok > 0) { - if (remove_sent_files + if (remove_source_files || (preserve_hard_links && file->link_u.links)) { SIVAL(numbuf, 0, i); send_msg(MSG_SUCCESS, numbuf, 4);