#include "util.hpp" #include #include #include #include #include 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