log: Add vlogmsg()

Currently logmsg() is only available as a variadic function.  This is fine
for normal use, but is awkward if we ever want to write wrappers around it
which (for example) add standardised prefix information.  To allow that,
add a vlogmsg() function which takes a va_list instead, and implement
logmsg() in terms of it.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-10-13 15:50:30 +11:00 committed by Stefano Brivio
parent 5972203174
commit c0426ff10b
2 changed files with 17 additions and 9 deletions

25
log.c
View file

@ -47,11 +47,10 @@ int log_to_stdout; /* Print to stdout instead of stderr */
#define BEFORE_DAEMON (setlogmask(0) == LOG_MASK(LOG_EMERG)) #define BEFORE_DAEMON (setlogmask(0) == LOG_MASK(LOG_EMERG))
void logmsg(int pri, const char *format, ...) void vlogmsg(int pri, const char *format, va_list ap)
{ {
FILE *out = log_to_stdout ? stdout : stderr; FILE *out = log_to_stdout ? stdout : stderr;
struct timespec tp; struct timespec tp;
va_list args;
if (setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) { if (setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) {
clock_gettime(CLOCK_REALTIME, &tp); clock_gettime(CLOCK_REALTIME, &tp);
@ -61,24 +60,32 @@ void logmsg(int pri, const char *format, ...)
} }
if ((LOG_MASK(LOG_PRI(pri)) & log_mask) || BEFORE_DAEMON) { if ((LOG_MASK(LOG_PRI(pri)) & log_mask) || BEFORE_DAEMON) {
va_start(args, format); va_list ap2;
va_copy(ap2, ap); /* Don't clobber ap, we need it again */
if (log_file != -1) if (log_file != -1)
logfile_write(pri, format, args); logfile_write(pri, format, ap2);
else if (!(setlogmask(0) & LOG_MASK(LOG_DEBUG))) else if (!(setlogmask(0) & LOG_MASK(LOG_DEBUG)))
passt_vsyslog(pri, format, args); passt_vsyslog(pri, format, ap2);
va_end(args);
} }
if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) || if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) ||
(BEFORE_DAEMON && !(log_opt & LOG_PERROR))) { (BEFORE_DAEMON && !(log_opt & LOG_PERROR))) {
va_start(args, format); (void)vfprintf(out, format, ap);
(void)vfprintf(out, format, args);
va_end(args);
if (format[strlen(format)] != '\n') if (format[strlen(format)] != '\n')
fprintf(out, "\n"); fprintf(out, "\n");
} }
} }
void logmsg(int pri, const char *format, ...)
{
va_list ap;
va_start(ap, format);
vlogmsg(pri, format, ap);
va_end(ap);
}
/* Prefixes for log file messages, indexed by priority */ /* Prefixes for log file messages, indexed by priority */
const char *logfile_prefix[] = { const char *logfile_prefix[] = {
NULL, NULL, NULL, /* Unused: LOG_EMERG, LOG_ALERT, LOG_CRIT */ NULL, NULL, NULL, /* Unused: LOG_EMERG, LOG_ALERT, LOG_CRIT */

1
log.h
View file

@ -12,6 +12,7 @@
#define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% size */ #define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% size */
#define LOGFILE_SIZE_MIN (5UL * MAX(BUFSIZ, PAGE_SIZE)) #define LOGFILE_SIZE_MIN (5UL * MAX(BUFSIZ, PAGE_SIZE))
void vlogmsg(int pri, const char *format, va_list ap);
void logmsg(int pri, const char *format, ...) void logmsg(int pri, const char *format, ...)
__attribute__((format(printf, 2, 3))); __attribute__((format(printf, 2, 3)));