summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhil Pennock <pdp@exim.org>2011-11-13 23:51:43 -0500
committerPhil Pennock <pdp@exim.org>2011-11-13 23:51:43 -0500
commit23ecb73de01ae47e2282790a75c7e07114bd5702 (patch)
treef870be7792daa57c0e148e7f2882133343478484 /src
parentc6fa5dfa8280de53bfbfd4921bc8bb5945dd5f19 (diff)
log_write EINTR handling on write()
Diffstat (limited to 'src')
-rw-r--r--src/src/log.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/src/log.c b/src/src/log.c
index a3ec18d9f..2be1ff25d 100644
--- a/src/src/log.c
+++ b/src/src/log.c
@@ -480,6 +480,11 @@ log, which can happen if a disk gets full or a file gets too large or whatever.
We try to save the relevant message in the panic_save buffer before crashing
out.
+The potential invoker should probably not call us for EINTR -1 writes. But
+otherwise, short writes are bad as we don't do non-blocking writes to fds
+subject to flow control. (If we do, that's new and the logic of this should
+be reconsidered).
+
Arguments:
name the name of the log being written
length the string length being written
@@ -571,6 +576,7 @@ log_write(unsigned int selector, int flags, const char *format, ...)
uschar *ptr;
int length, rc;
int paniclogfd;
+ssize_t written_len;
va_list ap;
/* If panic_recurseflag is set, we have failed to open the panic log. This is
@@ -886,9 +892,14 @@ if ((flags & LOG_MAIN) != 0 &&
/* Failing to write to the log is disastrous */
- if ((rc = write(mainlogfd, log_buffer, length)) != length)
+ while (
+ ((written_len = write(mainlogfd, log_buffer, length)) == (ssize_t)-1)
+ &&
+ (errno == EINTR)
+ ) /**/;
+ if (written_len != length)
{
- log_write_failed(US"main log", length, rc);
+ log_write_failed(US"main log", length, written_len);
/* That function does not return */
}
}