aboutsummaryrefslogtreecommitdiff
path: root/src/logger.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/logger.c')
-rw-r--r--src/logger.c135
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;
+}
+

Return to:

Send suggestions and report system problems to the System administrator.