From 23ecb73de01ae47e2282790a75c7e07114bd5702 Mon Sep 17 00:00:00 2001 From: Phil Pennock Date: Sun, 13 Nov 2011 23:51:43 -0500 Subject: [PATCH] log_write EINTR handling on write() --- src/src/log.c | 15 +++++++++++++-- 1 file 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 */ } } -- 2.25.1