-/* -*- c-file-style: "linux"; -*-
-
- Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
- Copyright (C) 2000-2001 by Martin Pool <mbp@samba.org>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 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
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
/*
- Logging and utility functions.
- tridge, May 1998
+ * Logging and utility functions.
+ *
+ * Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
+ * Copyright (C) 2000-2001 Martin Pool <mbp@samba.org>
+ * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * 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.
+ */
- Mapping to human-readable messages added by Martin Pool
- <mbp@samba.org>, Oct 2000.
- */
#include "rsync.h"
+#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
+#include <iconv.h>
+#endif
extern int verbose;
extern int dry_run;
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;
extern int log_format_has_o_or_i;
extern int daemon_log_format_has_o_or_i;
+extern mode_t orig_umask;
extern char *auth_user;
extern char *log_format;
+#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
+extern iconv_t ic_chck;
+#endif
static int log_initialised;
static int logfile_was_closed;
static void logfile_open(void)
{
- extern int orig_umask;
- int old_umask = umask(022 | orig_umask);
+ mode_t old_umask = umask(022 | orig_umask);
logfile = fopen(logfname, "a");
umask(old_umask);
if (!logfile) {
}
}
-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)))
- || ((!isprint(*(uchar*)s) || *(uchar*)s < ' ')
- && *s != '\t')) {
+ || (*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;
}
}
trailing_CR_or_NL = len && (buf[len-1] == '\n' || buf[len-1] == '\r')
? buf[--len] : 0;
- filtered_fwrite(buf, len, f);
+#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;
+ size_t in_cnt = len, out_cnt = sizeof convbuf - 1;
+
+ iconv(ic_chck, NULL, 0, NULL, 0);
+ while (iconv(ic_chck, &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;
+ }
+ if (errno == E2BIG)
+ continue;
+ fprintf(f, "\\#%03o", *(uchar*)in_buf++);
+ in_cnt--;
+ }
+ if (out_buf != convbuf)
+ filtered_fwrite(f, convbuf, out_buf - convbuf, 0);
+ } else
+#endif
+ filtered_fwrite(f, buf, len, !allow_8bit_chars);
if (trailing_CR_or_NL) {
fputc(trailing_CR_or_NL, f);
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 ? '+' : '?';
/* VANISHED is not an error, only a warning */
if (code == RERR_VANISHED) {
- rprintf(FINFO, "rsync warning: %s (code %d) at %s(%d) [%s]\n",
- name, code, file, line, who_am_i());
+ rprintf(FINFO, "rsync warning: %s (code %d) at %s(%d) [%s=%s]\n",
+ name, code, file, line, who_am_i(), RSYNC_VERSION);
} else {
- rprintf(FERROR, "rsync error: %s (code %d) at %s(%d) [%s]\n",
- name, code, file, line, who_am_i());
+ rprintf(FERROR, "rsync error: %s (code %d) at %s(%d) [%s=%s]\n",
+ name, code, file, line, who_am_i(), RSYNC_VERSION);
}
}
}