From 4dde3347fb614270f6aa6812598185aa0ccca3ef Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 25 Oct 2009 22:22:03 -0700 Subject: [PATCH] Fix %b and %c so that they count per-transfer bytes again. --- generator.c | 2 +- io.c | 6 +++++ log.c | 64 +++++++++++++++++++++++++++-------------------------- receiver.c | 14 ++++++------ sender.c | 12 +++++----- 5 files changed, 53 insertions(+), 45 deletions(-) diff --git a/generator.c b/generator.c index acf4b888..8d8c362d 100644 --- a/generator.c +++ b/generator.c @@ -516,7 +516,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre #endif } else if (ndx >= 0) { enum logcode code = logfile_format_has_i ? FINFO : FCLIENT; - log_item(code, file, &stats, iflags, xname); + log_item(code, file, iflags, xname); } } } diff --git a/io.c b/io.c index b1748628..b400ba29 100644 --- a/io.c +++ b/io.c @@ -76,6 +76,9 @@ int kluge_around_eof = 0; int sock_f_in = -1; int sock_f_out = -1; +int64 total_data_read = 0; +int64 total_data_written = 0; + static struct { xbuf in, out, msg; int in_fd; @@ -1578,6 +1581,7 @@ void read_buf(int f, char *buf, size_t len) if (!IN_MULTIPLEXED) { memcpy(buf, perform_io(len, PIO_INPUT_AND_CONSUME), len); + total_data_read += len; if (forward_flist_data) write_buf(iobuf.out_fd, buf, len); batch_copy: @@ -1601,6 +1605,7 @@ void read_buf(int f, char *buf, size_t len) /* The bytes at the "data" pointer will survive long * enough to make a copy, but not past future I/O. */ memcpy(buf, data, siz); + total_data_read += siz; if (forward_flist_data) write_buf(iobuf.out_fd, buf, siz); @@ -1873,6 +1878,7 @@ void write_buf(int f, const char *buf, size_t len) memcpy(iobuf.out.buf + pos, buf, len); iobuf.out.len += len; + total_data_written += len; batch_copy: if (f == write_batch_monitor_out) diff --git a/log.c b/log.c index 889a3189..7be4cec9 100644 --- a/log.c +++ b/log.c @@ -44,6 +44,8 @@ extern int stdout_format_has_o_or_i; extern int logfile_format_has_i; extern int logfile_format_has_o_or_i; extern int receiver_symlink_times; +extern int64 total_data_written; +extern int64 total_data_read; extern mode_t orig_umask; extern char *auth_user; extern char *stdout_format; @@ -70,6 +72,9 @@ int got_xfer_error = 0; int output_needs_newline = 0; int send_msgs_to_gen = 0; +static int64 initial_data_written; +static int64 initial_data_read; + struct { int code; char const *name; @@ -467,10 +472,15 @@ void rflush(enum logcode code) fflush(f); } +void remember_initial_stats(void) +{ + initial_data_read = total_data_read; + initial_data_written = total_data_written; +} + /* A generic logging routine for send/recv, with parameter substitiution. */ static void log_formatted(enum logcode code, const char *format, const char *op, - struct file_struct *file, const char *fname, - struct stats *initial_stats, int iflags, + struct file_struct *file, const char *fname, int iflags, const char *hlink) { char buf[MAXPATHLEN+1024], buf2[MAXPATHLEN], fmt[32]; @@ -640,26 +650,24 @@ static void log_formatted(enum logcode code, const char *format, const char *op, n = auth_user; break; case 'b': - if (am_sender) { - b = stats.total_written - - initial_stats->total_written; - } else { - b = stats.total_read - - initial_stats->total_read; - } + if (!(iflags & ITEM_TRANSFER)) + b = 0; + else if (am_sender) + b = total_data_written - initial_data_written; + else + b = total_data_read - initial_data_read; strlcat(fmt, "s", sizeof fmt); snprintf(buf2, sizeof buf2, fmt, do_big_num(b, humanize, NULL)); n = buf2; break; case 'c': - if (!am_sender) { - b = stats.total_written - - initial_stats->total_written; - } else { - b = stats.total_read - - initial_stats->total_read; - } + if (!(iflags & ITEM_TRANSFER)) + b = 0; + else if (!am_sender) + b = total_data_written - initial_data_written; + else + b = total_data_read - initial_data_read; strlcat(fmt, "s", sizeof fmt); snprintf(buf2, sizeof buf2, fmt, do_big_num(b, humanize, NULL)); @@ -802,19 +810,14 @@ int log_format_has(const char *format, char esc) /* Log the transfer of a file. If the code is FCLIENT, the output just goes * to stdout. If it is FLOG, it just goes to the log file. Otherwise we * output to both. */ -void log_item(enum logcode code, struct file_struct *file, - struct stats *initial_stats, int iflags, const char *hlink) +void log_item(enum logcode code, struct file_struct *file, int iflags, const char *hlink) { const char *s_or_r = am_sender ? "send" : "recv"; - if (code != FLOG && stdout_format && !am_server) { - log_formatted(FCLIENT, stdout_format, s_or_r, - file, NULL, initial_stats, iflags, hlink); - } - if (code != FCLIENT && logfile_format && *logfile_format) { - log_formatted(FLOG, logfile_format, s_or_r, - file, NULL, initial_stats, iflags, hlink); - } + if (code != FLOG && stdout_format && !am_server) + log_formatted(FCLIENT, stdout_format, s_or_r, file, NULL, iflags, hlink); + if (code != FCLIENT && logfile_format && *logfile_format) + log_formatted(FLOG, logfile_format, s_or_r, file, NULL, iflags, hlink); } void maybe_log_item(struct file_struct *file, int iflags, int itemizing, @@ -827,11 +830,11 @@ void maybe_log_item(struct file_struct *file, int iflags, int itemizing, if (am_server) { if (logfile_name && !dry_run && see_item && (significant_flags || logfile_format_has_i)) - log_item(FLOG, file, &stats, iflags, buf); + log_item(FLOG, file, iflags, buf); } else if (see_item || local_change || *buf || (S_ISDIR(file->mode) && significant_flags)) { enum logcode code = significant_flags || logfile_format_has_i ? FINFO : FCLIENT; - log_item(code, file, &stats, iflags, buf); + log_item(code, file, iflags, buf); } } @@ -854,15 +857,14 @@ void log_delete(const char *fname, int mode) send_msg(MSG_DELETED, fname, len, am_generator); } else { fmt = stdout_format_has_o_or_i ? stdout_format : "deleting %n"; - log_formatted(FCLIENT, fmt, "del.", &x.file, fname, &stats, - ITEM_DELETED, NULL); + log_formatted(FCLIENT, fmt, "del.", &x.file, fname, ITEM_DELETED, NULL); } if (!logfile_name || dry_run || !logfile_format) return; fmt = logfile_format_has_o_or_i ? logfile_format : "deleting %n"; - log_formatted(FLOG, fmt, "del.", &x.file, fname, &stats, ITEM_DELETED, NULL); + log_formatted(FLOG, fmt, "del.", &x.file, fname, ITEM_DELETED, NULL); } /* diff --git a/receiver.c b/receiver.c index 1738dcab..e8fa3d16 100644 --- a/receiver.c +++ b/receiver.c @@ -467,7 +467,6 @@ int recv_files(int f_in, int f_out, char *local_name) char fnamecmpbuf[MAXPATHLEN]; uchar fnamecmp_type; struct file_struct *file; - struct stats initial_stats; 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; @@ -612,14 +611,17 @@ int recv_files(int f_in, int f_out, char *local_name) } } + if (!log_before_transfer) + remember_initial_stats(); + if (!do_xfers) { /* log the transfer */ - log_item(FCLIENT, file, &stats, iflags, NULL); + log_item(FCLIENT, file, iflags, NULL); if (read_batch) discard_receive_data(f_in, F_LENGTH(file)); continue; } if (write_batch < 0) { - log_item(FCLIENT, file, &stats, iflags, NULL); + log_item(FCLIENT, file, iflags, NULL); if (!am_server) discard_receive_data(f_in, F_LENGTH(file)); continue; @@ -677,8 +679,6 @@ int recv_files(int f_in, int f_out, char *local_name) fnamecmp = fname; } - initial_stats = stats; - /* open the file */ fd1 = do_open(fnamecmp, O_RDONLY, 0); @@ -773,7 +773,7 @@ int recv_files(int f_in, int f_out, char *local_name) /* log the transfer */ if (log_before_transfer) - log_item(FCLIENT, file, &initial_stats, iflags, NULL); + log_item(FCLIENT, file, iflags, NULL); else if (!am_server && INFO_GTE(NAME, 1) && INFO_EQ(PROGRESS, 1)) rprintf(FINFO, "%s\n", fname); @@ -781,7 +781,7 @@ int recv_files(int f_in, int f_out, char *local_name) recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size, fname, fd2, F_LENGTH(file)); - log_item(log_code, file, &initial_stats, iflags, NULL); + log_item(log_code, file, iflags, NULL); if (fd1 != -1) close(fd1); diff --git a/sender.c b/sender.c index 621cf20f..98612965 100644 --- a/sender.c +++ b/sender.c @@ -171,7 +171,6 @@ void send_files(int f_in, int f_out) int iflags, xlen; struct file_struct *file; int phase = 0, max_phase = protocol_version >= 29 ? 2 : 1; - struct stats initial_stats; int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i; enum logcode log_code = log_before_transfer ? FLOG : FINFO; int f_xfer = write_batch < 0 ? batch_fd : f_out; @@ -291,15 +290,16 @@ void send_files(int f_in, int f_out) stats.xferred_files++; stats.total_transferred_size += F_LENGTH(file); + if (!log_before_transfer) + remember_initial_stats(); + if (!do_xfers) { /* log the transfer */ - log_item(FCLIENT, file, &stats, iflags, NULL); + log_item(FCLIENT, file, iflags, NULL); write_ndx_and_attrs(f_out, ndx, iflags, fname, file, fnamecmp_type, xname, xlen); continue; } - initial_stats = stats; - if (!(s = receive_sums(f_in))) { io_error |= IOERR_GENERAL; rprintf(FERROR_XFER, "receive_sums failed\n"); @@ -355,7 +355,7 @@ void send_files(int f_in, int f_out) rprintf(FINFO, "calling match_sums %s%s%s\n", path,slash,fname); if (log_before_transfer) - log_item(FCLIENT, file, &initial_stats, iflags, NULL); + log_item(FCLIENT, file, iflags, NULL); else if (!am_server && INFO_GTE(NAME, 1) && INFO_EQ(PROGRESS, 1)) rprintf(FCLIENT, "%s\n", fname); @@ -365,7 +365,7 @@ void send_files(int f_in, int f_out) if (INFO_GTE(PROGRESS, 1)) end_progress(st.st_size); - log_item(log_code, file, &initial_stats, iflags, NULL); + log_item(log_code, file, iflags, NULL); if (mbuf) { j = unmap_file(mbuf); -- 2.34.1