Mention some mount options that can interfere with --link-dest.
[rsync/rsync.git] / log.c
diff --git a/log.c b/log.c
index 4db9663..13c9311 100644 (file)
--- 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;
@@ -254,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. */
@@ -303,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;
@@ -314,7 +323,8 @@ 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);
@@ -341,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);
@@ -633,6 +643,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  ";