X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c85631421deb9eb49abff012f7bbd0dc96278b1b..ac669e8b922c7ace230294f9bf9a3a2bdfbd19d2:/log.c diff --git a/log.c b/log.c index 152430cd..72a28370 100644 --- a/log.c +++ b/log.c @@ -39,6 +39,7 @@ extern int local_server; extern int quiet; extern int module_id; extern int msg_fd_out; +extern int allow_8bit_chars; extern int protocol_version; extern int preserve_times; extern int log_format_has_i; @@ -46,7 +47,7 @@ extern int log_format_has_o_or_i; extern int daemon_log_format_has_o_or_i; extern char *auth_user; extern char *log_format; -#ifdef HAVE_ICONV_OPEN +#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H extern iconv_t ic_chck; #endif @@ -195,24 +196,21 @@ void logfile_reopen(void) } } -static void filtered_fwrite(const char *buf, int len, FILE *f) +static void filtered_fwrite(FILE *f, const char *buf, int len, int use_isprint) { const char *s, *end = buf + len; for (s = buf; s < end; s++) { if ((s < end - 4 - && *s == '\\' && s[1] == '0' + && *s == '\\' && s[1] == '#' && isdigit(*(uchar*)(s+2)) && isdigit(*(uchar*)(s+3)) && isdigit(*(uchar*)(s+4))) -#ifdef HAVE_ICONV_OPEN - || (*(uchar*)s < ' ' && *s != '\t') -#else - || ((!isprint(*(uchar*)s) || *(uchar*)s < ' ') && *s != '\t') -#endif - ) { + || (*s != '\t' + && ((use_isprint && !isprint(*(uchar*)s)) + || *(uchar*)s < ' '))) { if (s != buf && fwrite(buf, s - buf, 1, f) != 1) exit_cleanup(RERR_MESSAGEIO); - fprintf(f, "\\%04o", *(uchar*)s); + fprintf(f, "\\#%03o", *(uchar*)s); buf = s + 1; } } @@ -298,7 +296,7 @@ void rwrite(enum logcode code, char *buf, int len) trailing_CR_or_NL = len && (buf[len-1] == '\n' || buf[len-1] == '\r') ? buf[--len] : 0; -#ifdef HAVE_ICONV_OPEN +#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H if (ic_chck != (iconv_t)-1) { char convbuf[1024]; char *in_buf = buf, *out_buf = convbuf; @@ -308,20 +306,20 @@ void rwrite(enum logcode code, char *buf, int len) while (iconv(ic_chck, &in_buf,&in_cnt, &out_buf,&out_cnt) == (size_t)-1) { if (out_buf != convbuf) { - filtered_fwrite(convbuf, out_buf - convbuf, f); + filtered_fwrite(f, convbuf, out_buf - convbuf, 0); out_buf = convbuf; out_cnt = sizeof convbuf - 1; } if (errno == E2BIG) continue; - fprintf(f, "\\%04o", *(uchar*)in_buf++); + fprintf(f, "\\#%03o", *(uchar*)in_buf++); in_cnt--; } if (out_buf != convbuf) - filtered_fwrite(convbuf, out_buf - convbuf, f); + filtered_fwrite(f, convbuf, out_buf - convbuf, 0); } else #endif - filtered_fwrite(buf, len, f); + filtered_fwrite(f, buf, len, !allow_8bit_chars); if (trailing_CR_or_NL) { fputc(trailing_CR_or_NL, f); @@ -610,7 +608,8 @@ static void log_formatted(enum logcode code, char *format, char *op, n[5] = !(iflags & ITEM_REPORT_PERMS) ? '.' : 'p'; n[6] = !(iflags & ITEM_REPORT_OWNER) ? '.' : 'o'; n[7] = !(iflags & ITEM_REPORT_GROUP) ? '.' : 'g'; - n[8] = '\0'; + n[8] = '.'; + n[9] = '\0'; if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) { char ch = iflags & ITEM_IS_NEW ? '+' : '?';