From 29db583471f019ed9939a90966b3e194a9560e7e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 31 Mar 2011 19:49:04 +0200 Subject: [PATCH] log: don't strip facility when writing to kmsg --- TODO | 10 ---------- src/log.c | 8 ++++++-- src/logger.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/TODO b/TODO index 1152927ca..c1cdf1c6c 100644 --- a/TODO +++ b/TODO @@ -19,18 +19,10 @@ F15: * NM should pull in network.target, ntpd should pull in rtc-set.target. -* kernel patch wegen kmsg prio nach f15 - -* selinux issue http://people.gnome.org/~cosimoc/selinux.jpg - * fix alsa mixer restore to not print error when no config is stored -* ply should do mkdir before writing pid file - * ConditionDirectoryNotEmpty= needs to be documented -* add /etc/modules-load.d to rpm - Features: * tmpfiles should allow two identical lines @@ -40,8 +32,6 @@ Features: * document default dependencies -* LOG_DAEMON/LOG_USER für kmsg messages schreiben - * Find a way to replace /var/run, /var/lock directories with symlinks during an RPM package upgrade (filesystem.rpm or systemd.rpm). We soon want to get rid of var-run.mount var-lock.mount units. diff --git a/src/log.c b/src/log.c index b6d4bf9c1..4ec6b7388 100644 --- a/src/log.c +++ b/src/log.c @@ -289,7 +289,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); @@ -346,7 +346,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 +377,10 @@ static int log_dispatch( if (log_target == LOG_TARGET_NULL) return 0; + /* Patch in LOG_DAEMON facility if necessary */ + if (LOG_FAC(level) == 0) + level = LOG_MAKEPRI(LOG_DAEMON, LOG_PRI(level)); + do { char *e; int k = 0; diff --git a/src/logger.c b/src/logger.c index 104d7c385..710dfed33 100644 --- a/src/logger.c +++ b/src/logger.c @@ -93,6 +93,42 @@ struct Stream { LIST_FIELDS(Stream, stream); }; +static void parse_priority(char **p, int *priority) { + int a = 0, b = 0, c = 0; + int k; + + assert(p); + assert(*p); + assert(priority); + + if ((*p)[0] != '<') + return; + + if (!strchr(*p, '>')) + return; + + if ((*p)[2] == '>') { + c = undecchar((*p)[1]); + k = 3; + } else if ((*p)[3] == '>') { + b = undecchar((*p)[1]); + c = undecchar((*p)[2]); + k = 4; + } else if ((*p)[4] == '>') { + a = undecchar((*p)[1]); + b = undecchar((*p)[2]); + c = undecchar((*p)[3]); + k = 5; + } else + return; + + if (a < 0 || b < 0 || c < 0) + return; + + *priority = a*100+b*10+c; + *p += k; +} + static int stream_log(Stream *s, char *p, usec_t ts) { char header_priority[16], header_time[64], header_pid[16]; @@ -104,6 +140,9 @@ static int stream_log(Stream *s, char *p, usec_t ts) { priority = s->priority; + if (s->prefix) + parse_priority(&p, &priority); + if (s->prefix && p[0] == '<' && p[1] >= '0' && p[1] <= '7' && @@ -118,6 +157,10 @@ static int stream_log(Stream *s, char *p, usec_t ts) { if (*p == 0) return 0; + /* Patch in LOG_USER facility if necessary */ + if (LOG_FAC(priority) == 0) + priority = LOG_MAKEPRI(LOG_USER, LOG_PRI(priority)); + /* * The format glibc uses to talk to the syslog daemon is: * @@ -130,8 +173,7 @@ static int stream_log(Stream *s, char *p, usec_t ts) { * We extend the latter to include the process name and pid. */ - snprintf(header_priority, sizeof(header_priority), "<%i>", - s->target == STREAM_SYSLOG ? priority : LOG_PRI(priority)); + snprintf(header_priority, sizeof(header_priority), "<%i>", priority); char_array_0(header_priority); if (s->target == STREAM_SYSLOG) { -- 2.30.2