summaryrefslogtreecommitdiffstats
path: root/src/util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.cpp')
-rw-r--r--src/util.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/util.cpp b/src/util.cpp
new file mode 100644
index 0000000..1d0601a
--- /dev/null
+++ b/src/util.cpp
@@ -0,0 +1,65 @@
+#include "util.hpp"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+struct strftime_cache {
+ time_t time;
+ char buf[128];
+};
+
+static void log_(char const *log_type, FILE *stream, char const *fmt,
+ va_list args) {
+ static struct strftime_cache strft;
+
+ time_t t = time(NULL);
+ if (t != strft.time) {
+ strft.time = t;
+ struct tm tm;
+ struct tm *tmp = localtime_r(&t, &tm);
+ strftime(strft.buf, sizeof(strft.buf), "%Y-%m-%dT%H:%M:%S", tmp);
+ }
+
+ fputs(program_invocation_short_name, stream);
+ fputs(" ", stream);
+ fputs(strft.buf, stream);
+ fputs(" ", stream);
+ fputs(log_type, stream);
+ fputs(" ", stream);
+ vfprintf(stream, fmt, args);
+ fputs("\n", stream);
+}
+
+void lognotice(char const *fmt, ...) {
+ va_list a;
+ va_start(a, fmt);
+ log_("notice", stdout, fmt, a);
+ va_end(a);
+}
+
+void logerror(char const *fmt, ...) {
+ va_list a;
+ va_start(a, fmt);
+ log_("error", stderr, fmt, a);
+ va_end(a);
+}
+
+void fatal(char const *fmt, ...) {
+ va_list a;
+ va_start(a, fmt);
+ log_("fatal", stderr, fmt, a);
+ va_end(a);
+ abort();
+}
+
+#ifdef DEBUG_OUTPUT
+void logdebug(char const *fmt, ...) {
+ va_list a;
+ va_start(a, fmt);
+ log_("debug", stdout, fmt, a);
+ va_end(a);
+}
+#endif