Blame


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