Commit 15b84e14 authored by David Dykstra's avatar David Dykstra

Make sure the log file is always opened before root privileges (if any)

are given up.
parent 45a83540
......@@ -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));
}
......
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