aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--log.c25
-rw-r--r--log.h1
2 files changed, 17 insertions, 9 deletions
diff --git a/log.c b/log.c
index fd33f64..95c4fa4 100644
--- a/log.c
+++ b/log.c
@@ -47,11 +47,10 @@ int log_to_stdout; /* Print to stdout instead of stderr */
#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;
struct timespec tp;
- va_list args;
if (setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) {
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) {
- va_start(args, format);
+ va_list ap2;
+
+ va_copy(ap2, ap); /* Don't clobber ap, we need it again */
if (log_file != -1)
- logfile_write(pri, format, args);
+ logfile_write(pri, format, ap2);
else if (!(setlogmask(0) & LOG_MASK(LOG_DEBUG)))
- passt_vsyslog(pri, format, args);
- va_end(args);
+ passt_vsyslog(pri, format, ap2);
}
if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) ||
(BEFORE_DAEMON && !(log_opt & LOG_PERROR))) {
- va_start(args, format);
- (void)vfprintf(out, format, args);
- va_end(args);
+ (void)vfprintf(out, format, ap);
if (format[strlen(format)] != '\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 */
const char *logfile_prefix[] = {
NULL, NULL, NULL, /* Unused: LOG_EMERG, LOG_ALERT, LOG_CRIT */
diff --git a/log.h b/log.h
index df72f9a..9c38182 100644
--- a/log.h
+++ b/log.h
@@ -12,6 +12,7 @@
#define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% 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, ...)
__attribute__((format(printf, 2, 3)));