Give iconvbufs() an ICB_INIT flag.
[rsync/rsync.git] / log.c
diff --git a/log.c b/log.c
index 551cb06..61d01ce 100644 (file)
--- a/log.c
+++ b/log.c
@@ -31,7 +31,6 @@ extern int am_generator;
 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;
@@ -60,6 +59,7 @@ extern char curr_dir[MAXPATHLEN];
 extern char *full_module_path;
 extern unsigned int module_dirlen;
 extern char sender_file_sum[MAX_DIGEST_LEN];
+extern const char undetermined_hostname[];
 
 static int log_initialised;
 static int logfile_was_closed;
@@ -68,6 +68,7 @@ struct stats stats;
 
 int got_xfer_error = 0;
 int output_needs_newline = 0;
+int send_msgs_to_gen = 0;
 
 struct {
         int code;
@@ -262,7 +263,7 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8)
        if (msgs2stderr && code != FLOG)
                goto output_msg;
 
-       if (am_server && msg_fd_out >= 0) {
+       if (send_msgs_to_gen) {
                assert(!is_utf8);
                /* Pass the message to our sibling in native charset. */
                send_msg((enum msgcode)code, buf, len, 0);
@@ -358,7 +359,7 @@ output_msg:
                INIT_XBUF(inbuf, (char*)buf, len, (size_t)-1);
 
                while (inbuf.len) {
-                       iconvbufs(ic, &inbuf, &outbuf, 0);
+                       iconvbufs(ic, &inbuf, &outbuf, inbuf.pos ? 0 : ICB_INIT);
                        ierrno = errno;
                        if (outbuf.len) {
                                filtered_fwrite(f, convbuf, outbuf.len, 0);
@@ -492,21 +493,36 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
        buf[total] = '\0';
 
        for (p = buf; (p = strchr(p, '%')) != NULL; ) {
+               int humanize = 0;
                s = p++;
                c = fmt + 1;
+               while (*p == '\'') {
+                       humanize++;
+                       p++;
+               }
                if (*p == '-')
                        *c++ = *p++;
                while (isDigit(p) && c - fmt < (int)(sizeof fmt) - 8)
                        *c++ = *p++;
+               while (*p == '\'') {
+                       humanize++;
+                       p++;
+               }
                if (!*p)
                        break;
                *c = '\0';
                n = NULL;
 
+               /* Note for %h and %a: it doesn't matter what fd we pass to
+                * client_{name,addr} because rsync_module will already have
+                * forced the answer to be cached (assuming, of course, for %h
+                * that lp_reverse_lookup(module_id) is true). */
                switch (*p) {
                case 'h':
-                       if (am_daemon)
-                               n = client_name(0);
+                       if (am_daemon) {
+                               n = lp_reverse_lookup(module_id)
+                                 ? client_name(0) : undetermined_hostname;
+                       }
                        break;
                case 'a':
                        if (am_daemon)
@@ -515,7 +531,7 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                case 'l':
                        strlcat(fmt, "s", sizeof fmt);
                        snprintf(buf2, sizeof buf2, fmt,
-                                comma_num(F_LENGTH(file)));
+                                do_big_num(F_LENGTH(file), humanize, NULL));
                        n = buf2;
                        break;
                case 'U':
@@ -632,7 +648,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                                        initial_stats->total_read;
                        }
                        strlcat(fmt, "s", sizeof fmt);
-                       snprintf(buf2, sizeof buf2, fmt, comma_num(b));
+                       snprintf(buf2, sizeof buf2, fmt,
+                                do_big_num(b, humanize, NULL));
                        n = buf2;
                        break;
                case 'c':
@@ -644,7 +661,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
                                        initial_stats->total_read;
                        }
                        strlcat(fmt, "s", sizeof fmt);
-                       snprintf(buf2, sizeof buf2, fmt, comma_num(b));
+                       snprintf(buf2, sizeof buf2, fmt,
+                                do_big_num(b, humanize, NULL));
                        n = buf2;
                        break;
                case 'C':