diff options
Diffstat (limited to 'src/logger.c')
-rw-r--r-- | src/logger.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/logger.c b/src/logger.c new file mode 100644 index 0000000..fe8de2f --- /dev/null +++ b/src/logger.c @@ -0,0 +1,135 @@ +/* This file is part of Ping903. + Copyright (C) 2020 Sergey Poznyakoff + + Ping903 is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Ping903 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Ping903. If not, see <http://www.gnu.org/licenses/>. */ +#include <config.h> +#include <stdio.h> +#include <string.h> +#include <syslog.h> +#include "ping903.h" + +char *progname; + +static int facility = LOG_DAEMON; + +static void +vlog_syslog(int prio, char const *fmt, va_list ap) +{ + vsyslog(prio, fmt, ap); +} + +static void +vlog_stderr(int prio, char const *fmt, va_list ap) +{ + fprintf(stderr, "%s: ", progname); + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); +} + +static void (*vlog)(int prio, char const *fmt, va_list ap) = vlog_stderr; + +void +vlogger(int prio, char const *fmt, va_list ap) +{ + vlog(prio, fmt, ap); +} + +void +fatal(char const *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vlog(LOG_CRIT, fmt, ap); + va_end(ap); +} + +void +error(char const *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vlog(LOG_ERR, fmt, ap); + va_end(ap); +} + +void +info(char const *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vlog(LOG_INFO, fmt, ap); + va_end(ap); +} + +void +syslog_enable(void) +{ + openlog(progname, LOG_PID, facility); + vlog = vlog_syslog; +} + +static struct facility { + char const *s; + int n; +} facilities[] = { + { "auth", LOG_AUTH }, + { "authpriv", LOG_AUTHPRIV }, + { "cron", LOG_CRON }, + { "daemon", LOG_DAEMON }, + { "ftp", LOG_FTP }, + { "kern", LOG_KERN }, + { "lpr", LOG_LPR }, + { "mail", LOG_MAIL }, + { "news", LOG_NEWS }, +#ifdef LOG_AUTH + { "security", LOG_AUTH }, +#endif + { "syslog", LOG_SYSLOG }, + { "user", LOG_USER }, + { "uucp", LOG_UUCP }, + { "local0", LOG_LOCAL0 }, + { "local1", LOG_LOCAL1 }, + { "local2", LOG_LOCAL2 }, + { "local3", LOG_LOCAL3 }, + { "local4", LOG_LOCAL4 }, + { "local5", LOG_LOCAL5 }, + { "local6", LOG_LOCAL6 }, + { "local7", LOG_LOCAL7 }, + { NULL, -1 } +}; + +int +set_log_facility(char const *arg) +{ + struct facility *f; + for (f = facilities; f->s; f++) + if (strcmp(f->s, arg) == 0) + break; + if (f->n == -1) + return -1; + facility = f->n; + return 0; +} + +void +set_progname(char const *arg) +{ + char *p = strrchr(arg, '/'); + if (p) + p++; + else + p = (char*) arg; + progname = p; +} + |