X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=log.c;h=b82018f28b509c15091642665aad038879ea1f05;hp=da1c4f61e3575505d4e0b2e6de7582239d7e8312;hb=601f6a1e820462b1df6ff632d112bef241d556b1;hpb=16801e901e87f4ca0c83ea8c09df1ab3d344129e diff --git a/log.c b/log.c index da1c4f61e..b82018f28 100644 --- a/log.c +++ b/log.c @@ -31,8 +31,6 @@ #include "util.h" #include "macro.h" -extern char * __progname; - #define SYSLOG_TIMEOUT_USEC (5*USEC_PER_SEC) #define LOG_BUFFER_MAX 1024 @@ -60,8 +58,12 @@ int log_open_kmsg(void) { if (kmsg_fd >= 0) return 0; - if ((kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) + if ((kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) { + log_info("Failed to open syslog for logging: %s", strerror(errno)); return -errno; + } + + log_info("Succesfully opened /dev/kmsg for logging."); return 0; } @@ -109,9 +111,13 @@ int log_open_syslog(void) { if (connect(syslog_fd, &sa.sa, sizeof(sa)) < 0) { r = -errno; log_close_syslog(); - return -errno; + + log_info("Failed to open syslog for logging: %s", strerror(-r)); + return r; } + log_info("Succesfully opened syslog for logging."); + return 0; } @@ -188,7 +194,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], file_name_from_path(__progname)); + IOVEC_SET_STRING(iovec[2], __progname); IOVEC_SET_STRING(iovec[3], header_pid); IOVEC_SET_STRING(iovec[4], buffer); @@ -228,7 +234,7 @@ static int write_to_kmsg( zero(iovec); IOVEC_SET_STRING(iovec[0], header_priority); - IOVEC_SET_STRING(iovec[1], file_name_from_path(__progname)); + IOVEC_SET_STRING(iovec[1], __progname); IOVEC_SET_STRING(iovec[2], header_pid); IOVEC_SET_STRING(iovec[3], buffer); IOVEC_SET_STRING(iovec[4], (char*) "\n"); @@ -274,3 +280,51 @@ void log_meta( errno = saved_errno; } + +int log_set_target_from_string(const char *e) { + LogTarget t; + + if ((t = log_target_from_string(e)) < 0) + return -EINVAL; + + log_set_target(t); + return 0; +} + +int log_set_max_level_from_string(const char *e) { + int t; + + if ((t = log_level_from_string(e)) < 0) + return -EINVAL; + + log_set_max_level(t); + return 0; +} + +void log_parse_environment(void) { + const char *e; + + if ((e = getenv("SYSTEMD_LOG_TARGET"))) + if (log_set_target_from_string(e) < 0) + log_warning("Failed to parse log target %s. Ignoring.", e); + + if ((e = getenv("SYSTEMD_LOG_LEVEL"))) + if (log_set_max_level_from_string(e) < 0) + log_warning("Failed to parse log level %s. Ignoring.", e); +} + +LogTarget log_get_target(void) { + return log_target; +} + +int log_get_max_level(void) { + return log_max_level; +} + +static const char *const log_target_table[] = { + [LOG_TARGET_CONSOLE] = "console", + [LOG_TARGET_SYSLOG] = "syslog", + [LOG_TARGET_KMSG] = "kmsg", +}; + +DEFINE_STRING_TABLE_LOOKUP(log_target, LogTarget);