X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flog.c;h=3dfe65432b2b5288f0723c75faabc7be50ce51fe;hb=bd1a69818042e85e24ec3adaf5eb3ac30ab1d9fd;hp=5c5b734f2f83c96a9bf7cb18cfdf89e630dbea0e;hpb=4d8a7798e7f12c6400495cbc4d0ad57ed20ce90a;p=elogind.git diff --git a/src/log.c b/src/log.c index 5c5b734f2..3dfe65432 100644 --- a/src/log.c +++ b/src/log.c @@ -95,7 +95,8 @@ static int log_open_kmsg(void) { if (kmsg_fd >= 0) return 0; - if ((kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) { + kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC); + if (kmsg_fd < 0) { log_error("Failed to open /dev/kmsg for logging: %s", strerror(errno)); return -errno; } @@ -118,6 +119,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; @@ -262,14 +266,16 @@ static int write_to_console( if (console_fd < 0) return 0; - snprintf(location, sizeof(location), "(%s:%u) ", file, line); - char_array_0(location); - highlight = LOG_PRI(level) <= LOG_ERR && show_color; zero(iovec); - if (show_location) + + if (show_location) { + snprintf(location, sizeof(location), "(%s:%u) ", file, line); + char_array_0(location); IOVEC_SET_STRING(iovec[n++], location); + } + if (highlight) IOVEC_SET_STRING(iovec[n++], ANSI_HIGHLIGHT_ON); IOVEC_SET_STRING(iovec[n++], buffer); @@ -330,7 +336,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 || @@ -407,8 +414,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++; @@ -419,16 +428,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);