X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/c988f1f4faa9f679f79beddf3c14676c5dcb8e28..6ec97b1bb5ba11ef3febc5ba8f9bcb4365984189:/src/src/log.c diff --git a/src/src/log.c b/src/src/log.c index 0d8b3d0d6..23583ee6b 100644 --- a/src/src/log.c +++ b/src/src/log.c @@ -1,10 +1,10 @@ -/* $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.10 2006/07/07 13:36:34 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2005 */ +/* Copyright (c) University of Cambridge 1995 - 2006 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions for writing log files. The code for maintaining datestamped @@ -57,7 +57,9 @@ static uschar *file_path = US""; /* The given string is split into sections according to length, or at embedded newlines, and syslogged as a numbered sequence if it is overlong or if there is -more than one line. +more than one line. However, if we are running in the test harness, do not do +anything. (The test harness doesn't use syslog - for obvious reasons - but we +can get here if there is a failure to open the panic log.) Arguments: priority syslog priority @@ -72,6 +74,8 @@ write_syslog(int priority, uschar *s) int len, pass; int linecount = 0; +if (running_in_test_harness) return; + if (!syslog_timestamp) s += log_timezone? 26 : 20; len = Ustrlen(s); @@ -314,15 +318,16 @@ open, arrange for automatic closure on exec(), and then 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; } /* 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(); @@ -350,17 +355,23 @@ else if (euid == root_uid) _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. */ + + if (pid > 0) + { + while (waitpid(pid, &status, 0) != pid); + if (status == 0) *fd = Uopen(buffer, O_APPEND|O_WRONLY, LOG_MODE); + } - 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; } @@ -713,6 +724,10 @@ if (disable_logging) return; } +/* Handle disabled reject log */ + +if (!write_rejectlog) flags &= ~LOG_REJECT; + /* Create the main message in the log buffer, including the message id except for the process log and when called by a utility. */ @@ -734,7 +749,7 @@ va_end(ap); this way because it kind of fits with LOG_RECIPIENTS. */ if ((flags & LOG_SENDER) != 0 && - ptr < log_buffer + LOG_BUFFER_SIZE - 8 - Ustrlen(raw_sender)) + ptr < log_buffer + LOG_BUFFER_SIZE - 10 - Ustrlen(raw_sender)) { sprintf(CS ptr, " from <%s>", raw_sender); while (*ptr) ptr++; @@ -807,7 +822,7 @@ if ((flags & LOG_MAIN) != 0 && 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 */ @@ -823,7 +838,7 @@ if ((flags & LOG_MAIN) != 0 && { if (Ustat(mainlog_name, &statbuf) < 0 || statbuf.st_ino != mainlog_inode) { - close(mainlogfd); + (void)close(mainlogfd); mainlogfd = -1; mainlog_inode = 0; } @@ -847,11 +862,12 @@ if ((flags & LOG_MAIN) != 0 && } } -/* Handle the log for rejected messages. This can be globally disabled. If -there are any header lines (i.e. if the rejection is happening after the DATA -phase), log the recipients and the headers. */ +/* Handle the log for rejected messages. This can be globally disabled, in +which case the flags are altered above. If there are any header lines (i.e. if +the rejection is happening after the DATA phase), log the recipients and the +headers. */ -if (write_rejectlog && (flags & LOG_REJECT) != 0) +if ((flags & LOG_REJECT) != 0) { header_line *h; @@ -929,7 +945,7 @@ if (write_rejectlog && (flags & LOG_REJECT) != 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 */ @@ -946,7 +962,7 @@ if (write_rejectlog && (flags & LOG_REJECT) != 0) if (Ustat(rejectlog_name, &statbuf) < 0 || statbuf.st_ino != rejectlog_inode) { - close(rejectlogfd); + (void)close(rejectlogfd); rejectlogfd = -1; rejectlog_inode = 0; } @@ -990,11 +1006,11 @@ if ((flags & LOG_PROCESS) != 0) /* Handle the panic log, which is not kept open like the others. If it fails to open, there will be a recursive call to log_write(). We detect this above and attempt to write to the system log as a last-ditch try at telling somebody. In -all cases, try to write to log_stderr. */ +all cases except mua_wrapper, try to write to log_stderr. */ if ((flags & LOG_PANIC) != 0) { - if (log_stderr != NULL && log_stderr != debug_file) + if (log_stderr != NULL && log_stderr != debug_file && !mua_wrapper) fprintf(log_stderr, "%s", CS log_buffer); if ((logging_mode & LOG_MODE_SYSLOG) != 0) @@ -1024,7 +1040,7 @@ if ((flags & LOG_PANIC) != 0) flags |= LOG_PANIC_DIE; } - close(paniclogfd); + (void)close(paniclogfd); } /* Give up if the DIE flag is set */ @@ -1044,9 +1060,9 @@ void 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; }