We currently use a LOG_EMERG log mask to represent the fact that we don't know yet what the mask resulting from configuration should be, before the command line is parsed. However, we have the necessity of representing another phase as well, that is, configuration is parsed but we didn't daemonise yet, or we're not ready for operation yet. The next patch will add that notion explicitly. Mapping these cases to further log levels isn't really practical. Introduce internal log flags to represent them, instead of abusing log priorities. Signed-off-by: Stefano Brivio <sbrivio(a)redhat.com> --- conf.c | 5 ++--- log.c | 18 +++++++++++++----- log.h | 4 ++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/conf.c b/conf.c index dbdbb62..0b76da9 100644 --- a/conf.c +++ b/conf.c @@ -1701,9 +1701,6 @@ void conf(struct ctx *c, int argc, char **argv) logfile, logsize); } - /* Once the log mask is not LOG_EARLY, we will no longer log to stderr - * if there was a log file specified. - */ if (c->debug) __setlogmask(LOG_UPTO(LOG_DEBUG)); else if (c->quiet) @@ -1711,6 +1708,8 @@ void conf(struct ctx *c, int argc, char **argv) else __setlogmask(LOG_UPTO(LOG_INFO)); + log_set_flag(LOG_FLAG_CONF_PARSED); /* Stop printing everything */ + nl_sock_init(c, false); if (!v6_only) c->ifi4 = conf_ip4(ifi4, &c->ip4, c->mac); diff --git a/log.c b/log.c index aaf2beb..3b5a1c6 100644 --- a/log.c +++ b/log.c @@ -30,14 +30,13 @@ #include "util.h" #include "passt.h" -/* LOG_EARLY means we don't know yet: log everything. LOG_EMERG is unused */ -#define LOG_EARLY LOG_MASK(LOG_EMERG) - static int log_sock = -1; /* Optional socket to system logger */ static char log_ident[BUFSIZ]; /* Identifier string for openlog() */ -static int log_mask = LOG_EARLY; /* Current log priority mask */ +static int log_mask; /* Current log priority mask */ static int log_opt; /* Options for openlog() */ +static uint8_t log_flags; /* Internal, see LOG_FLAG_* in log.h */ + static int log_file = -1; /* Optional log file descriptor */ static size_t log_size; /* Maximum log file size in bytes */ static size_t log_written; /* Currently used bytes in log file */ @@ -50,7 +49,7 @@ int log_trace; /* --trace mode enabled */ void vlogmsg(int pri, const char *format, va_list ap) { bool debug_print = (log_mask & LOG_MASK(LOG_DEBUG)) && log_file == -1; - bool early_print = LOG_PRI(log_mask) == LOG_EARLY; + bool early_print = !(log_flags & LOG_FLAG_CONF_PARSED); struct timespec tp; if (debug_print) { @@ -150,6 +149,15 @@ void __setlogmask(int mask) setlogmask(mask); } +/** + * log_set_flag() - Set an internal log flag + * @flag: Flag as defined by LOG_FLAG_* in log.h + */ +void log_set_flag(uint8_t flag) +{ + log_flags |= flag; +} + /** * passt_vsyslog() - vsyslog() implementation not using heap memory * @pri: Facility and level map, same as priority for vsyslog() diff --git a/log.h b/log.h index e0aab5a..6a3224a 100644 --- a/log.h +++ b/log.h @@ -6,8 +6,11 @@ #ifndef LOG_H #define LOG_H +#include <stdint.h> #include <syslog.h> +#define LOG_FLAG_CONF_PARSED BIT(0) /* We already parsed logging options */ + #define LOGFILE_SIZE_DEFAULT (1024 * 1024UL) #define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% size */ #define LOGFILE_SIZE_MIN (5UL * MAX(BUFSIZ, PAGE_SIZE)) @@ -40,5 +43,6 @@ void logfile_init(const char *name, const char *path, size_t size); void passt_vsyslog(int pri, const char *format, va_list ap); void logfile_write(int pri, const char *format, va_list ap); void __setlogmask(int mask); +void log_set_flag(uint8_t flag); #endif /* LOG_H */ -- 2.43.0