diff options
author | David Dykstra <dwd@samba.org> | 2000-10-25 19:57:42 +0000 |
---|---|---|
committer | David Dykstra <dwd@samba.org> | 2000-10-25 19:57:42 +0000 |
commit | 15b84e142a7de03abd8f9831788d66f0052daea0 (patch) | |
tree | 5e3619695d56f041a1fe84689ebfb5968259243f | |
parent | 45a8354004ecbc1c0b03d6e880b512854ed9439a (diff) | |
download | rsync-15b84e142a7de03abd8f9831788d66f0052daea0.tar.gz |
Make sure the log file is always opened before root privileges (if any)
are given up.
-rw-r--r-- | log.c | 26 | ||||
-rw-r--r-- | socket.c | 9 |
2 files changed, 24 insertions, 11 deletions
@@ -30,12 +30,8 @@ static int log_error_fd = -1; static void logit(int priority, char *buf) { if (logfname) { - if (!logfile) { - extern int orig_umask; - int old_umask = umask(022 | orig_umask); - logfile = fopen(logfname, "a"); - umask(old_umask); - } + if (!logfile) + log_open(); fprintf(logfile,"%s [%d] %s", timestring(time(NULL)), (int)getpid(), buf); fflush(logfile); @@ -62,8 +58,10 @@ void log_init(void) /* optionally use a log file instead of syslog */ logfname = lp_log_file(); if (logfname) { - if (*logfname) + if (*logfname) { + log_open(); return; + } logfname = NULL; } @@ -82,9 +80,17 @@ void log_init(void) #endif } -/* for long runs when using a log file, close it before potential long waits - so it can be trimmed by another process instead of growing forever */ -void log_release() +void log_open() +{ + if (logfname && !logfile) { + extern int orig_umask; + int old_umask = umask(022 | orig_umask); + logfile = fopen(logfname, "a"); + umask(old_umask); + } +} + +void log_close() { if (logfile) { fclose(logfile); @@ -247,7 +247,10 @@ void start_accept_loop(int port, int (*fn)(int )) struct sockaddr addr; int in_addrlen = sizeof(addr); - log_release(); + /* close log file before the potentially very long select so + file can be trimmed by another process instead of growing + forever */ + log_close(); FD_ZERO(&fds); FD_SET(s, &fds); @@ -274,6 +277,10 @@ void start_accept_loop(int port, int (*fn)(int )) if (fork()==0) { close(s); + /* open log file in child before possibly giving + up privileges */ + log_open(); + _exit(fn(fd)); } |