X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/1a016bfdec2823c6d4e78a3dcc253cdfc30a10af..6608462cac742530ed6528bfb5ac7e26f43a31ea:/log.c diff --git a/log.c b/log.c index 90b287e1..04975218 100644 --- a/log.c +++ b/log.c @@ -28,6 +28,7 @@ void log_open(void) { static int initialised; int options = LOG_PID; + time_t t; if (initialised) return; initialised = 1; @@ -45,6 +46,12 @@ void log_open(void) #ifndef LOG_NDELAY syslog(LOG_INFO,"rsyncd started\n"); #endif + + /* this looks pointless, but it is needed in order for the + C library on some systems to fetch the timezone info + before the chroot */ + t = time(NULL); + localtime(&t); } @@ -56,6 +63,12 @@ void rprintf(int fd, const char *format, ...) int len; FILE *f=NULL; extern int am_daemon; + /* recursion can happen with certain fatal conditions */ + static int depth; + + if (depth) return; + + depth++; va_start(ap, format); len = vslprintf(buf, sizeof(buf)-1, format, ap); @@ -72,7 +85,11 @@ void rprintf(int fd, const char *format, ...) if (fd == FERROR) priority = LOG_WARNING; log_open(); - syslog(priority, "%s", buf); + if (!io_multiplex_write(fd, buf, strlen(buf))) { + syslog(priority, "%s", buf); + } + + depth--; return; } @@ -91,6 +108,10 @@ void rprintf(int fd, const char *format, ...) if (!f) exit_cleanup(1); if (fwrite(buf, len, 1, f) != 1) exit_cleanup(1); + + if (buf[len-1] == '\r' || buf[len-1] == '\n') fflush(f); + + depth--; } void rflush(int fd)