From b5e17105b163442a030559b7b2c2454b82b3fd4c Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sat, 28 Sep 2013 21:01:20 +0200 Subject: syslog() is a blocking call on eglibc. as procd provides the actual syslog, weneed to make sure that we do not run into a deadlock. Signed-off-by: John Crispin Signed-off-by: Markus Stenberg --- syslog.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'syslog.c') diff --git a/syslog.c b/syslog.c index 01b6e7e..dbb7a5a 100644 --- a/syslog.c +++ b/syslog.c @@ -63,6 +63,12 @@ void log_add(char *buf, int size, int source) int priority = 0; int ret; + /* bounce out if we don't have init'ed yet (regmatch etc will blow) */ + if (!log) { + fprintf(stderr, buf); + return; + } + /* strip trailing newline */ if (buf[size - 2] == '\n') { buf[size - 2] = '\0'; @@ -121,6 +127,34 @@ void log_add(char *buf, int size, int source) newest = next; } +void log_printf(char *fmt, ...) +{ + static int buffer_len = 128; + static char *buffer; + va_list ap; + int n = 0; + + do { + if (n) + buffer_len = n + 1; + if (!buffer) + buffer = malloc(buffer_len); + if (!buffer) + return; + va_start(ap, fmt); + n = vsnprintf(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + if (n < 1) + return; + if (n >= buffer_len) { + free(buffer); + buffer = NULL; + } + } while (n >= buffer_len); + + log_add(buffer, n, SOURCE_INTERNAL); +} + static void slog_cb(struct ustream *s, int bytes) { struct ustream_buf *buf = s->r.head; -- cgit v1.2.3