Fix --remove-source-files sanity check w/--copy-links the right way.
[rsync.git] / log.c
diff --git a/log.c b/log.c
index 4e20c2c8850d6d4be05b5c3eaa0a993916cf5dbb..6143349ce345a62106578a427be52fe009dda8fd 100644 (file)
--- a/log.c
+++ b/log.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
  * Copyright (C) 2000-2001 Martin Pool <mbp@samba.org>
- * Copyright (C) 2003-2009 Wayne Davison
+ * Copyright (C) 2003-2018 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,14 +31,13 @@ extern int am_generator;
 extern int local_server;
 extern int quiet;
 extern int module_id;
-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 xfersum_type;
+extern int checksum_type;
 extern int stdout_format_has_i;
 extern int stdout_format_has_o_or_i;
 extern int logfile_format_has_i;
@@ -48,6 +47,7 @@ extern int64 total_data_written;
 extern int64 total_data_read;
 extern mode_t orig_umask;
 extern char *auth_user;
+extern char *checksum_choice;
 extern char *stdout_format;
 extern char *logfile_format;
 extern char *logfile_name;
@@ -97,13 +97,13 @@ struct {
        { RERR_MALLOC     , "error allocating core memory buffers" },
        { RERR_PARTIAL    , "some files/attrs were not transferred (see previous errors)" },
        { RERR_VANISHED   , "some files vanished before they could be transferred" },
+       { RERR_DEL_LIMIT  , "the --max-delete limit stopped deletions" },
        { RERR_TIMEOUT    , "timeout in data send/receive" },
        { RERR_CONTIMEOUT , "timeout waiting for daemon connection" },
        { RERR_CMD_FAILED , "remote shell failed" },
        { RERR_CMD_KILLED , "remote shell killed" },
        { RERR_CMD_RUN    , "remote command could not be run" },
        { RERR_CMD_NOTFOUND,"remote command not found" },
-       { RERR_DEL_LIMIT  , "the --max-delete limit stopped deletions" },
        { 0, NULL }
 };
 
@@ -125,8 +125,7 @@ static void logit(int priority, const char *buf)
        if (logfile_was_closed)
                logfile_reopen();
        if (logfile_fp) {
-               fprintf(logfile_fp, "%s [%d] %s",
-                       timestring(time(NULL)), (int)getpid(), buf);
+               fprintf(logfile_fp, "%s [%d] %s", timestring(time(NULL)), (int)getpid(), buf);
                fflush(logfile_fp);
        } else {
                syslog(priority, "%s", buf);
@@ -135,21 +134,16 @@ static void logit(int priority, const char *buf)
 
 static void syslog_init()
 {
-       static int been_here = 0;
        int options = LOG_PID;
 
-       if (been_here)
-               return;
-       been_here = 1;
-
 #ifdef LOG_NDELAY
        options |= LOG_NDELAY;
 #endif
 
 #ifdef LOG_DAEMON
-       openlog("rsyncd", options, lp_syslog_facility(module_id));
+       openlog(lp_syslog_tag(module_id), options, lp_syslog_facility(module_id));
 #else
-       openlog("rsyncd", options);
+       openlog(lp_syslog_tag(module_id), options);
 #endif
 
 #ifndef LOG_NDELAY
@@ -169,14 +163,16 @@ static void logfile_open(void)
                rsyserr(FERROR, fopen_errno,
                        "failed to open log-file %s", logfile_name);
                rprintf(FINFO, "Ignoring \"log file\" setting.\n");
+               logfile_name = "";
        }
 }
 
 void log_init(int restart)
 {
        if (log_initialised) {
-               if (!restart)
+               if (!restart) /* Note: a restart only happens with am_daemon */
                        return;
+               assert(logfile_name); /* all am_daemon procs got at least an empty string */
                if (strcmp(logfile_name, lp_log_file(module_id)) != 0) {
                        if (logfile_fp) {
                                fclose(logfile_fp);
@@ -186,7 +182,8 @@ void log_init(int restart)
                        logfile_name = NULL;
                } else if (*logfile_name)
                        return; /* unchanged, non-empty "log file" names */
-               else if (lp_syslog_facility(-1) != lp_syslog_facility(module_id))
+               else if (lp_syslog_facility(-1) != lp_syslog_facility(module_id)
+                     || strcmp(lp_syslog_tag(-1), lp_syslog_tag(module_id)) != 0)
                        closelog();
                else
                        return; /* unchanged syslog settings */
@@ -208,6 +205,7 @@ void log_init(int restart)
                syslog_init();
 }
 
+/* Note that this close & reopen idiom intentionally ignores syslog logging. */
 void logfile_close(void)
 {
        if (logfile_fp) {
@@ -346,7 +344,7 @@ output_msg:
        case FCLIENT:
                break;
        default:
-               fprintf(stderr, "Unknown logcode in rwrite(): %d\n", (int)code);
+               fprintf(stderr, "Unknown logcode in rwrite(): %d [%s]\n", (int)code, who_am_i());
                exit_cleanup(RERR_MESSAGEIO);
        }
 
@@ -571,9 +569,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                        }
                        break;
                case 'p':
-                       strlcat(fmt, "ld", sizeof fmt);
-                       snprintf(buf2, sizeof buf2, fmt,
-                                (long)getpid());
+                       strlcat(fmt, "d", sizeof fmt);
+                       snprintf(buf2, sizeof buf2, fmt, (int)getpid());
                        n = buf2;
                        break;
                case 'M':
@@ -660,21 +657,10 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                        n = auth_user;
                        break;
                case 'b':
-                       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 (!(iflags & ITEM_TRANSFER))
                                b = 0;
-                       else if (!am_sender)
+                       else if ((!!am_sender) ^ (*p == 'c'))
                                b = total_data_written - initial_data_written;
                        else
                                b = total_data_read - initial_data_read;
@@ -684,26 +670,20 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                        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 = NULL;
+                       if (S_ISREG(file->mode)) {
+                               if (always_checksum && canonical_checksum(checksum_type))
+                                       n = sum_as_hex(checksum_type, F_SUM(file), 1);
+                               else if (iflags & ITEM_TRANSFER && canonical_checksum(xfersum_type))
+                                       n = sum_as_hex(xfersum_type, sender_file_sum, 0);
+                       }
+                       if (!n) {
+                               int sum_len = csum_len_for_type(always_checksum ? checksum_type : xfersum_type,
+                                                               always_checksum);
+                               memset(buf2, ' ', sum_len*2);
+                               buf2[sum_len*2] = '\0';
+                               n = buf2;
                        }
-                       n = buf2;
                        break;
                case 'i':
                        if (iflags & ITEM_DELETED) {
@@ -803,7 +783,7 @@ int log_format_has(const char *format, char esc)
                return 0;
 
        for (p = format; (p = strchr(p, '%')) != NULL; ) {
-               for (p++; *p == '\''; p++) {}
+               for (p++; *p == '\''; p++) {} /*SHARED ITERATOR*/
                if (*p == '-')
                        p++;
                while (isDigit(p))
@@ -853,19 +833,19 @@ void log_delete(const char *fname, int mode)
        static struct {
                union file_extras ex[4]; /* just in case... */
                struct file_struct file;
-       } x;
+       } x; /* Zero-initialized due to static declaration. */
        int len = strlen(fname);
        const char *fmt;
 
        x.file.mode = mode;
 
-       if (!INFO_GTE(DEL, 1) && !stdout_format)
-               ;
-       else if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
+       if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
                if (S_ISDIR(mode))
                        len++; /* directories include trailing null */
                send_msg(MSG_DELETED, fname, len, am_generator);
-       } else {
+       } else if (!INFO_GTE(DEL, 1) && !stdout_format)
+               ;
+       else {
                fmt = stdout_format_has_o_or_i ? stdout_format : "deleting %n";
                log_formatted(FCLIENT, fmt, "del.", &x.file, fname, ITEM_DELETED, NULL);
        }
@@ -887,9 +867,9 @@ void log_exit(int code, const char *file, int line)
 {
        if (code == 0) {
                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));
+                       big_num(stats.total_written),
+                       big_num(stats.total_read),
+                       big_num(stats.total_size));
        } else if (am_server != 2) {
                const char *name;