From f24f76fc80d75f79d27de880a372aa6354b303a4 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 30 Jun 2025 07:40:50 +0200 Subject: [PATCH] logit: parse leading in log messages Add support for systemd daemon log style. Signed-off-by: Joachim Wiberg --- src/logit.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/src/logit.c b/src/logit.c index 03ff23e7..8ebdd21f 100644 --- a/src/logit.c +++ b/src/logit.c @@ -90,15 +90,51 @@ reopen: return fclose(fp); } -static int logit(int level, char *buf, size_t len) +/* + * Parse possible systemd style log prefix from message + * For details, see libsystemd/sd-daemon.h + * + * Returns the level, and updates buf to point past the prefix + */ +static int parse_level(char **buf, int default_level) { - if (buf[0]) { - syslog(level, "%s", buf); - return 0; + char *msg = *buf; + + if (msg[0] == '<' && msg[2] == '>' && msg[1] >= '0' && msg[1] <= '7') { + int level; + + switch (msg[1]) { + case '0': level = LOG_EMERG; break; + case '1': level = LOG_ALERT; break; + case '2': level = LOG_CRIT; break; + case '3': level = LOG_ERR; break; + case '4': level = LOG_WARNING; break; + case '5': level = LOG_NOTICE; break; + case '6': level = LOG_INFO; break; + case '7': level = LOG_DEBUG; break; + default: level = default_level; break; + } + + *buf = msg + 3; + return (default_level & ~LOG_PRIMASK) | level; } + return default_level; +} + +static int do_log(int level, char *msg) +{ + syslog(parse_level(&msg, level), "%s", msg); + return 0; +} + +static int logit(int level, char *buf, size_t len) +{ + if (buf[0]) + return do_log(level, buf); + while ((fgets(buf, len, stdin))) - syslog(level, "%s", buf); + do_log(level, buf); return 0; }