git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Update version number and copyright year.
[exim.git]
/
src
/
src
/
log.c
diff --git
a/src/src/log.c
b/src/src/log.c
index 44adcc2db6c353ae467d0cc974986f31b96343a6..2757ee0b412837db796610f2e91606a20553a4da 100644
(file)
--- a/
src/src/log.c
+++ b/
src/src/log.c
@@
-1,10
+1,10
@@
-/* $Cambridge: exim/src/src/log.c,v 1.1
2004/10/07 10:39:01
ph10 Exp $ */
+/* $Cambridge: exim/src/src/log.c,v 1.1
1 2007/01/08 10:50:18
ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 200
4
*/
+/* Copyright (c) University of Cambridge 1995 - 200
7
*/
/* See the file NOTICE for conditions of use and distribution. */
/* Functions for writing log files. The code for maintaining datestamped
/* 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
/* 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
Arguments:
priority syslog priority
@@
-72,6
+74,8
@@
write_syslog(int priority, uschar *s)
int len, pass;
int linecount = 0;
int len, pass;
int linecount = 0;
+if (running_in_test_harness) return;
+
if (!syslog_timestamp) s += log_timezone? 26 : 20;
len = Ustrlen(s);
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)
{
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
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();
euid = geteuid();
@@
-350,17
+355,23
@@
else if (euid == root_uid)
_exit((create_log(buffer) < 0)? 1 : 0);
}
_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)
{
}
/* 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;
}
return;
}
@@
-713,6
+724,10
@@
if (disable_logging)
return;
}
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. */
/* 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 &&
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++;
{
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)
{
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 */
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)
{
{
if (Ustat(mainlog_name, &statbuf) < 0 || statbuf.st_ino != mainlog_inode)
{
- close(mainlogfd);
+
(void)
close(mainlogfd);
mainlogfd = -1;
mainlog_inode = 0;
}
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;
{
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)
{
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 */
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)
{
if (Ustat(rejectlog_name, &statbuf) < 0 ||
statbuf.st_ino != rejectlog_inode)
{
- close(rejectlogfd);
+
(void)
close(rejectlogfd);
rejectlogfd = -1;
rejectlog_inode = 0;
}
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
/* 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 ((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)
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;
}
flags |= LOG_PANIC_DIE;
}
- close(paniclogfd);
+
(void)
close(paniclogfd);
}
/* Give up if the DIE flag is set */
}
/* Give up if the DIE flag is set */
@@
-1044,9
+1060,9
@@
void
log_close_all(void)
{
if (mainlogfd >= 0)
log_close_all(void)
{
if (mainlogfd >= 0)
- { close(mainlogfd); mainlogfd = -1; }
+ {
(void)
close(mainlogfd); mainlogfd = -1; }
if (rejectlogfd >= 0)
if (rejectlogfd >= 0)
- { close(rejectlogfd); rejectlogfd = -1; }
+ {
(void)
close(rejectlogfd); rejectlogfd = -1; }
closelog();
syslog_open = FALSE;
}
closelog();
syslog_open = FALSE;
}