-void openlogger(const char *ident, logmode_t mode) {
- logident = ident;
- logmode = mode;
-
- switch(mode) {
- case LOGMODE_STDERR:
- logpid = getpid();
- break;
- case LOGMODE_FILE:
- logpid = getpid();
- logfile = fopen(logfilename, "a");
- if(!logfile) {
- fprintf(stderr, "Could not open log file %s: %s\n", logfilename, strerror(errno));
- logmode = LOGMODE_NULL;
- }
- break;
- case LOGMODE_SYSLOG:
-#ifdef HAVE_MINGW
- loghandle = RegisterEventSource(NULL, logident);
- if(!loghandle) {
- fprintf(stderr, "Could not open log handle!");
- logmode = LOGMODE_NULL;
- }
- break;
-#else
-#ifdef HAVE_SYSLOG_H
- openlog(logident, LOG_CONS | LOG_PID, LOG_DAEMON);
- break;
-#endif
-#endif
- case LOGMODE_NULL:
- break;
+#define SGR(s) ("\x1b[" s "m")
+
+typedef enum color_t {
+ RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, GRAY,
+ RESET, // not really a color
+} color_t;
+
+typedef struct priority_disp_t {
+ const char *name;
+ color_t color;
+} priority_disp_t;
+
+static const priority_disp_t priorities[] = {
+ [LOG_EMERG] = {"EMERGENCY", MAGENTA},
+ [LOG_ALERT] = {"ALERT", MAGENTA},
+ [LOG_CRIT] = {"CRITICAL", MAGENTA},
+ [LOG_ERR] = {"ERROR", RED},
+ [LOG_WARNING] = {"WARNING", YELLOW},
+ [LOG_NOTICE] = {"NOTICE", CYAN},
+ [LOG_INFO] = {"INFO", GREEN},
+ [LOG_DEBUG] = {"DEBUG", BLUE},
+};
+
+static const char *ansi_codes[] = {
+ [RED] = SGR("31;1"),
+ [GREEN] = SGR("32;1"),
+ [YELLOW] = SGR("33;1"),
+ [BLUE] = SGR("34;1"),
+ [MAGENTA] = SGR("35;1"),
+ [CYAN] = SGR("36;1"),
+ [WHITE] = SGR("37;1"),
+ [GRAY] = SGR("90"),
+ [RESET] = SGR("0"),
+};
+
+static priority_disp_t get_priority(int priority) {
+ static const priority_disp_t unknown = {"UNKNOWN", WHITE};
+
+ if(priority >= LOG_EMERG && priority <= LOG_DEBUG) {
+ return priorities[priority];
+ } else {
+ return unknown;