X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/bb4e4d889f51065dcef6f34d8ba4a80c051149a1..41adbcec9fdf7a72bb15ea7a287b5253713c7ed0:/log.c diff --git a/log.c b/log.c index 9100f5db..13c9311d 100644 --- a/log.c +++ b/log.c @@ -22,7 +22,6 @@ #include "rsync.h" #include "ifuncs.h" -extern int verbose; extern int dry_run; extern int am_daemon; extern int am_server; @@ -32,12 +31,14 @@ extern int local_server; extern int quiet; extern int module_id; extern int msg_fd_out; +extern int checksum_len; extern int allow_8bit_chars; extern int protocol_version; +extern int always_checksum; extern int preserve_times; +extern int msgs2stderr; extern int uid_ndx; extern int gid_ndx; -extern int progress_is_active; extern int stdout_format_has_i; extern int stdout_format_has_o_or_i; extern int logfile_format_has_i; @@ -52,11 +53,12 @@ extern char *logfile_name; extern iconv_t ic_chck; #endif #ifdef ICONV_OPTION -extern iconv_t ic_send, ic_recv; +extern iconv_t ic_recv; #endif -extern char curr_dir[]; +extern char curr_dir[MAXPATHLEN]; extern char *module_dir; extern unsigned int module_dirlen; +extern char sender_file_sum[MAX_DIGEST_LEN]; static int log_initialised; static int logfile_was_closed; @@ -64,6 +66,7 @@ static FILE *logfile_fp; struct stats stats; int got_xfer_error = 0; +int output_needs_newline = 0; struct { int code; @@ -255,6 +258,9 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) if (len < 0) exit_cleanup(RERR_MESSAGEIO); + if (msgs2stderr > 0 && code != FLOG) + goto output_msg; + if (am_server && msg_fd_out >= 0) { assert(!is_utf8); /* Pass the message to our sibling. */ @@ -304,8 +310,10 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) /* TODO: can we send the error to the user somehow? */ return; } + msgs2stderr = -1; } +output_msg: switch (code) { case FERROR_XFER: got_xfer_error = 1; @@ -315,15 +323,16 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) f = stderr; break; case FINFO: - f = am_server ? stderr : stdout; + case FCLIENT: + f = msgs2stderr ? stderr : stdout; break; default: exit_cleanup(RERR_MESSAGEIO); } - if (progress_is_active) { + if (output_needs_newline) { fputc('\n', f); - progress_is_active = 0; + output_needs_newline = 0; } trailing_CR_or_NL = len && (buf[len-1] == '\n' || buf[len-1] == '\r') @@ -342,7 +351,7 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) int ierrno; INIT_CONST_XBUF(outbuf, convbuf); - INIT_XBUF(inbuf, (char*)buf, len, -1); + INIT_XBUF(inbuf, (char*)buf, len, (size_t)-1); while (inbuf.len) { iconvbufs(ic, &inbuf, &outbuf, 0); @@ -445,7 +454,7 @@ void rflush(enum logcode code) if (am_daemon || code == FLOG) return; - if (code == FINFO && !am_server) + if (!am_server && (code == FINFO || code == FCLIENT)) f = stdout; else f = stderr; @@ -500,9 +509,9 @@ static void log_formatted(enum logcode code, const char *format, const char *op, n = client_addr(0); break; case 'l': - strlcat(fmt, ".0f", sizeof fmt); + strlcat(fmt, "s", sizeof fmt); snprintf(buf2, sizeof buf2, fmt, - (double)F_LENGTH(file)); + big_num(F_LENGTH(file), 0)); n = buf2; break; case 'U': @@ -618,8 +627,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op, b = stats.total_read - initial_stats->total_read; } - strlcat(fmt, ".0f", sizeof fmt); - snprintf(buf2, sizeof buf2, fmt, (double)b); + strlcat(fmt, "s", sizeof fmt); + snprintf(buf2, sizeof buf2, fmt, big_num(b, 0)); n = buf2; break; case 'c': @@ -630,8 +639,30 @@ static void log_formatted(enum logcode code, const char *format, const char *op, b = stats.total_read - initial_stats->total_read; } - strlcat(fmt, ".0f", sizeof fmt); - snprintf(buf2, sizeof buf2, fmt, (double)b); + strlcat(fmt, "s", sizeof fmt); + snprintf(buf2, sizeof buf2, fmt, big_num(b, 0)); + n = buf2; + break; + case 'C': + if (protocol_version >= 30 + && (iflags & ITEM_TRANSFER + || (always_checksum && S_ISREG(file->mode)))) { + int i, x1, x2; + const char *sum = iflags & ITEM_TRANSFER + ? sender_file_sum : F_SUM(file); + c = buf2 + checksum_len*2; + *c = '\0'; + for (i = checksum_len; --i >= 0; ) { + x1 = CVAL(sum, i); + x2 = x1 >> 4; + x1 &= 0xF; + *--c = x1 <= 9 ? x1 + '0' : x1 + 'a' - 10; + *--c = x2 <= 9 ? x2 + '0' : x2 + 'a' - 10; + } + } else { + memset(buf2, ' ', checksum_len*2); + buf2[checksum_len*2] = '\0'; + } n = buf2; break; case 'i': @@ -767,7 +798,7 @@ void maybe_log_item(struct file_struct *file, int iflags, int itemizing, { int significant_flags = iflags & SIGNIFICANT_ITEM_FLAGS; int see_item = itemizing && (significant_flags || *buf - || stdout_format_has_i > 1 || (verbose > 1 && stdout_format_has_i)); + || stdout_format_has_i > 1 || (INFO_GTE(NAME, 2) && stdout_format_has_i)); int local_change = iflags & ITEM_LOCAL_CHANGE && significant_flags; if (am_server) { if (logfile_name && !dry_run && see_item @@ -791,7 +822,7 @@ void log_delete(const char *fname, int mode) x.file.mode = mode; - if (!verbose && !stdout_format) + if (!INFO_GTE(DEL, 1) && !stdout_format) ; else if (am_server && protocol_version >= 29 && len < MAXPATHLEN) { if (S_ISDIR(mode)) @@ -819,10 +850,10 @@ void log_delete(const char *fname, int mode) void log_exit(int code, const char *file, int line) { if (code == 0) { - rprintf(FLOG,"sent %.0f bytes received %.0f bytes total size %.0f\n", - (double)stats.total_written, - (double)stats.total_read, - (double)stats.total_size); + rprintf(FLOG,"sent %s bytes received %s bytes total size %s\n", + big_num(stats.total_written, 0), + big_num(stats.total_read, 0), + big_num(stats.total_size, 0)); } else if (am_server != 2) { const char *name;