X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flog.c;h=4f57821da3a97ca91efe17302be7c9fbb4333a63;hp=a2a648a93cc8939f55ea93ed53c939b75cd067c6;hb=609518c1d2abb511bd1fce447a1aa369e92a0bdb;hpb=f41c094c9fb6760b27996aacfe1e66f2f2f415cb diff --git a/src/log.c b/src/log.c index a2a648a93..4f57821da 100644 --- a/src/log.c +++ b/src/log.c @@ -45,7 +45,7 @@ static bool syslog_is_stream = false; static bool show_color = false; static bool show_location = false; -/* Akin to glibc's __abort_msg; which is private and we hance cannot +/* Akin to glibc's __abort_msg; which is private and we hence cannot * use here. */ static char *log_abort_msg = NULL; @@ -74,7 +74,7 @@ static int log_open_console(void) { return console_fd; } - log_debug("Succesfully opened /dev/console for logging."); + log_debug("Successfully opened /dev/console for logging."); } else console_fd = STDERR_FILENO; @@ -100,7 +100,7 @@ static int log_open_kmsg(void) { return -errno; } - log_debug("Succesfully opened /dev/kmsg for logging."); + log_debug("Successfully opened /dev/kmsg for logging."); return 0; } @@ -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; @@ -171,7 +174,7 @@ static int log_open_syslog(void) { } else syslog_is_stream = false; - log_debug("Succesfully opened syslog for logging."); + log_debug("Successfully opened syslog for logging."); return 0; @@ -231,6 +234,16 @@ void log_set_target(LogTarget target) { log_target = target; } +void log_close(void) { + log_close_console(); + log_close_kmsg(); + 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); @@ -238,11 +251,11 @@ void log_set_max_level(int level) { } static int write_to_console( - int level, - const char*file, - int line, - const char *func, - const char *buffer) { + int level, + const char*file, + int line, + const char *func, + const char *buffer) { char location[64]; struct iovec iovec[5]; @@ -289,7 +302,7 @@ static int write_to_syslog( if (syslog_fd < 0) return 0; - snprintf(header_priority, sizeof(header_priority), "<%i>", LOG_MAKEPRI(LOG_DAEMON, LOG_PRI(level))); + snprintf(header_priority, sizeof(header_priority), "<%i>", level); char_array_0(header_priority); t = (time_t) (now(CLOCK_REALTIME) / USEC_PER_SEC); @@ -320,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 || @@ -346,7 +360,7 @@ static int write_to_kmsg( if (kmsg_fd < 0) return 0; - snprintf(header_priority, sizeof(header_priority), "<%i>", LOG_PRI(level)); + snprintf(header_priority, sizeof(header_priority), "<%i>", level); char_array_0(header_priority); snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) getpid()); @@ -377,6 +391,10 @@ static int log_dispatch( if (log_target == LOG_TARGET_NULL) return 0; + /* Patch in LOG_DAEMON facility if necessary */ + if ((level & LOG_FACMASK) == 0) + level = LOG_DAEMON | LOG_PRI(level); + do { char *e; int k = 0; @@ -393,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++; @@ -405,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);