Blob


1 /*
2 * This is free and unencumbered software released into the public domain.
3 *
4 * Anyone is free to copy, modify, publish, use, compile, sell, or
5 * distribute this software, either in source code form or as a compiled
6 * binary, for any purpose, commercial or non-commercial, and by any
7 * means.
8 */
10 #include <err.h>
11 #include <errno.h>
12 #include <stdarg.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <syslog.h>
17 #include <time.h>
19 #include "log.h"
21 __dead void log_syslog_fatal(int, const char *, ...);
22 __dead void log_syslog_fatalx(int, const char *, ...);
23 void log_syslog_warn(const char *, ...);
24 void log_syslog_warnx(const char *, ...);
25 void log_syslog_info(const char *, ...);
26 void log_syslog_debug(const char *, ...);
28 const struct logger syslogger = {
29 .fatal = &log_syslog_fatal,
30 .fatalx = &log_syslog_fatalx,
31 .warn = &log_syslog_warn,
32 .warnx = &log_syslog_warnx,
33 .info = &log_syslog_info,
34 .debug = &log_syslog_debug,
35 };
37 const struct logger dbglogger = {
38 .fatal = &err,
39 .fatalx = &errx,
40 .warn = &warn,
41 .warnx = &warnx,
42 .info = &warnx,
43 .debug = &warnx,
44 };
46 const struct logger *logger = &dbglogger;
48 static char logbuf[4096];
49 static int debug;
50 static int verbose;
52 void
53 log_init(int n_debug, int facility)
54 {
55 debug = n_debug;
56 verbose = n_debug;
58 tzset();
59 if (debug)
60 setvbuf(stderr, logbuf, _IOLBF, sizeof(logbuf));
61 else {
62 openlog(getprogname(), LOG_PID | LOG_NDELAY, facility);
63 logger = &syslogger;
64 }
65 }
67 void
68 log_setverbose(int v)
69 {
70 verbose = v;
71 }
73 __dead void
74 log_syslog_fatal(int eval, const char *fmt, ...)
75 {
76 static char s[BUFSIZ];
77 va_list ap;
78 int r, save_errno;
80 save_errno = errno;
82 va_start(ap, fmt);
83 r = vsnprintf(s, sizeof(s), fmt, ap);
84 va_end(ap);
86 errno = save_errno;
88 if (r > 0 && (size_t)r <= sizeof(s))
89 syslog(LOG_DAEMON|LOG_CRIT, "%s: %s", s, strerror(errno));
91 exit(eval);
92 }
94 __dead void
95 log_syslog_fatalx(int eval, const char *fmt, ...)
96 {
97 va_list ap;
99 va_start(ap, fmt);
100 vsyslog(LOG_DAEMON|LOG_CRIT, fmt, ap);
101 va_end(ap);
103 exit(eval);
106 void
107 log_syslog_warn(const char *fmt, ...)
109 static char s[BUFSIZ];
110 va_list ap;
111 int r, save_errno;
113 save_errno = errno;
115 va_start(ap, fmt);
116 r = vsnprintf(s, sizeof(s), fmt, ap);
117 va_end(ap);
119 errno = save_errno;
121 if (r > 0 && (size_t)r < sizeof(s))
122 syslog(LOG_DAEMON|LOG_ERR, "%s: %s", s, strerror(errno));
124 errno = save_errno;
127 void
128 log_syslog_warnx(const char *fmt, ...)
130 va_list ap;
131 int save_errno;
133 save_errno = errno;
134 va_start(ap, fmt);
135 vsyslog(LOG_DAEMON|LOG_ERR, fmt, ap);
136 va_end(ap);
137 errno = save_errno;
140 void
141 log_syslog_info(const char *fmt, ...)
143 va_list ap;
144 int save_errno;
146 if (verbose < 1)
147 return;
149 save_errno = errno;
150 va_start(ap, fmt);
151 vsyslog(LOG_DAEMON|LOG_INFO, fmt, ap);
152 va_end(ap);
153 errno = save_errno;
156 void
157 log_syslog_debug(const char *fmt, ...)
159 va_list ap;
160 int save_errno;
162 if (verbose < 2)
163 return;
165 save_errno = errno;
166 va_start(ap, fmt);
167 vsyslog(LOG_DAEMON|LOG_DEBUG, fmt, ap);
168 va_end(ap);
169 errno = save_errno;