summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Dykstra <dwd@samba.org>2000-10-25 19:57:42 +0000
committerDavid Dykstra <dwd@samba.org>2000-10-25 19:57:42 +0000
commit15b84e142a7de03abd8f9831788d66f0052daea0 (patch)
tree5e3619695d56f041a1fe84689ebfb5968259243f
parent45a8354004ecbc1c0b03d6e880b512854ed9439a (diff)
downloadrsync-15b84e142a7de03abd8f9831788d66f0052daea0.tar.gz
Make sure the log file is always opened before root privileges (if any)
are given up.
-rw-r--r--log.c26
-rw-r--r--socket.c9
2 files changed, 24 insertions, 11 deletions
diff --git a/log.c b/log.c
index 1c54a85d..c19ebe8a 100644
--- a/log.c
+++ b/log.c
@@ -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);
diff --git a/socket.c b/socket.c
index a0debcd1..b4d078cd 100644
--- a/socket.c
+++ b/socket.c
@@ -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));
}