Blame


1 f224a3fe 2021-08-24 xhr /*
2 f224a3fe 2021-08-24 xhr * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
3 53d188a0 2021-08-26 xhr * Copyright (c) 2021 Matthias Schmidt <xhr@giessen.ccc.de>
4 f224a3fe 2021-08-24 xhr *
5 f224a3fe 2021-08-24 xhr * Permission to use, copy, modify, and distribute this software for any
6 f224a3fe 2021-08-24 xhr * purpose with or without fee is hereby granted, provided that the above
7 f224a3fe 2021-08-24 xhr * copyright notice and this permission notice appear in all copies.
8 f224a3fe 2021-08-24 xhr *
9 f224a3fe 2021-08-24 xhr * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 f224a3fe 2021-08-24 xhr * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 f224a3fe 2021-08-24 xhr * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 f224a3fe 2021-08-24 xhr * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 f224a3fe 2021-08-24 xhr * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 f224a3fe 2021-08-24 xhr * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 f224a3fe 2021-08-24 xhr * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 f224a3fe 2021-08-24 xhr */
17 f224a3fe 2021-08-24 xhr
18 f224a3fe 2021-08-24 xhr #define _GNU_SOURCE
19 f224a3fe 2021-08-24 xhr
20 f224a3fe 2021-08-24 xhr #include <sys/types.h>
21 f224a3fe 2021-08-24 xhr #include <sys/stat.h>
22 f224a3fe 2021-08-24 xhr
23 f224a3fe 2021-08-24 xhr #include <stdio.h>
24 f224a3fe 2021-08-24 xhr #include <stdlib.h>
25 f224a3fe 2021-08-24 xhr #include <stdarg.h>
26 f224a3fe 2021-08-24 xhr #include <string.h>
27 f224a3fe 2021-08-24 xhr #include <syslog.h>
28 f224a3fe 2021-08-24 xhr #include <errno.h>
29 f224a3fe 2021-08-24 xhr #include <fcntl.h>
30 f224a3fe 2021-08-24 xhr #include <unistd.h>
31 f224a3fe 2021-08-24 xhr #include <time.h>
32 f224a3fe 2021-08-24 xhr
33 f224a3fe 2021-08-24 xhr #include "log.h"
34 f224a3fe 2021-08-24 xhr #include "twind.h"
35 f224a3fe 2021-08-24 xhr
36 f224a3fe 2021-08-24 xhr #define MAXLOGLINE 1024
37 f224a3fe 2021-08-24 xhr
38 f224a3fe 2021-08-24 xhr static int debug;
39 f224a3fe 2021-08-24 xhr static int verbose;
40 f224a3fe 2021-08-24 xhr static int access_fd;
41 f224a3fe 2021-08-24 xhr static int error_fd;
42 f224a3fe 2021-08-24 xhr
43 f224a3fe 2021-08-24 xhr static const char *log_procname;
44 f224a3fe 2021-08-24 xhr
45 f224a3fe 2021-08-24 xhr void
46 f224a3fe 2021-08-24 xhr log_init(int n_debug, int facility)
47 f224a3fe 2021-08-24 xhr {
48 f224a3fe 2021-08-24 xhr extern char *__progname;
49 f224a3fe 2021-08-24 xhr
50 f224a3fe 2021-08-24 xhr debug = n_debug;
51 f224a3fe 2021-08-24 xhr verbose = n_debug;
52 f224a3fe 2021-08-24 xhr log_procinit(__progname);
53 f224a3fe 2021-08-24 xhr
54 f224a3fe 2021-08-24 xhr if (!debug)
55 f224a3fe 2021-08-24 xhr openlog(__progname, LOG_PID | LOG_NDELAY, facility);
56 f224a3fe 2021-08-24 xhr
57 f224a3fe 2021-08-24 xhr tzset();
58 f224a3fe 2021-08-24 xhr }
59 f224a3fe 2021-08-24 xhr
60 f224a3fe 2021-08-24 xhr void
61 f224a3fe 2021-08-24 xhr log_procinit(const char *procname)
62 f224a3fe 2021-08-24 xhr {
63 f224a3fe 2021-08-24 xhr if (procname != NULL)
64 f224a3fe 2021-08-24 xhr log_procname = procname;
65 f224a3fe 2021-08-24 xhr }
66 f224a3fe 2021-08-24 xhr
67 f224a3fe 2021-08-24 xhr void
68 f224a3fe 2021-08-24 xhr log_setverbose(int v)
69 f224a3fe 2021-08-24 xhr {
70 f224a3fe 2021-08-24 xhr verbose = v;
71 f224a3fe 2021-08-24 xhr }
72 f224a3fe 2021-08-24 xhr
73 f224a3fe 2021-08-24 xhr int
74 f224a3fe 2021-08-24 xhr log_getverbose(void)
75 f224a3fe 2021-08-24 xhr {
76 f224a3fe 2021-08-24 xhr return (verbose);
77 f224a3fe 2021-08-24 xhr }
78 f224a3fe 2021-08-24 xhr
79 f224a3fe 2021-08-24 xhr void
80 f224a3fe 2021-08-24 xhr logit(int pri, const char *fmt, ...)
81 f224a3fe 2021-08-24 xhr {
82 f224a3fe 2021-08-24 xhr va_list ap;
83 f224a3fe 2021-08-24 xhr
84 f224a3fe 2021-08-24 xhr va_start(ap, fmt);
85 f224a3fe 2021-08-24 xhr vlog(pri, fmt, ap);
86 f224a3fe 2021-08-24 xhr va_end(ap);
87 f224a3fe 2021-08-24 xhr }
88 f224a3fe 2021-08-24 xhr
89 f224a3fe 2021-08-24 xhr void
90 f224a3fe 2021-08-24 xhr vlog(int pri, const char *fmt, va_list ap)
91 f224a3fe 2021-08-24 xhr {
92 f224a3fe 2021-08-24 xhr char *nfmt;
93 f224a3fe 2021-08-24 xhr int saved_errno = errno;
94 f224a3fe 2021-08-24 xhr
95 f224a3fe 2021-08-24 xhr if (debug) {
96 f224a3fe 2021-08-24 xhr /* best effort in out of mem situations */
97 f224a3fe 2021-08-24 xhr if (asprintf(&nfmt, "%s\n", fmt) == -1) {
98 f224a3fe 2021-08-24 xhr vfprintf(stderr, fmt, ap);
99 f224a3fe 2021-08-24 xhr fprintf(stderr, "\n");
100 f224a3fe 2021-08-24 xhr } else {
101 f224a3fe 2021-08-24 xhr vfprintf(stderr, nfmt, ap);
102 f224a3fe 2021-08-24 xhr free(nfmt);
103 f224a3fe 2021-08-24 xhr }
104 f224a3fe 2021-08-24 xhr fflush(stderr);
105 f224a3fe 2021-08-24 xhr } else
106 f224a3fe 2021-08-24 xhr vsyslog(pri, fmt, ap);
107 f224a3fe 2021-08-24 xhr
108 f224a3fe 2021-08-24 xhr errno = saved_errno;
109 f224a3fe 2021-08-24 xhr }
110 f224a3fe 2021-08-24 xhr
111 f224a3fe 2021-08-24 xhr void
112 f224a3fe 2021-08-24 xhr log_warn(const char *emsg, ...)
113 f224a3fe 2021-08-24 xhr {
114 f224a3fe 2021-08-24 xhr char *nfmt;
115 f224a3fe 2021-08-24 xhr va_list ap;
116 f224a3fe 2021-08-24 xhr int saved_errno = errno;
117 f224a3fe 2021-08-24 xhr
118 f224a3fe 2021-08-24 xhr /* best effort to even work in out of memory situations */
119 f224a3fe 2021-08-24 xhr if (emsg == NULL)
120 f224a3fe 2021-08-24 xhr logit(LOG_ERR, "%s", strerror(saved_errno));
121 f224a3fe 2021-08-24 xhr else {
122 f224a3fe 2021-08-24 xhr va_start(ap, emsg);
123 f224a3fe 2021-08-24 xhr
124 f224a3fe 2021-08-24 xhr if (asprintf(&nfmt, "%s: %s", emsg,
125 f224a3fe 2021-08-24 xhr strerror(saved_errno)) == -1) {
126 f224a3fe 2021-08-24 xhr /* we tried it... */
127 f224a3fe 2021-08-24 xhr vlog(LOG_ERR, emsg, ap);
128 f224a3fe 2021-08-24 xhr logit(LOG_ERR, "%s", strerror(saved_errno));
129 f224a3fe 2021-08-24 xhr } else {
130 f224a3fe 2021-08-24 xhr vlog(LOG_ERR, nfmt, ap);
131 f224a3fe 2021-08-24 xhr free(nfmt);
132 f224a3fe 2021-08-24 xhr }
133 f224a3fe 2021-08-24 xhr va_end(ap);
134 f224a3fe 2021-08-24 xhr }
135 f224a3fe 2021-08-24 xhr
136 f224a3fe 2021-08-24 xhr errno = saved_errno;
137 f224a3fe 2021-08-24 xhr }
138 f224a3fe 2021-08-24 xhr
139 f224a3fe 2021-08-24 xhr void
140 f224a3fe 2021-08-24 xhr log_warnx(const char *emsg, ...)
141 f224a3fe 2021-08-24 xhr {
142 f224a3fe 2021-08-24 xhr va_list ap;
143 f224a3fe 2021-08-24 xhr
144 f224a3fe 2021-08-24 xhr va_start(ap, emsg);
145 f224a3fe 2021-08-24 xhr vlog(LOG_ERR, emsg, ap);
146 f224a3fe 2021-08-24 xhr va_end(ap);
147 f224a3fe 2021-08-24 xhr }
148 f224a3fe 2021-08-24 xhr
149 f224a3fe 2021-08-24 xhr void
150 f224a3fe 2021-08-24 xhr log_info(const char *emsg, ...)
151 f224a3fe 2021-08-24 xhr {
152 f224a3fe 2021-08-24 xhr va_list ap;
153 f224a3fe 2021-08-24 xhr
154 f224a3fe 2021-08-24 xhr va_start(ap, emsg);
155 f224a3fe 2021-08-24 xhr vlog(LOG_INFO, emsg, ap);
156 f224a3fe 2021-08-24 xhr va_end(ap);
157 f224a3fe 2021-08-24 xhr }
158 f224a3fe 2021-08-24 xhr
159 f224a3fe 2021-08-24 xhr void
160 f224a3fe 2021-08-24 xhr log_debug(const char *emsg, ...)
161 f224a3fe 2021-08-24 xhr {
162 f224a3fe 2021-08-24 xhr va_list ap;
163 f224a3fe 2021-08-24 xhr
164 f224a3fe 2021-08-24 xhr if (verbose) {
165 f224a3fe 2021-08-24 xhr va_start(ap, emsg);
166 f224a3fe 2021-08-24 xhr vlog(LOG_DEBUG, emsg, ap);
167 f224a3fe 2021-08-24 xhr va_end(ap);
168 f224a3fe 2021-08-24 xhr }
169 f224a3fe 2021-08-24 xhr }
170 f224a3fe 2021-08-24 xhr
171 f224a3fe 2021-08-24 xhr static void
172 f224a3fe 2021-08-24 xhr vfatalc(int code, const char *emsg, va_list ap)
173 f224a3fe 2021-08-24 xhr {
174 f224a3fe 2021-08-24 xhr static char s[BUFSIZ];
175 f224a3fe 2021-08-24 xhr const char *sep;
176 f224a3fe 2021-08-24 xhr
177 f224a3fe 2021-08-24 xhr if (emsg != NULL) {
178 f224a3fe 2021-08-24 xhr (void)vsnprintf(s, sizeof(s), emsg, ap);
179 f224a3fe 2021-08-24 xhr sep = ": ";
180 f224a3fe 2021-08-24 xhr } else {
181 f224a3fe 2021-08-24 xhr s[0] = '\0';
182 f224a3fe 2021-08-24 xhr sep = "";
183 f224a3fe 2021-08-24 xhr }
184 f224a3fe 2021-08-24 xhr if (code)
185 f224a3fe 2021-08-24 xhr logit(LOG_CRIT, "fatal in %s: %s%s%s",
186 f224a3fe 2021-08-24 xhr log_procname, s, sep, strerror(code));
187 f224a3fe 2021-08-24 xhr else
188 f224a3fe 2021-08-24 xhr logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
189 f224a3fe 2021-08-24 xhr }
190 f224a3fe 2021-08-24 xhr
191 f224a3fe 2021-08-24 xhr void
192 f224a3fe 2021-08-24 xhr fatal(const char *emsg, ...)
193 f224a3fe 2021-08-24 xhr {
194 f224a3fe 2021-08-24 xhr va_list ap;
195 f224a3fe 2021-08-24 xhr
196 f224a3fe 2021-08-24 xhr va_start(ap, emsg);
197 f224a3fe 2021-08-24 xhr vfatalc(errno, emsg, ap);
198 f224a3fe 2021-08-24 xhr va_end(ap);
199 f224a3fe 2021-08-24 xhr exit(1);
200 f224a3fe 2021-08-24 xhr }
201 f224a3fe 2021-08-24 xhr
202 f224a3fe 2021-08-24 xhr void
203 f224a3fe 2021-08-24 xhr fatalx(const char *emsg, ...)
204 f224a3fe 2021-08-24 xhr {
205 f224a3fe 2021-08-24 xhr va_list ap;
206 f224a3fe 2021-08-24 xhr
207 f224a3fe 2021-08-24 xhr va_start(ap, emsg);
208 f224a3fe 2021-08-24 xhr vfatalc(0, emsg, ap);
209 f224a3fe 2021-08-24 xhr va_end(ap);
210 f224a3fe 2021-08-24 xhr exit(1);
211 f224a3fe 2021-08-24 xhr }
212 f224a3fe 2021-08-24 xhr
213 f224a3fe 2021-08-24 xhr void
214 f224a3fe 2021-08-24 xhr open_twind_logs(void)
215 f224a3fe 2021-08-24 xhr {
216 f224a3fe 2021-08-24 xhr if ((access_fd = open(_PATH_TWIND_ACCESS_LOG, O_WRONLY|O_APPEND|O_CREAT, 0644))
217 f224a3fe 2021-08-24 xhr == -1)
218 f224a3fe 2021-08-24 xhr fatalx("Cannot open access log: %s", _PATH_TWIND_ACCESS_LOG);
219 f224a3fe 2021-08-24 xhr
220 f224a3fe 2021-08-24 xhr if ((error_fd = open(_PATH_TWIND_ERROR_LOG, O_WRONLY|O_APPEND|O_CREAT, 0644))
221 f224a3fe 2021-08-24 xhr == -1)
222 f224a3fe 2021-08-24 xhr fatalx("Cannot open error log: %s", _PATH_TWIND_ACCESS_LOG);
223 f224a3fe 2021-08-24 xhr
224 a944bd93 2021-08-26 xhr log_debug("Log files open");
225 f224a3fe 2021-08-24 xhr }
226 f224a3fe 2021-08-24 xhr
227 f224a3fe 2021-08-24 xhr void
228 f224a3fe 2021-08-24 xhr close_twind_logs(void)
229 f224a3fe 2021-08-24 xhr {
230 a944bd93 2021-08-26 xhr log_debug("Closing log file");
231 f224a3fe 2021-08-24 xhr close(access_fd);
232 f224a3fe 2021-08-24 xhr close(error_fd);
233 f224a3fe 2021-08-24 xhr }
234 f224a3fe 2021-08-24 xhr
235 f224a3fe 2021-08-24 xhr void
236 f224a3fe 2021-08-24 xhr log_access(const struct client_connection *cc, const char *fmt, ...)
237 f224a3fe 2021-08-24 xhr {
238 56b35e42 2021-08-26 xhr char tmstr[29];
239 f224a3fe 2021-08-24 xhr struct tm tm;
240 f224a3fe 2021-08-24 xhr time_t t;
241 f224a3fe 2021-08-24 xhr
242 f224a3fe 2021-08-24 xhr t = time(NULL);
243 f224a3fe 2021-08-24 xhr tm = *localtime(&t);
244 f224a3fe 2021-08-24 xhr
245 2c012a4d 2021-08-26 xhr if (strftime(tmstr, sizeof(tmstr), "%d/%b/%Y:%H:%M:%S %Z", &tm) == 0) {
246 2c012a4d 2021-08-26 xhr log_warn("strftime couldn't save time string");
247 2c012a4d 2021-08-26 xhr return;
248 2c012a4d 2021-08-26 xhr }
249 56b35e42 2021-08-26 xhr
250 56b35e42 2021-08-26 xhr user_log(0, "%s - - [%s] %s", cc->client_addr, tmstr, fmt);
251 f224a3fe 2021-08-24 xhr }
252 f224a3fe 2021-08-24 xhr
253 f224a3fe 2021-08-24 xhr void
254 f224a3fe 2021-08-24 xhr log_error(const struct client_connection *cc, const char *fmt, ...)
255 f224a3fe 2021-08-24 xhr {
256 56b35e42 2021-08-26 xhr char tmstr[29];
257 f224a3fe 2021-08-24 xhr struct tm tm;
258 f224a3fe 2021-08-24 xhr time_t t;
259 f224a3fe 2021-08-24 xhr
260 f224a3fe 2021-08-24 xhr t = time(NULL);
261 f224a3fe 2021-08-24 xhr tm = *localtime(&t);
262 2c012a4d 2021-08-26 xhr if (strftime(tmstr, sizeof(tmstr), "%d/%b/%Y:%H:%M:%S %Z", &tm) == 0) {
263 2c012a4d 2021-08-26 xhr log_warn("strftime couldn't save time string");
264 2c012a4d 2021-08-26 xhr return;
265 2c012a4d 2021-08-26 xhr }
266 f224a3fe 2021-08-24 xhr
267 56b35e42 2021-08-26 xhr user_log(1, "[%s] [error] [client %s] %s", tmstr,
268 56b35e42 2021-08-26 xhr cc->client_addr, fmt);
269 f224a3fe 2021-08-24 xhr }
270 f224a3fe 2021-08-24 xhr
271 f224a3fe 2021-08-24 xhr void
272 f224a3fe 2021-08-24 xhr user_log(int target, const char *fmt, ...)
273 f224a3fe 2021-08-24 xhr {
274 f224a3fe 2021-08-24 xhr va_list ap;
275 f224a3fe 2021-08-24 xhr int fd = -1;
276 f224a3fe 2021-08-24 xhr
277 f224a3fe 2021-08-24 xhr va_start(ap, fmt);
278 f224a3fe 2021-08-24 xhr if (target == 0)
279 f224a3fe 2021-08-24 xhr fd = access_fd;
280 f224a3fe 2021-08-24 xhr else if (target == 1)
281 f224a3fe 2021-08-24 xhr fd = error_fd;
282 f224a3fe 2021-08-24 xhr else {
283 f224a3fe 2021-08-24 xhr log_warn("Non-existent user log target");
284 f224a3fe 2021-08-24 xhr return;
285 f224a3fe 2021-08-24 xhr }
286 f224a3fe 2021-08-24 xhr
287 f224a3fe 2021-08-24 xhr vdprintf(fd, fmt, ap);
288 f224a3fe 2021-08-24 xhr dprintf(fd, "\n");
289 f224a3fe 2021-08-24 xhr
290 f224a3fe 2021-08-24 xhr va_end(ap);
291 f224a3fe 2021-08-24 xhr }