Call f_name() with revised args (which also replaces f_name_to()).
[rsync/rsync.git] / log.c
diff --git a/log.c b/log.c
index 8386ea4..41d847f 100644 (file)
--- a/log.c
+++ b/log.c
@@ -38,6 +38,7 @@ extern int module_id;
 extern int msg_fd_out;
 extern int protocol_version;
 extern int preserve_times;
+extern int log_format_has_i;
 extern int log_format_has_o_or_i;
 extern int daemon_log_format_has_o_or_i;
 extern char *auth_user;
@@ -65,8 +66,11 @@ struct {
        { RERR_STREAMIO   , "error in rsync protocol data stream" },
        { RERR_MESSAGEIO  , "errors with program diagnostics" },
        { RERR_IPC        , "error in IPC code" },
-       { RERR_SIGNAL     , "received SIGUSR1 or SIGINT" },
-       { RERR_WAITCHILD  , "some error returned by waitpid()" },
+       { RERR_CRASHED    , "sibling process crashed" },
+       { RERR_TERMINATED , "sibling process terminated abnormally" },
+       { RERR_SIGNAL1    , "received SIGUSR1" },
+       { 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_VANISHED   , "some files vanished before they could be transferred" },
@@ -263,7 +267,7 @@ void rwrite(enum logcode code, char *buf, int len)
 void rprintf(enum logcode code, const char *format, ...)
 {
        va_list ap;
-       char buf[MAXPATHLEN+512];
+       char buf[BIGPATHBUFLEN];
        size_t len;
 
        va_start(ap, format);
@@ -274,7 +278,7 @@ void rprintf(enum logcode code, const char *format, ...)
         * truncate the resulting string.  (Note that configure ensures
         * that we have a vsnprintf() that doesn't ever return -1.) */
        if (len > sizeof buf - 1) {
-               const char ellipsis[] = "[...]";
+               static const char ellipsis[] = "[...]";
 
                /* Reset length, and zero-terminate the end of our buffer */
                len = sizeof buf - 1;
@@ -290,7 +294,7 @@ void rprintf(enum logcode code, const char *format, ...)
                 * If the input format string has a trailing newline,
                 * we copy it into that extra null; if it doesn't, well,
                 * all we lose is one byte.  */
-               strncpy(buf+len-sizeof ellipsis, ellipsis, sizeof ellipsis);
+               memcpy(buf+len-sizeof ellipsis, ellipsis, sizeof ellipsis);
                if (format[strlen(format)-1] == '\n') {
                        buf[len-1] = '\n';
                }
@@ -311,7 +315,7 @@ void rprintf(enum logcode code, const char *format, ...)
 void rsyserr(enum logcode code, int errcode, const char *format, ...)
 {
        va_list ap;
-       char buf[MAXPATHLEN+512];
+       char buf[BIGPATHBUFLEN];
        size_t len;
 
        strcpy(buf, RSYNC_NAME ": ");
@@ -399,8 +403,14 @@ static void log_formatted(enum logcode code, char *format, char *op,
                n = NULL;
 
                switch (*p) {
-               case 'h': if (am_daemon) n = client_name(0); break;
-               case 'a': if (am_daemon) n = client_addr(0); break;
+               case 'h':
+                       if (am_daemon)
+                               n = client_name(0);
+                       break;
+               case 'a':
+                       if (am_daemon)
+                               n = client_addr(0);
+                       break;
                case 'l':
                        strlcat(fmt, ".0f", sizeof fmt);
                        snprintf(buf2, sizeof buf2, fmt,
@@ -413,37 +423,35 @@ static void log_formatted(enum logcode code, char *format, char *op,
                                 (long)getpid());
                        n = buf2;
                        break;
-               case 'o': n = op; break;
+               case 'o':
+                       n = op;
+                       break;
                case 'f':
-                       n = safe_fname(f_name(file));
+                       n = f_name(file);
                        if (am_sender && file->dir.root) {
                                pathjoin(buf2, sizeof buf2,
                                         file->dir.root, n);
-                               /* The buffer from safe_fname() has more
-                                * room than MAXPATHLEN, so this is safe. */
+                               clean_fname(buf2, 0);
                                if (fmt[1])
-                                       strcpy(n, buf2);
+                                       strlcpy(n, buf2, MAXPATHLEN);
                                else
                                        n = buf2;
-                       }
-                       clean_fname(n, 0);
+                       } else
+                               clean_fname(n, 0);
                        if (*n == '/')
                                n++;
                        break;
                case 'n':
-                       n = safe_fname(f_name(file));
-                       if (S_ISDIR(file->mode)) {
-                               /* The buffer from safe_fname() has more
-                                * room than MAXPATHLEN, so this is safe. */
-                               strcat(n, "/");
-                       }
+                       n = f_name(file);
+                       if (S_ISDIR(file->mode))
+                               strlcat(n, "/", MAXPATHLEN);
                        break;
                case 'L':
                        if (hlink && *hlink) {
-                               n = safe_fname(hlink);
+                               n = hlink;
                                strcpy(buf2, " => ");
                        } else if (S_ISLNK(file->mode) && file->u.link) {
-                               n = safe_fname(file->u.link);
+                               n = file->u.link;
                                strcpy(buf2, " -> ");
                        } else {
                                n = "";
@@ -455,10 +463,18 @@ static void log_formatted(enum logcode code, char *format, char *op,
                        snprintf(buf2 + 4, sizeof buf2 - 4, fmt, n);
                        n = buf2;
                        break;
-               case 'm': n = lp_name(module_id); break;
-               case 't': n = timestring(time(NULL)); break;
-               case 'P': n = lp_path(module_id); break;
-               case 'u': n = auth_user; break;
+               case 'm':
+                       n = lp_name(module_id);
+                       break;
+               case 't':
+                       n = timestring(time(NULL));
+                       break;
+               case 'P':
+                       n = lp_path(module_id);
+                       break;
+               case 'u':
+                       n = auth_user;
+                       break;
                case 'b':
                        if (am_sender) {
                                b = stats.total_written -
@@ -512,7 +528,8 @@ static void log_formatted(enum logcode code, char *format, char *op,
                                int i;
                                for (i = 2; n[i]; i++)
                                        n[i] = ch;
-                       } else if (n[0] == '.' || n[0] == 'h') {
+                       } else if (n[0] == '.' || n[0] == 'h'
+                               || (n[0] == 'c' && n[1] == 'f')) {
                                int i;
                                for (i = 2; n[i]; i++) {
                                        if (n[i] != '.')
@@ -603,9 +620,9 @@ void maybe_log_item(struct file_struct *file, int iflags, int itemizing,
                    char *buf)
 {
        int significant_flags = iflags & SIGNIFICANT_ITEM_FLAGS;
-       int see_item = itemizing && (significant_flags || *buf || verbose > 1);
-       int local_change = iflags & ITEM_LOCAL_CHANGE
-           && (!(iflags & ITEM_XNAME_FOLLOWS) || significant_flags);
+       int see_item = itemizing && (significant_flags || *buf
+                                 || (verbose > 1 && log_format_has_i));
+       int local_change = iflags & ITEM_LOCAL_CHANGE && significant_flags;
        if (am_server) {
                if (am_daemon && !dry_run && see_item)
                        log_item(file, &stats, iflags, buf);