ee4b7b6dc2dc61f19fe5846361424323c8483e62
[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 void log_(char const *log_type, FILE *stream, char const *fmt, va_list args) {
15    static struct strftime_cache strft;
16
17    time_t t = time(NULL);
18    if (t != strft.time) {
19       strft.time = t;
20       struct tm tm;
21       struct tm *tmp = localtime_r(&t, &tm);
22       strftime(strft.buf, sizeof(strft.buf), "%Y-%m-%dT%H:%M:%S", tmp);
23    }
24
25    fputs(program_invocation_short_name, stream);
26    fputs("  ", stream);
27    fputs(strft.buf, stream);
28    fputs("  ", stream);
29    fputs(log_type, stream);
30    fputs("  ", stream);
31    vfprintf(stream, fmt, args);
32    fputs("\n", stream);
33 }
34
35 void lognotice(char const *fmt, ...) {
36    va_list a;
37    va_start(a, fmt);
38    log_("notice", stdout, fmt, a);
39    va_end(a);
40 }
41
42 void logerror(char const *fmt, ...) {
43    va_list a;
44    va_start(a, fmt);
45    log_("error", stderr, fmt, a);
46    va_end(a);
47 }
48
49 void fatal(char const *fmt, ...) {
50    va_list a;
51    va_start(a, fmt);
52    log_("fatal", stderr, fmt, a);
53    va_end(a);
54    abort();
55 }