X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7f0db4fd8e039a031f5eeebf80f2803ec56fb61c..8b3e60523aa3d86583a1df54c81c9d480ea19740:/log.c diff --git a/log.c b/log.c index 4db96637..6d66e20a 100644 --- a/log.c +++ b/log.c @@ -31,9 +31,12 @@ 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 stdout_format_has_i; @@ -50,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; @@ -84,7 +88,7 @@ struct { { RERR_SIGNAL , "received SIGINT, SIGTERM, or SIGHUP" }, { RERR_WAITCHILD , "waitpid() failed" }, { RERR_MALLOC , "error allocating core memory buffers" }, - { RERR_PARTIAL , "some files could not be transferred" }, + { RERR_PARTIAL , "some files/attrs were not transferred (see previous errors)" }, { RERR_VANISHED , "some files vanished before they could be transferred" }, { RERR_TIMEOUT , "timeout in data send/receive" }, { RERR_CONTIMEOUT , "timeout waiting for daemon connection" }, @@ -242,7 +246,7 @@ static void filtered_fwrite(FILE *f, const char *buf, int len, int use_isprint) void rwrite(enum logcode code, const char *buf, int len, int is_utf8) { int trailing_CR_or_NL; - FILE *f = NULL; + FILE *f = msgs2stderr ? stderr : stdout; #ifdef ICONV_OPTION iconv_t ic = is_utf8 && ic_recv != (iconv_t)-1 ? ic_recv : ic_chck; #else @@ -254,15 +258,22 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) if (len < 0) exit_cleanup(RERR_MESSAGEIO); + if (msgs2stderr && code != FLOG) + goto output_msg; + if (am_server && msg_fd_out >= 0) { assert(!is_utf8); - /* Pass the message to our sibling. */ + /* Pass the message to our sibling in native charset. */ send_msg((enum msgcode)code, buf, len, 0); return; } if (code == FERROR_SOCKET) /* This gets simplified for a non-sibling. */ code = FERROR; + else if (code == FERROR_UTF8) { + is_utf8 = 1; + code = FERROR; + } if (code == FCLIENT) code = FINFO; @@ -303,8 +314,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; } + f = stderr; } +output_msg: switch (code) { case FERROR_XFER: got_xfer_error = 1; @@ -314,7 +327,7 @@ 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: break; default: exit_cleanup(RERR_MESSAGEIO); @@ -341,7 +354,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); @@ -439,7 +452,7 @@ void rsyserr(enum logcode code, int errcode, const char *format, ...) void rflush(enum logcode code) { - FILE *f = NULL; + FILE *f; if (am_daemon || code == FLOG) return; @@ -633,6 +646,28 @@ static void log_formatted(enum logcode code, const char *format, const char *op, 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': if (iflags & ITEM_DELETED) { n = "*deleting ";