#define _GNU_SOURCE /* asprintf */ #include #include #include #include #include "logging.h" /* Do we use syslog for messages or stderr? */ int logging = 0; /* Do we want to silently drop all warnings? */ int quiet = 0; /* Do we want informative messages as well as errors? */ int verbose = 0; void message(const char *prefix, const char *fmt, va_list *arglist) { int ret; char *buf, *buf2; ret = vasprintf(&buf, fmt, *arglist); if (ret >= 0) ret = asprintf(&buf2, "%s%s", prefix, buf); if (ret < 0) buf2 = "FATAL: Out of memory.\n"; if (logging) syslog(LOG_NOTICE, "%s", buf2); else fprintf(stderr, "%s", buf2); if (ret < 0) exit(1); free(buf2); free(buf); } void warn(const char *fmt, ...) { va_list arglist; va_start(arglist, fmt); if (!quiet) message("WARNING: ", fmt, &arglist); va_end(arglist); } void error(const char *fmt, ...) { va_list arglist; va_start(arglist, fmt); message("ERROR: ", fmt, &arglist); va_end(arglist); } void fatal(const char *fmt, ...) { va_list arglist; va_start(arglist, fmt); message("FATAL: ", fmt, &arglist); va_end(arglist); exit(1); } /* If we don't flush, then child processes print before we do */ void info(const char *fmt, ...) { va_list arglist; va_start(arglist, fmt); if (verbose) { vfprintf(stdout, fmt, arglist); fflush(stdout); } va_end(arglist); }