X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7c73536c25744a5e38027ec373a4cc26f4a681c4..1b42f628f495ff0cdaa8a7c219d8ce33192281fe:/log.c diff --git a/log.c b/log.c index cd5cd843..e916b95c 100644 --- a/log.c +++ b/log.c @@ -6,8 +6,9 @@ * Copyright (C) 2003-2007 Wayne Davison * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,11 +16,11 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + * with this program; if not, visit the http://fsf.org website. */ #include "rsync.h" +#include "ifuncs.h" extern int verbose; extern int dry_run; @@ -34,8 +35,8 @@ extern int msg_fd_out; extern int allow_8bit_chars; extern int protocol_version; extern int preserve_times; -extern int preserve_uid; -extern int preserve_gid; +extern int uid_ndx; +extern int gid_ndx; extern int stdout_format_has_i; extern int stdout_format_has_o_or_i; extern int logfile_format_has_i; @@ -312,26 +313,25 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) #ifdef ICONV_CONST if (ic != (iconv_t)-1) { + xbuf outbuf, inbuf; char convbuf[1024]; - ICONV_CONST char *in_buf = (ICONV_CONST char *)buf; - char *out_buf = convbuf; - size_t in_cnt = len, out_cnt = sizeof convbuf - 1; - - iconv(ic, NULL, 0, NULL, 0); - while (iconv(ic, &in_buf,&in_cnt, - &out_buf,&out_cnt) == (size_t)-1) { - if (out_buf != convbuf) { - filtered_fwrite(f, convbuf, out_buf - convbuf, 0); - out_buf = convbuf; - out_cnt = sizeof convbuf - 1; + int ierrno; + + INIT_CONST_XBUF(outbuf, convbuf); + INIT_XBUF(inbuf, (char*)buf, len, -1); + + while (inbuf.len) { + iconvbufs(ic, &inbuf, &outbuf, 0); + ierrno = errno; + if (outbuf.len) { + filtered_fwrite(f, convbuf, outbuf.len, 0); + outbuf.len = 0; } - if (errno == E2BIG) + if (!ierrno || ierrno == E2BIG) continue; - fprintf(f, "\\#%03o", *(uchar*)in_buf++); - in_cnt--; + fprintf(f, "\\#%03o", CVAL(inbuf.buf, inbuf.pos++)); + inbuf.len--; } - if (out_buf != convbuf) - filtered_fwrite(f, convbuf, out_buf - convbuf, 0); } else #endif filtered_fwrite(f, buf, len, !allow_8bit_chars); @@ -484,11 +484,11 @@ static void log_formatted(enum logcode code, const char *format, const char *op, case 'U': strlcat(fmt, "u", sizeof fmt); snprintf(buf2, sizeof buf2, fmt, - preserve_uid ? F_OWNER(file) : 0); + uid_ndx ? F_OWNER(file) : 0); n = buf2; break; case 'G': - if (!preserve_gid || file->flags & FLAG_SKIP_GROUP) + if (!gid_ndx || file->flags & FLAG_SKIP_GROUP) n = "DEFAULT"; else { strlcat(fmt, "u", sizeof fmt); @@ -792,7 +792,7 @@ void log_exit(int code, const char *file, int line) (double)stats.total_written, (double)stats.total_read, (double)stats.total_size); - } else { + } else if (am_server != 2) { const char *name; name = rerr_name(code);