From 41277ed5ee97b992122e8e42508669c2f50ba569 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 1 May 2016 13:39:25 +0200 Subject: [PATCH] prove that logging is broken (new test segfaults) --- src/util/log.c | 20 ++++++++++++++++++-- src/util/log.h | 3 ++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/util/log.c b/src/util/log.c index 958e26e2f..b5a8ef9fd 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -35,18 +35,34 @@ typedef struct logger { void(*log)(void *data, int level, const char *module, const char *format, va_list args); void *data; int flags; + int id; struct logger *next; } logger; static logger *loggers; +static int log_id; -void log_create(int flags, void *data, log_fun call) { +int log_create(int flags, void *data, log_fun call) { logger *lgr = malloc(sizeof(logger)); lgr->log = call; lgr->flags = flags; lgr->data = data; lgr->next = loggers; loggers = lgr; + return lgr->id = ++log_id; +} + +void log_destroy(int id) { + logger ** lp = &loggers; + while (*lp) { + logger *lg = *lp; + if (lg->id==id) { + *lp = lg->next; + free(lg); + break; + } + lp = &lg->next; + } } #define MAXLENGTH 4096 /* because I am lazy, CP437 output is limited to this many chars */ @@ -138,7 +154,6 @@ static void _log_write(FILE * stream, int codepage, const char *format, va_list if (codepage) { char buffer[MAXLENGTH]; char converted[MAXLENGTH]; - vsnprintf(buffer, sizeof(buffer), format, args); if (cp_convert(buffer, converted, MAXLENGTH, codepage) == 0) { fputs(converted, stream); @@ -177,6 +192,7 @@ static void log_write(int flags, const char *module, const char *format, va_list int level = flags & LOG_LEVELS; if (lg->flags & level) { int dupe = 0; + if (lg->flags & LOG_BRIEF) { dupe = check_dupe(format, level); } diff --git a/src/util/log.h b/src/util/log.h index 8fd8f2a95..d19c4cf9b 100644 --- a/src/util/log.h +++ b/src/util/log.h @@ -38,7 +38,8 @@ extern "C" { typedef void(*log_fun)(void *data, int level, const char *module, const char *format, va_list args); - void log_create(int flags, void *data, log_fun call); + int log_create(int flags, void *data, log_fun call); + void log_destroy(int id); void log_to_file(int flags, FILE *out); extern int log_flags;