X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flog.c;h=b7173eb550bf080d14d9b7c275fe80142ff9ff32;hp=5d17955e7ebbd9ddb25a933b8faebac4192bb9fe;hb=4a2a8b5a82325494f5daf4c66c23fdb4f906c9e6;hpb=e99e38bbdcca3fe5956823bdb3d38544ccf93221 diff --git a/src/log.c b/src/log.c index 5d17955e7..b7173eb55 100644 --- a/src/log.c +++ b/src/log.c @@ -50,8 +50,10 @@ void log_close_console(void) { if (console_fd < 0) return; - if (getpid() == 1 || console_fd != STDERR_FILENO) { - close_nointr_nofail(console_fd); + if (getpid() == 1) { + if (console_fd >= 3) + close_nointr_nofail(console_fd); + console_fd = -1; } } @@ -160,6 +162,12 @@ int log_open(void) { * the fs. If we don't use /dev/kmsg we still keep it open, * because there is no reason to close it. */ + if (log_target == LOG_TARGET_NULL) { + log_close_syslog(); + log_close_console(); + return 0; + } + if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_SYSLOG) if ((r = log_open_syslog()) >= 0) { @@ -259,7 +267,7 @@ static int write_to_syslog( zero(iovec); IOVEC_SET_STRING(iovec[0], header_priority); IOVEC_SET_STRING(iovec[1], header_time); - IOVEC_SET_STRING(iovec[2], __progname); + IOVEC_SET_STRING(iovec[2], program_invocation_short_name); IOVEC_SET_STRING(iovec[3], header_pid); IOVEC_SET_STRING(iovec[4], buffer); @@ -294,7 +302,7 @@ static int write_to_kmsg( zero(iovec); IOVEC_SET_STRING(iovec[0], header_priority); - IOVEC_SET_STRING(iovec[1], __progname); + IOVEC_SET_STRING(iovec[1], program_invocation_short_name); IOVEC_SET_STRING(iovec[2], header_pid); IOVEC_SET_STRING(iovec[3], buffer); IOVEC_SET_STRING(iovec[4], "\n"); @@ -310,31 +318,73 @@ static int log_dispatch( const char*file, int line, const char *func, - const char *buffer) { + char *buffer) { - int r; + int r = 0; - if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || - log_target == LOG_TARGET_SYSLOG) { + if (log_target == LOG_TARGET_NULL) + return 0; - if ((r = write_to_syslog(level, file, line, func, buffer)) < 0) { - log_close_syslog(); - log_open_kmsg(); - } else if (r > 0) - return r; - } + do { + char *e; + int k; - if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || - log_target == LOG_TARGET_KMSG) { + buffer += strspn(buffer, NEWLINE); - if ((r = write_to_kmsg(level, file, line, func, buffer)) < 0) { - log_close_kmsg(); - log_open_console(); - } else if (r > 0) - return r; - } + if (buffer[0] == 0) + break; + + if ((e = strpbrk(buffer, NEWLINE))) + *(e++) = 0; + + if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || + log_target == LOG_TARGET_SYSLOG) { + + if ((r = write_to_syslog(level, file, line, func, buffer)) < 0) { + log_close_syslog(); + log_open_kmsg(); + } else if (r > 0) + r++; + } + + if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || + log_target == LOG_TARGET_KMSG) { + + if ((r = write_to_kmsg(level, file, line, func, buffer)) < 0) { + log_close_kmsg(); + log_open_console(); + } else if (r > 0) + r++; + } + + if ((k = write_to_console(level, file, line, func, buffer)) < 0) + return k; + + buffer = e; + } while (buffer); + + return r; +} + +int log_dump_internal( + int level, + const char*file, + int line, + const char *func, + char *buffer) { - return write_to_console(level, file, line, func, buffer); + int saved_errno, r; + + /* This modifies the buffer... */ + + if (_likely_(LOG_PRI(level) > log_max_level)) + return 0; + + saved_errno = errno; + r = log_dispatch(level, file, line, func, buffer); + errno = saved_errno; + + return r; } int log_meta( @@ -348,7 +398,7 @@ int log_meta( int saved_errno, r; va_list ap; - if (_likely(LOG_PRI(level) > log_max_level)) + if (_likely_(LOG_PRI(level) > log_max_level)) return 0; saved_errno = errno; @@ -434,6 +484,7 @@ static const char *const log_target_table[] = { [LOG_TARGET_SYSLOG] = "syslog", [LOG_TARGET_KMSG] = "kmsg", [LOG_TARGET_SYSLOG_OR_KMSG] = "syslog-or-kmsg", + [LOG_TARGET_NULL] = "null" }; DEFINE_STRING_TABLE_LOOKUP(log_target, LogTarget);