From 307b4b091e0bc298964e90888bf179431e32c134 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 19 Sep 2013 12:18:56 +0800 Subject: [PATCH 1/1] lib/log: Cleanup log API Rather than exposing log internals (through always_flush and set_stream), do all logging init through pb_log_init(). If pb_log_init() hasn't been called, pb_log will drop messages. Also, add a pb_debug() function, specifically for debugging information. Signed-off-by: Jeremy Kerr --- discover/pb-discover.c | 19 ++++++++-------- lib/log/log.c | 48 ++++++++++++++++++++++++++------------- lib/log/log.h | 15 +++++++++--- test/urls/parse-url.c | 5 ---- ui/ncurses/generic-main.c | 14 ++++-------- ui/twin/main-generic.c | 15 +++++------- 6 files changed, 65 insertions(+), 51 deletions(-) diff --git a/discover/pb-discover.c b/discover/pb-discover.c index 6d62e14..c16d690 100644 --- a/discover/pb-discover.c +++ b/discover/pb-discover.c @@ -123,6 +123,7 @@ int main(int argc, char *argv[]) struct opts opts; struct pb_udev *udev; struct user_event *uev; + FILE *log; if (opts_parse(&opts, argc, argv)) { print_usage(); @@ -139,17 +140,17 @@ int main(int argc, char *argv[]) return EXIT_SUCCESS; } + log = stderr; if (strcmp(opts.log_file, "-")) { - FILE *log = fopen(opts.log_file, "a"); - - assert(log); - pb_log_set_stream(log); - } else - pb_log_set_stream(stderr); + log = fopen(opts.log_file, "a"); + if (!log) { + fprintf(stderr, "can't open log file %s, logging to " + "stderr\n", opts.log_file); + log = stderr; + } + } + pb_log_init(log); -#if defined(DEBUG) - pb_log_always_flush(1); -#endif pb_log("--- pb-discover ---\n"); /* we look for closed sockets when we write, so ignore SIGPIPE */ diff --git a/lib/log/log.c b/lib/log/log.c index ecbd714..b250a9e 100644 --- a/lib/log/log.c +++ b/lib/log/log.c @@ -1,38 +1,54 @@ +#include #include #include "log.h" static FILE *logf; -static int always_flush; +static bool debug; + +static void __log(const char *fmt, va_list ap) +{ + if (!logf) + return; + vfprintf(logf, fmt, ap); + if (debug) + fflush(logf); +} void pb_log(const char *fmt, ...) { va_list ap; - FILE *stream; - - stream = logf ? logf : stderr; - va_start(ap, fmt); - vfprintf(stream, fmt, ap); + __log(fmt, ap); va_end(ap); - - if (always_flush) - fflush(stream); } -void pb_log_set_stream(FILE *stream) +void pb_debug(const char *fmt, ...) { - fflush(logf ? logf : stderr); - logf = stream; + va_list ap; + if (!debug) + return; + va_start(ap, fmt); + __log(fmt, ap); + va_end(ap); } -FILE * pb_log_get_stream(void) +void __pb_log_init(FILE *fp, bool _debug) { - return logf ? logf : stderr; + if (logf) + fflush(logf); + logf = fp; + debug = _debug; } -void pb_log_always_flush(int state) +FILE *pb_log_get_stream(void) { - always_flush = state; + static FILE *null_stream; + if (!logf) { + if (!null_stream) + null_stream = fopen("/dev/null", "a"); + return null_stream; + } + return logf; } diff --git a/lib/log/log.h b/lib/log/log.h index 6f44bea..e34de33 100644 --- a/lib/log/log.h +++ b/lib/log/log.h @@ -1,11 +1,20 @@ #ifndef _LOG_H #define _LOG_H +#include #include void __attribute__ ((format (printf, 1, 2))) pb_log(const char *fmt, ...); -void pb_log_set_stream(FILE *stream); -FILE * pb_log_get_stream(void); -void pb_log_always_flush(int state); +void __attribute__ ((format (printf, 1, 2))) pb_debug(const char *fmt, ...); + +void __pb_log_init(FILE *stream, bool debug); + +#ifdef DEBUG +#define pb_log_init(s) __pb_log_init(s, true) +#else +#define pb_log_init(s) __pb_log_init(s, false) +#endif + +FILE *pb_log_get_stream(void); #endif /* _LOG_H */ diff --git a/test/urls/parse-url.c b/test/urls/parse-url.c index cfa6762..1688eab 100644 --- a/test/urls/parse-url.c +++ b/test/urls/parse-url.c @@ -8,17 +8,12 @@ int main(int argc, char **argv) { struct pb_url *url; - FILE *null; if (argc != 2 && argc != 3) { fprintf(stderr, "Usage: %s [update]\n", argv[0]); return EXIT_FAILURE; } - /* discard log output */ - null = fopen("/dev/null", "w"); - pb_log_set_stream(null); - url = pb_url_parse(NULL, argv[1]); if (!url) return EXIT_FAILURE; diff --git a/ui/ncurses/generic-main.c b/ui/ncurses/generic-main.c index cafd23a..9236a80 100644 --- a/ui/ncurses/generic-main.c +++ b/ui/ncurses/generic-main.c @@ -206,6 +206,7 @@ int main(int argc, char *argv[]) int result; int cui_result; struct opts opts; + FILE *log; result = opts_parse(&opts, argc, argv); @@ -224,20 +225,15 @@ int main(int argc, char *argv[]) return EXIT_SUCCESS; } + log = stderr; if (strcmp(opts.log_file, "-")) { - FILE *log = fopen(opts.log_file, "a"); + log = fopen(opts.log_file, "a"); if (!log) log = fopen("/dev/null", "a"); + } - assert(log); - pb_log_set_stream(log); - } else - pb_log_set_stream(stderr); - -#if defined(DEBUG) - pb_log_always_flush(1); -#endif + pb_log_init(log); pb_log("--- petitboot-nc ---\n"); diff --git a/ui/twin/main-generic.c b/ui/twin/main-generic.c index 99520d0..649ad00 100644 --- a/ui/twin/main-generic.c +++ b/ui/twin/main-generic.c @@ -268,6 +268,7 @@ int main(int argc, char *argv[]) int result; int ui_result; struct pbt_client *client; + FILE *log; result = pbt_opts_parse(&opts, argc, argv); @@ -286,17 +287,13 @@ int main(int argc, char *argv[]) return EXIT_SUCCESS; } + log = stderr; if (strcmp(opts.log_file, "-")) { FILE *log = fopen(opts.log_file, "a"); - - assert(log); - pb_log_set_stream(log); - } else - pb_log_set_stream(stderr); - -#if defined(DEBUG) - pb_log_always_flush(1); -#endif + if (!log) + log = stderr; + } + pb_log_init(log); pb_log("--- petitboot-twin ---\n"); -- 2.39.2