From ec52a6a240ad98d0ef099e7f83734614ec3f2801 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Sat, 1 Jul 2017 22:23:53 +0200 Subject: [PATCH] Set correct syslog() log level based on debug flag Also, refactor logging to /dev/kmsg to separate function. Signed-off-by: Joachim Nilsson --- src/log.c | 65 ++++++++++++++++++++++++++++++------------------------- src/log.h | 8 +++---- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/log.c b/src/log.c index d88ba85c..3372cf0c 100644 --- a/src/log.c +++ b/src/log.c @@ -29,6 +29,7 @@ #include "finit.h" #include "log.h" +static int loglevel = LOG_NOTICE; void log_toggle_debug(void) { @@ -37,7 +38,26 @@ void log_toggle_debug(void) silent = 0; else silent = quiet ? 1 : SILENT_MODE; - logit(LOG_INFO, "Debug mode %s", debug ? "enabled" : "disabled"); + + logit(LOG_NOTICE, "Debug mode %s", debug ? "enabled" : "disabled"); +} + +static void early_logit(int prio, const char *fmt, va_list ap) +{ + FILE *fp; + + fp = fopen("/dev/kmsg", "w"); + if (fp) { + if (debug) + prio = LOG_ERR; + + fprintf(fp, "<%d>finit[1]:", LOG_DAEMON | prio); + vfprintf(fp, fmt, ap); + fclose(fp); + } else { + if (debug || prio <= LOG_ERR) + vfprintf(stderr, fmt, ap); + } } /* @@ -46,37 +66,24 @@ void log_toggle_debug(void) */ void logit(int prio, const char *fmt, ...) { - va_list ap; - static int _slup = 0; + va_list ap; + static int up = 0; - va_start(ap, fmt); - if (!_slup && !fexist("/dev/log")) { - FILE *fp; + va_start(ap, fmt); + if (!up) { + if (!fexist("/dev/log")) { + early_logit(prio, fmt, ap); + goto done; + } - fp = fopen("/dev/kmsg", "w"); - if (fp) { - if (debug) - prio = LOG_ERR; + openlog("finit", LOG_PID, LOG_DAEMON); + setlogmask(LOG_UPTO(loglevel)); + up = 1; + } - fprintf(fp, "<%d>finit[1]:", LOG_DAEMON | prio); - vfprintf(fp, fmt, ap); - fclose(fp); - } else { - fprintf(stderr, "Failed opening /dev/kmsg for appending ...\n"); - if (debug || prio <= LOG_ERR) - vfprintf(stderr, fmt, ap); - } - va_end(ap); - return; - } - - if (!_slup) { - openlog("finit", LOG_PID, LOG_DAEMON); - _slup = 1; - } - - vsyslog(prio, fmt, ap); - va_end(ap); + vsyslog(prio, fmt, ap); +done: + va_end(ap); } /** diff --git a/src/log.h b/src/log.h index aa3aebd8..1bfaaa25 100644 --- a/src/log.h +++ b/src/log.h @@ -35,10 +35,10 @@ * The default log level is LOG_NOTICE. To toggle LOG_DEBUG messages, * use `initctl debug` or add `--debug` to the kernel cmdline. */ -#define _d(fmt, args...) logit(LOG_DEBUG, "%s():" fmt, __func__, ##args) -#define _w(fmt, args...) logit(LOG_WARNING, "%s():" fmt, __func__, ##args) -#define _e(fmt, args...) logit(LOG_ERR, "%s():" fmt, __func__, ##args) -#define _pe(fmt, args...) logit(LOG_ERR, "%s():" fmt ": %m", __func__, ##args) +#define _d(fmt, args...) logit(LOG_DEBUG, "%s():" fmt "\n", __func__, ##args) +#define _w(fmt, args...) logit(LOG_WARNING, "%s():" fmt "\n", __func__, ##args) +#define _e(fmt, args...) logit(LOG_ERR, "%s():" fmt "\n", __func__, ##args) +#define _pe(fmt, args...) logit(LOG_ERR, "%s():" fmt ": %m\n", __func__, ##args) void log_toggle_debug(void); void logit (int prio, const char *fmt, ...);