Commit 64c37826 authored by Wayne Davison's avatar Wayne Davison

- Changed log_open() into two functions, logfile_open() and

  logfile_reopen().
- Changed log_close() into logfile_close().
- Improved the logic in logit().
parent 2e8015e0
...@@ -44,6 +44,7 @@ extern char *auth_user; ...@@ -44,6 +44,7 @@ extern char *auth_user;
extern char *log_format; extern char *log_format;
static int log_initialised; static int log_initialised;
static int logfile_was_closed;
static char *logfname; static char *logfname;
static FILE *logfile; static FILE *logfile;
struct stats stats; struct stats stats;
...@@ -96,14 +97,9 @@ static char const *rerr_name(int code) ...@@ -96,14 +97,9 @@ static char const *rerr_name(int code)
static void logit(int priority, char *buf) static void logit(int priority, char *buf)
{ {
if (logfname) { if (logfile_was_closed)
if (!logfile) { logfile_reopen();
log_open(); if (logfile) {
if (!logfname) {
logit(priority, buf);
return;
}
}
fprintf(logfile,"%s [%d] %s", fprintf(logfile,"%s [%d] %s",
timestring(time(NULL)), (int)getpid(), buf); timestring(time(NULL)), (int)getpid(), buf);
fflush(logfile); fflush(logfile);
...@@ -136,6 +132,22 @@ static void syslog_init() ...@@ -136,6 +132,22 @@ static void syslog_init()
#endif #endif
} }
static void logfile_open(void)
{
extern int orig_umask;
int old_umask = umask(022 | orig_umask);
logfile = fopen(logfname, "a");
umask(old_umask);
if (!logfile) {
int fopen_errno = errno;
/* Rsync falls back to using syslog on failure. */
syslog_init();
rsyserr(FERROR, fopen_errno,
"failed to open log-file %s", logfname);
rprintf(FINFO, "Ignoring \"log file\" setting.\n");
}
}
void log_init(void) void log_init(void)
{ {
time_t t; time_t t;
...@@ -152,42 +164,26 @@ void log_init(void) ...@@ -152,42 +164,26 @@ void log_init(void)
/* optionally use a log file instead of syslog */ /* optionally use a log file instead of syslog */
logfname = lp_log_file(); logfname = lp_log_file();
if (logfname) { if (logfname && *logfname)
if (*logfname) { logfile_open();
log_open(); else
return; syslog_init();
}
logfname = NULL;
}
syslog_init();
} }
void log_open(void) void logfile_close(void)
{ {
if (logfname && !logfile) { if (logfile) {
extern int orig_umask; logfile_was_closed = 1;
int old_umask = umask(022 | orig_umask); fclose(logfile);
logfile = fopen(logfname, "a"); logfile = NULL;
umask(old_umask);
if (!logfile) {
char *had_logfname = logfname;
int open_errno = errno;
/* Rsync falls back to using syslog on failure. */
logfname = NULL;
syslog_init();
rsyserr(FERROR, open_errno,
"failed to open log-file %s", had_logfname);
rprintf(FINFO, "Ignoring \"log file\" setting.\n");
}
} }
} }
void log_close(void) void logfile_reopen(void)
{ {
if (logfile) { if (logfile_was_closed) {
fclose(logfile); logfile_was_closed = 0;
logfile = NULL; logfile_open();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment