X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=lib%2Flog%2Flog.c;h=7f14232443fd1538dc8454711b7a69f50b19c950;hb=8789ca2374c1f7fef21e393c81bc0f0dfddaacae;hp=697af6c0760ec612d328f03de59ee7be1a86b1a2;hpb=5d0a6df4644525bf5fbd9d98f3aa4a23a0c03cb4;p=petitboot diff --git a/lib/log/log.c b/lib/log/log.c index 697af6c..7f14232 100644 --- a/lib/log/log.c +++ b/lib/log/log.c @@ -1,38 +1,112 @@ +#include #include +#include +#include #include "log.h" static FILE *logf; -static int always_flush; +static bool debug; + +static void __log_timestamp(void) +{ + char hms[20] = {'\0'}; + time_t t; + + if (!logf) + return; + + t = time(NULL); + strftime(hms, sizeof(hms), "%T", localtime(&t)); + fprintf(logf, "[%s] ", hms); +} + +static void __log(const char *fmt, va_list ap) +{ + if (!logf) + return; + + vfprintf(logf, fmt, ap); + fflush(logf); +} void pb_log(const char *fmt, ...) { va_list ap; - FILE *stream; + va_start(ap, fmt); + __log_timestamp(); + __log(fmt, ap); + va_end(ap); +} - stream = logf ? logf : stdout; +void _pb_log_fn(const char *func, const char *fmt, ...) +{ + va_list ap; + pb_log("%s: ", func); + va_start(ap, fmt); + __log(fmt, ap); + va_end(ap); +} +void pb_debug(const char *fmt, ...) +{ + va_list ap; + if (!debug) + return; va_start(ap, fmt); - vfprintf(stream, fmt, ap); + __log_timestamp(); + __log(fmt, ap); va_end(ap); +} - if (always_flush) - fflush(stream); +void _pb_debug_fn(const char *func, const char *fmt, ...) +{ + va_list ap; + if (!debug) + return; + pb_log("%s: ", func); + va_start(ap, fmt); + __log(fmt, ap); + va_end(ap); } -void pb_log_set_stream(FILE *stream) +void _pb_debug_fl(const char *func, int line, const char *fmt, ...) { - fflush(logf ? logf : stdout); - logf = stream; + va_list ap; + if (!debug) + return; + pb_log("%s:%d: ", func, line); + 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; + if (logf) + fflush(logf); + logf = fp; + debug = _debug; +} + +void pb_log_set_debug(bool _debug) +{ + debug = _debug; } -void pb_log_always_flush(int state) +bool pb_log_get_debug(void) { - always_flush = state; + return debug; +} + +FILE *pb_log_get_stream(void) +{ + static FILE *null_stream; + if (!logf) { + if (!null_stream) + null_stream = fopen("/dev/null", "a"); + return null_stream; + } + return logf; }