* 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
* 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;
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;
extern iconv_t ic_send, ic_recv;
#endif
extern char curr_dir[];
+extern char *module_dir;
extern unsigned int module_dirlen;
static int log_initialised;
#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);
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);
n = timestring(time(NULL));
break;
case 'P':
- n = lp_path(module_id);
+ n = module_dir;
break;
case 'u':
n = auth_user;
(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);