X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e7c67065c060d500eba8d073da9568db2c658aad..47c1197534c3247a2669df86fbc36d4094d6ba93:/receiver.c diff --git a/receiver.c b/receiver.c index 26be6f55..683a716c 100644 --- a/receiver.c +++ b/receiver.c @@ -24,12 +24,11 @@ extern int verbose; extern int do_xfers; -extern int am_daemon; extern int am_server; extern int do_progress; extern int log_before_transfer; -extern int log_format_has_i; -extern int daemon_log_format_has_i; +extern int stdout_format_has_i; +extern int logfile_format_has_i; extern int csum_length; extern int read_batch; extern int write_batch; @@ -41,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; @@ -49,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[]; @@ -168,9 +167,9 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, sum_update(map_ptr(mapbuf, offset, len), len); offset = sum.flength; } - if (fd != -1 && do_lseek(fd, offset, SEEK_SET) != offset) { - rsyserr(FERROR, errno, "lseek failed on %s", - full_fname(fname)); + if (fd != -1 && (j = do_lseek(fd, offset, SEEK_SET)) != offset) { + rsyserr(FERROR, errno, "lseek of %s returned %.0f, not %.0f", + full_fname(fname), (double)j, (double)offset); exit_cleanup(RERR_FILEIO); } } @@ -219,13 +218,15 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, if (inplace) { if (offset == offset2 && fd != -1) { + OFF_T pos; if (flush_write_file(fd) < 0) goto report_write_error; offset += len; - if (do_lseek(fd, len, SEEK_CUR) != offset) { + if ((pos = do_lseek(fd, len, SEEK_CUR)) != offset) { rsyserr(FERROR, errno, - "lseek failed on %s", - full_fname(fname)); + "lseek of %s returned %.0f, not %.0f", + full_fname(fname), + (double)pos, (double)offset); exit_cleanup(RERR_FILEIO); } continue; @@ -295,7 +296,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); @@ -343,8 +344,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_daemon ? daemon_log_format_has_i - : !am_server && 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; @@ -420,14 +421,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; @@ -591,13 +591,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 +604,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); @@ -617,9 +615,14 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) } if ((recv_ok && (!delay_updates || !partialptr)) || inplace) { - if (partialptr == fname || *partial_dir == '/') - partialptr = NULL; - finish_transfer(fname, fnametmp, partialptr, + char *temp_copy_name; + if (partialptr == fname) + partialptr = temp_copy_name = NULL; + else if (*partial_dir == '/') + temp_copy_name = NULL; + else + temp_copy_name = partialptr; + finish_transfer(fname, fnametmp, temp_copy_name, file, recv_ok, 1); if (fnamecmp == partialptr) { do_unlink(partialptr); @@ -641,7 +644,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);