X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flog.c;h=4f57821da3a97ca91efe17302be7c9fbb4333a63;hb=4f3656e1cec7fe3d7d3537e23a406cb88d734502;hp=b8ce122f3d338bead2af6c904899f4fa9568fcad;hpb=871e580949b1417058da7f7e9fa0380d308ef708;p=elogind.git diff --git a/src/log.c b/src/log.c index b8ce122f3..4f57821da 100644 --- a/src/log.c +++ b/src/log.c @@ -118,6 +118,9 @@ static int create_log_socket(int type) { struct timeval tv; int fd; + if (getpid() == 1) + /* systemd should not block on syslog */ + type |= SOCK_NONBLOCK; if ((fd = socket(AF_UNIX, type|SOCK_CLOEXEC, 0)) < 0) return -errno; @@ -237,6 +240,10 @@ void log_close(void) { log_close_syslog(); } +void log_forget_fds(void) { + console_fd = kmsg_fd = syslog_fd = -1; +} + void log_set_max_level(int level) { assert((level & LOG_PRIMASK) == level); @@ -326,7 +333,8 @@ static int write_to_syslog( for (;;) { ssize_t n; - if ((n = sendmsg(syslog_fd, &msghdr, MSG_NOSIGNAL)) < 0) + n = sendmsg(syslog_fd, &msghdr, MSG_NOSIGNAL); + if (n < 0) return -errno; if (!syslog_is_stream || @@ -403,8 +411,10 @@ static int log_dispatch( log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_SYSLOG) { - if ((k = write_to_syslog(level, file, line, func, buffer)) < 0) { - log_close_syslog(); + k = write_to_syslog(level, file, line, func, buffer); + if (k < 0) { + if (k != -EAGAIN) + log_close_syslog(); log_open_kmsg(); } else if (k > 0) r++; @@ -415,16 +425,19 @@ static int log_dispatch( log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_KMSG)) { - if ((k = write_to_kmsg(level, file, line, func, buffer)) < 0) { + k = write_to_kmsg(level, file, line, func, buffer); + if (k < 0) { log_close_kmsg(); log_open_console(); } else if (k > 0) r++; } - if (k <= 0 && - (k = write_to_console(level, file, line, func, buffer)) < 0) - return k; + if (k <= 0) { + k = write_to_console(level, file, line, func, buffer); + if (k < 0) + return k; + } buffer = e; } while (buffer);