discover/grub2: Allow to separate the --id argument using a space char
[petitboot] / lib / log / log.c
index ecbd7142d2e5c14ce1f5847d2bb93a6e467790df..7f14232443fd1538dc8454711b7a69f50b19c950 100644 (file)
 
 
+#include <assert.h>
 #include <stdarg.h>
 #include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
 
 #include "log.h"
 
 static FILE *logf;
 
 #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;
 
 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 : stderr;
+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);
+       __log_timestamp();
+       __log(fmt, ap);
+       va_end(ap);
+}
+
+void _pb_debug_fn(const char *func, const char *fmt, ...)
+{
+       va_list ap;
+       if (!debug)
+               return;
+       pb_log("%s: ", func);
        va_start(ap, fmt);
        va_start(ap, fmt);
-       vfprintf(stream, fmt, ap);
+       __log(fmt, ap);
        va_end(ap);
        va_end(ap);
+}
+
+void _pb_debug_fl(const char *func, int line, const char *fmt, ...)
+{
+       va_list ap;
+       if (!debug)
+               return;
+       pb_log("%s:%d: ", func, line);
+       va_start(ap, fmt);
+       __log(fmt, ap);
+       va_end(ap);
+}
 
 
-       if (always_flush)
-               fflush(stream);
+void __pb_log_init(FILE *fp, bool _debug)
+{
+       if (logf)
+               fflush(logf);
+       logf = fp;
+       debug = _debug;
 }
 
 }
 
-void pb_log_set_stream(FILE *stream)
+void pb_log_set_debug(bool _debug)
 {
 {
-       fflush(logf ? logf : stderr);
-       logf = stream;
+       debug = _debug;
 }
 
 }
 
-FILE * pb_log_get_stream(void)
+bool pb_log_get_debug(void)
 {
 {
-       return logf ? logf : stderr;
+       return 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;
 }
 }