-/* $Cambridge: exim/src/src/log.c,v 1.2 2005/01/04 10:00:42 ph10 Exp $ */
+/* $Cambridge: exim/src/src/log.c,v 1.5 2005/06/27 14:29:43 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
if (*fd >= 0)
{
- fcntl(*fd, F_SETFD, fcntl(*fd, F_GETFD) | FD_CLOEXEC);
+ (void)fcntl(*fd, F_SETFD, fcntl(*fd, F_GETFD) | FD_CLOEXEC);
return;
}
/* Open was not successful: try creating the file. If this is a root process,
we must do the creating in a subprocess set to exim:exim in order to ensure
that the file is created with the right ownership. Otherwise, there can be a
-race if an exim process is trying to write to the log at the same time. The use
-of SIGUSR1 by the exiwhat utility can provoke a lot of simultaneous writing. */
+race if another Exim process is trying to write to the log at the same time.
+The use of SIGUSR1 by the exiwhat utility can provoke a lot of simultaneous
+writing. */
euid = geteuid();
_exit((create_log(buffer) < 0)? 1 : 0);
}
- /* Wait for the subprocess. If it succeeded retry the open. */
+ /* If we created a subprocess, wait for it. If it succeeded retry the open. */
- while (waitpid(pid, &status, 0) != pid);
- if (status == 0) *fd = Uopen(buffer, O_APPEND|O_WRONLY, LOG_MODE);
+ if (pid > 0)
+ {
+ while (waitpid(pid, &status, 0) != pid);
+ if (status == 0) *fd = Uopen(buffer, O_APPEND|O_WRONLY, LOG_MODE);
+ }
+
+ /* If we failed to create a subprocess, we are in a bad way. We fall through
+ with *fd still < 0, and errno set, letting the code below handle the error. */
}
/* If we now have an open file, set the close-on-exec flag and return. */
if (*fd >= 0)
{
- fcntl(*fd, F_SETFD, fcntl(*fd, F_GETFD) | FD_CLOEXEC);
+ (void)fcntl(*fd, F_SETFD, fcntl(*fd, F_GETFD) | FD_CLOEXEC);
return;
}
uschar *nowstamp = tod_stamp(tod_log_datestamp);
if (Ustrncmp (mainlog_datestamp, nowstamp, Ustrlen(nowstamp)) != 0)
{
- close(mainlogfd); /* Close the file */
+ (void)close(mainlogfd); /* Close the file */
mainlogfd = -1; /* Clear the file descriptor */
mainlog_inode = 0; /* Unset the inode */
mainlog_datestamp = NULL; /* Clear the datestamp */
{
if (Ustat(mainlog_name, &statbuf) < 0 || statbuf.st_ino != mainlog_inode)
{
- close(mainlogfd);
+ (void)close(mainlogfd);
mainlogfd = -1;
mainlog_inode = 0;
}
uschar *nowstamp = tod_stamp(tod_log_datestamp);
if (Ustrncmp (rejectlog_datestamp, nowstamp, Ustrlen(nowstamp)) != 0)
{
- close(rejectlogfd); /* Close the file */
+ (void)close(rejectlogfd); /* Close the file */
rejectlogfd = -1; /* Clear the file descriptor */
rejectlog_inode = 0; /* Unset the inode */
rejectlog_datestamp = NULL; /* Clear the datestamp */
if (Ustat(rejectlog_name, &statbuf) < 0 ||
statbuf.st_ino != rejectlog_inode)
{
- close(rejectlogfd);
+ (void)close(rejectlogfd);
rejectlogfd = -1;
rejectlog_inode = 0;
}
flags |= LOG_PANIC_DIE;
}
- close(paniclogfd);
+ (void)close(paniclogfd);
}
/* Give up if the DIE flag is set */
log_close_all(void)
{
if (mainlogfd >= 0)
- { close(mainlogfd); mainlogfd = -1; }
+ { (void)close(mainlogfd); mainlogfd = -1; }
if (rejectlogfd >= 0)
- { close(rejectlogfd); rejectlogfd = -1; }
+ { (void)close(rejectlogfd); rejectlogfd = -1; }
closelog();
syslog_open = FALSE;
}