Make sure the log file is always opened before root privileges (if any)
authorDavid Dykstra <dwd@samba.org>
Wed, 25 Oct 2000 19:57:42 +0000 (19:57 +0000)
committerDavid Dykstra <dwd@samba.org>
Wed, 25 Oct 2000 19:57:42 +0000 (19:57 +0000)
are given up.

log.c
socket.c

diff --git a/log.c b/log.c
index 1c54a85..c19ebe8 100644 (file)
--- 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);
index a0debcd..b4d078c 100644 (file)
--- 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));
                }