X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b35d0d8e9ae9c5407c9f781b545f8a66b9caa9d0..931a979904a17a28af6265b60a088824edb78fa7:/log.c diff --git a/log.c b/log.c index e79bc220..721188a7 100644 --- a/log.c +++ b/log.c @@ -27,6 +27,7 @@ */ #include "rsync.h" +static int log_initialised; static char *logfname; static FILE *logfile; static int log_error_fd = -1; @@ -51,7 +52,7 @@ struct { { RERR_SIGNAL , "received SIGUSR1 or SIGINT" }, { RERR_WAITCHILD , "some error returned by waitpid()" }, { RERR_MALLOC , "error allocating core memory buffers" }, - { RERR_PARTIAL , "partial transfer" }, + { RERR_PARTIAL , "some files could not be transferred" }, { RERR_TIMEOUT , "timeout in data send/receive" }, { RERR_CMD_FAILED , "remote shell failed" }, { RERR_CMD_KILLED , "remote shell killed" }, @@ -146,12 +147,11 @@ static void logit(int priority, char *buf) void log_init(void) { - static int initialised; int options = LOG_PID; time_t t; - if (initialised) return; - initialised = 1; + if (log_initialised) return; + log_initialised = 1; /* this looks pointless, but it is needed in order for the C library on some systems to fetch the timezone info @@ -184,7 +184,7 @@ void log_init(void) #endif } -void log_open() +void log_open(void) { if (logfname && !logfile) { extern int orig_umask; @@ -194,7 +194,7 @@ void log_open() } } -void log_close() +void log_close(void) { if (logfile) { fclose(logfile); @@ -238,16 +238,20 @@ void rwrite(enum logcode code, char *buf, int len) return; } - /* If that fails, try to pass it to the other end. - * - * io_multiplex_write can fail if we do not have a multiplexed - * connection at the moment, in which case we fall through and - * log locally instead. */ - if (am_server && io_multiplex_write(code, buf, len)) { + /* next, if we are a server but not in daemon mode, and multiplexing + * is enabled, pass it to the other side. */ + if (am_server && !am_daemon && io_multiplex_write(code, buf, len)) { return; } - if (am_daemon) { + /* otherwise, if in daemon mode and either we are not a server + * (that is, we are not running --daemon over a remote shell) or + * the log has already been initialised, log the message on this + * side because we don't want the client to see most errors for + * security reasons. We do want early messages when running daemon + * mode over a remote shell to go to the remote side; those will + * fall through to the next case. */ + if (am_daemon && (!am_server || log_initialised)) { static int depth; int priority = LOG_INFO; if (code == FERROR) priority = LOG_WARNING;