af3226926061c4260b803b110e9e5fba14545ffd
[staging/windowmanager.git] / src / util.c
1 #include "util.h"
2
3 #include <errno.h>
4 #include <stdarg.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <time.h>
8
9 struct strftime_cache {
10    time_t time;
11    char buf[128];
12 };
13
14 static void log_(char const *log_type, FILE *stream, char const *fmt,
15                  va_list args) {
16    static struct strftime_cache strft;
17
18    time_t t = time(NULL);
19    if (t != strft.time) {
20       strft.time = t;
21       struct tm tm;
22       struct tm *tmp = localtime_r(&t, &tm);
23       strftime(strft.buf, sizeof(strft.buf), "%Y-%m-%dT%H:%M:%S", tmp);
24    }
25
26    fputs(program_invocation_short_name, stream);
27    fputs("  ", stream);
28    fputs(strft.buf, stream);
29    fputs("  ", stream);
30    fputs(log_type, stream);
31    fputs("  ", stream);
32    vfprintf(stream, fmt, args);
33    fputs("\n", stream);
34 }
35
36 void lognotice(char const *fmt, ...) {
37    va_list a;
38    va_start(a, fmt);
39    log_("notice", stdout, fmt, a);
40    va_end(a);
41 }
42
43 void logerror(char const *fmt, ...) {
44    va_list a;
45    va_start(a, fmt);
46    log_("error", stderr, fmt, a);
47    va_end(a);
48 }
49
50 void fatal(char const *fmt, ...) {
51    va_list a;
52    va_start(a, fmt);
53    log_("fatal", stderr, fmt, a);
54    va_end(a);
55    abort();
56 }
57
58 #ifdef DEBUG_OUTPUT
59 void logdebug(char const *fmt, ...) {
60    va_list a;
61    va_start(a, fmt);
62    log_("debug", stdout, fmt, a);
63    va_end(a);
64 }
65 #endif