Split up the ifuncs.h file into 3 .h files.
[rsync/rsync.git] / log.c
diff --git a/log.c b/log.c
index b5bd966..991b7cc 100644 (file)
--- a/log.c
+++ b/log.c
@@ -20,9 +20,9 @@
  */
 
 #include "rsync.h"
-#include "ifuncs.h"
+#include "itypes.h"
+#include "inums.h"
 
-extern int verbose;
 extern int dry_run;
 extern int am_daemon;
 extern int am_server;
@@ -32,9 +32,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;
@@ -51,11 +54,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;
@@ -63,6 +67,7 @@ static FILE *logfile_fp;
 struct stats stats;
 
 int got_xfer_error = 0;
+int output_needs_newline = 0;
 
 struct {
         int code;
@@ -84,7 +89,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 +247,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 +259,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 +315,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,15 +328,26 @@ 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);
        }
 
+       if (output_needs_newline) {
+               fputc('\n', f);
+               output_needs_newline = 0;
+       }
+
        trailing_CR_or_NL = len && (buf[len-1] == '\n' || buf[len-1] == '\r')
                          ? buf[--len] : 0;
 
+       if (len && buf[0] == '\r') {
+               fputc('\r', f);
+               buf++;
+               len--;
+       }
+
 #ifdef ICONV_CONST
        if (ic != (iconv_t)-1) {
                xbuf outbuf, inbuf;
@@ -330,7 +355,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);
@@ -428,12 +453,12 @@ 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;
 
-       if (code == FINFO && !am_server)
+       if (!am_server && (code == FINFO || code == FCLIENT))
                f = stdout;
        else
                f = stderr;
@@ -488,9 +513,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));
+                                comma_num(F_LENGTH(file)));
                        n = buf2;
                        break;
                case 'U':
@@ -517,7 +542,7 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                        break;
                case 'M':
                        n = c = timestring(file->modtime);
-                       while ((c = strchr(p, ' ')) != NULL)
+                       while ((c = strchr(c, ' ')) != NULL)
                                *c = '-';
                        break;
                case 'B':
@@ -606,8 +631,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, comma_num(b));
                        n = buf2;
                        break;
                case 'c':
@@ -618,8 +643,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, comma_num(b));
+                       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':
@@ -755,7 +802,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
@@ -779,7 +826,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))
@@ -807,10 +854,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",
+                       comma_num(stats.total_written),
+                       comma_num(stats.total_read),
+                       comma_num(stats.total_size));
        } else if (am_server != 2) {
                const char *name;