*
* Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
* Copyright (C) 2000-2001 Martin Pool <mbp@samba.org>
- * Copyright (C) 2003-2009 Wayne Davison
+ * Copyright (C) 2003-2018 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
extern int local_server;
extern int quiet;
extern int module_id;
-extern int checksum_len;
extern int allow_8bit_chars;
extern int protocol_version;
extern int always_checksum;
extern int preserve_times;
extern int msgs2stderr;
-extern int uid_ndx;
-extern int gid_ndx;
+extern int xfersum_type;
+extern int checksum_type;
extern int stdout_format_has_i;
extern int stdout_format_has_o_or_i;
extern int logfile_format_has_i;
extern int64 total_data_read;
extern mode_t orig_umask;
extern char *auth_user;
+extern char *checksum_choice;
extern char *stdout_format;
extern char *logfile_format;
extern char *logfile_name;
{ RERR_MALLOC , "error allocating core memory buffers" },
{ RERR_PARTIAL , "some files/attrs were not transferred (see previous errors)" },
{ RERR_VANISHED , "some files vanished before they could be transferred" },
+ { RERR_DEL_LIMIT , "the --max-delete limit stopped deletions" },
{ RERR_TIMEOUT , "timeout in data send/receive" },
{ RERR_CONTIMEOUT , "timeout waiting for daemon connection" },
{ RERR_CMD_FAILED , "remote shell failed" },
{ RERR_CMD_KILLED , "remote shell killed" },
{ RERR_CMD_RUN , "remote command could not be run" },
{ RERR_CMD_NOTFOUND,"remote command not found" },
- { RERR_DEL_LIMIT , "the --max-delete limit stopped deletions" },
{ 0, NULL }
};
if (logfile_was_closed)
logfile_reopen();
if (logfile_fp) {
- fprintf(logfile_fp, "%s [%d] %s",
- timestring(time(NULL)), (int)getpid(), buf);
+ fprintf(logfile_fp, "%s [%d] %s", timestring(time(NULL)), (int)getpid(), buf);
fflush(logfile_fp);
} else {
syslog(priority, "%s", buf);
static void syslog_init()
{
- static int been_here = 0;
int options = LOG_PID;
- if (been_here)
- return;
- been_here = 1;
-
#ifdef LOG_NDELAY
options |= LOG_NDELAY;
#endif
#ifdef LOG_DAEMON
- openlog("rsyncd", options, lp_syslog_facility(module_id));
+ openlog(lp_syslog_tag(module_id), options, lp_syslog_facility(module_id));
#else
- openlog("rsyncd", options);
+ openlog(lp_syslog_tag(module_id), options);
#endif
#ifndef LOG_NDELAY
rsyserr(FERROR, fopen_errno,
"failed to open log-file %s", logfile_name);
rprintf(FINFO, "Ignoring \"log file\" setting.\n");
+ logfile_name = "";
}
}
void log_init(int restart)
{
if (log_initialised) {
- if (!restart)
+ if (!restart) /* Note: a restart only happens with am_daemon */
return;
+ assert(logfile_name); /* all am_daemon procs got at least an empty string */
if (strcmp(logfile_name, lp_log_file(module_id)) != 0) {
if (logfile_fp) {
fclose(logfile_fp);
logfile_name = NULL;
} else if (*logfile_name)
return; /* unchanged, non-empty "log file" names */
- else if (lp_syslog_facility(-1) != lp_syslog_facility(module_id))
+ else if (lp_syslog_facility(-1) != lp_syslog_facility(module_id)
+ || strcmp(lp_syslog_tag(-1), lp_syslog_tag(module_id)) != 0)
closelog();
else
return; /* unchanged syslog settings */
syslog_init();
}
+/* Note that this close & reopen idiom intentionally ignores syslog logging. */
void logfile_close(void)
{
if (logfile_fp) {
case FCLIENT:
break;
default:
- fprintf(stderr, "Unknown logcode in rwrite(): %d\n", (int)code);
+ fprintf(stderr, "Unknown logcode in rwrite(): %d [%s]\n", (int)code, who_am_i());
exit_cleanup(RERR_MESSAGEIO);
}
}
break;
case 'p':
- strlcat(fmt, "ld", sizeof fmt);
- snprintf(buf2, sizeof buf2, fmt,
- (long)getpid());
+ strlcat(fmt, "d", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt, (int)getpid());
n = buf2;
break;
case 'M':
n = auth_user;
break;
case 'b':
- if (!(iflags & ITEM_TRANSFER))
- b = 0;
- else if (am_sender)
- b = total_data_written - initial_data_written;
- else
- b = total_data_read - initial_data_read;
- strlcat(fmt, "s", sizeof fmt);
- snprintf(buf2, sizeof buf2, fmt,
- do_big_num(b, humanize, NULL));
- n = buf2;
- break;
case 'c':
if (!(iflags & ITEM_TRANSFER))
b = 0;
- else if (!am_sender)
+ else if ((!!am_sender) ^ (*p == 'c'))
b = total_data_written - initial_data_written;
else
b = total_data_read - initial_data_read;
n = buf2;
break;
case 'C':
- if (protocol_version >= 30
- && (iflags & ITEM_TRANSFER
- || (always_checksum && S_ISREG(file->mode)))) {
- int i, x1, x2;
- const char *sum = iflags & ITEM_TRANSFER
- ? sender_file_sum : F_SUM(file);
- c = buf2 + checksum_len*2;
- *c = '\0';
- for (i = checksum_len; --i >= 0; ) {
- x1 = CVAL(sum, i);
- x2 = x1 >> 4;
- x1 &= 0xF;
- *--c = x1 <= 9 ? x1 + '0' : x1 + 'a' - 10;
- *--c = x2 <= 9 ? x2 + '0' : x2 + 'a' - 10;
- }
- } else {
- memset(buf2, ' ', checksum_len*2);
- buf2[checksum_len*2] = '\0';
+ n = NULL;
+ if (S_ISREG(file->mode)) {
+ if (always_checksum && canonical_checksum(checksum_type))
+ n = sum_as_hex(checksum_type, F_SUM(file), 1);
+ else if (iflags & ITEM_TRANSFER && canonical_checksum(xfersum_type))
+ n = sum_as_hex(xfersum_type, sender_file_sum, 0);
+ }
+ if (!n) {
+ int sum_len = csum_len_for_type(always_checksum ? checksum_type : xfersum_type,
+ always_checksum);
+ memset(buf2, ' ', sum_len*2);
+ buf2[sum_len*2] = '\0';
+ n = buf2;
}
- n = buf2;
break;
case 'i':
if (iflags & ITEM_DELETED) {
return 0;
for (p = format; (p = strchr(p, '%')) != NULL; ) {
- for (p++; *p == '\''; p++) {}
+ for (p++; *p == '\''; p++) {} /*SHARED ITERATOR*/
if (*p == '-')
p++;
while (isDigit(p))
static struct {
union file_extras ex[4]; /* just in case... */
struct file_struct file;
- } x;
+ } x; /* Zero-initialized due to static declaration. */
int len = strlen(fname);
const char *fmt;
x.file.mode = mode;
- if (!INFO_GTE(DEL, 1) && !stdout_format)
- ;
- else if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
+ if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
if (S_ISDIR(mode))
len++; /* directories include trailing null */
send_msg(MSG_DELETED, fname, len, am_generator);
- } else {
+ } else if (!INFO_GTE(DEL, 1) && !stdout_format)
+ ;
+ else {
fmt = stdout_format_has_o_or_i ? stdout_format : "deleting %n";
log_formatted(FCLIENT, fmt, "del.", &x.file, fname, ITEM_DELETED, NULL);
}
{
if (code == 0) {
rprintf(FLOG,"sent %s bytes received %s bytes total size %s\n",
- comma_num(stats.total_written),
- comma_num(stats.total_read),
- comma_num(stats.total_size));
+ big_num(stats.total_written),
+ big_num(stats.total_read),
+ big_num(stats.total_size));
} else if (am_server != 2) {
const char *name;