Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/log.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* $OpenBSD: log.c,v 1.51 2018/07/27 12:03:17 markus Exp $ */ | - | ||||||||||||
2 | /* | - | ||||||||||||
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | - | ||||||||||||
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | - | ||||||||||||
5 | * All rights reserved | - | ||||||||||||
6 | * | - | ||||||||||||
7 | * As far as I am concerned, the code I have written for this software | - | ||||||||||||
8 | * can be used freely for any purpose. Any derived versions of this | - | ||||||||||||
9 | * software must be clearly marked as such, and if the derived work is | - | ||||||||||||
10 | * incompatible with the protocol description in the RFC file, it must be | - | ||||||||||||
11 | * called by a name other than "ssh" or "Secure Shell". | - | ||||||||||||
12 | */ | - | ||||||||||||
13 | /* | - | ||||||||||||
14 | * Copyright (c) 2000 Markus Friedl. All rights reserved. | - | ||||||||||||
15 | * | - | ||||||||||||
16 | * Redistribution and use in source and binary forms, with or without | - | ||||||||||||
17 | * modification, are permitted provided that the following conditions | - | ||||||||||||
18 | * are met: | - | ||||||||||||
19 | * 1. Redistributions of source code must retain the above copyright | - | ||||||||||||
20 | * notice, this list of conditions and the following disclaimer. | - | ||||||||||||
21 | * 2. Redistributions in binary form must reproduce the above copyright | - | ||||||||||||
22 | * notice, this list of conditions and the following disclaimer in the | - | ||||||||||||
23 | * documentation and/or other materials provided with the distribution. | - | ||||||||||||
24 | * | - | ||||||||||||
25 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | - | ||||||||||||
26 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | - | ||||||||||||
27 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | - | ||||||||||||
28 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | - | ||||||||||||
29 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | - | ||||||||||||
30 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | - | ||||||||||||
31 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | - | ||||||||||||
32 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | - | ||||||||||||
33 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | - | ||||||||||||
34 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | - | ||||||||||||
35 | */ | - | ||||||||||||
36 | - | |||||||||||||
37 | #include "includes.h" | - | ||||||||||||
38 | - | |||||||||||||
39 | #include <sys/types.h> | - | ||||||||||||
40 | - | |||||||||||||
41 | #include <fcntl.h> | - | ||||||||||||
42 | #include <stdarg.h> | - | ||||||||||||
43 | #include <stdio.h> | - | ||||||||||||
44 | #include <stdlib.h> | - | ||||||||||||
45 | #include <string.h> | - | ||||||||||||
46 | #include <syslog.h> | - | ||||||||||||
47 | #include <unistd.h> | - | ||||||||||||
48 | #include <errno.h> | - | ||||||||||||
49 | #if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS) | - | ||||||||||||
50 | # include <vis.h> | - | ||||||||||||
51 | #endif | - | ||||||||||||
52 | - | |||||||||||||
53 | #include "log.h" | - | ||||||||||||
54 | - | |||||||||||||
55 | static LogLevel log_level = SYSLOG_LEVEL_INFO; | - | ||||||||||||
56 | static int log_on_stderr = 1; | - | ||||||||||||
57 | static int log_stderr_fd = STDERR_FILENO; | - | ||||||||||||
58 | static int log_facility = LOG_AUTH; | - | ||||||||||||
59 | static char *argv0; | - | ||||||||||||
60 | static log_handler_fn *log_handler; | - | ||||||||||||
61 | static void *log_handler_ctx; | - | ||||||||||||
62 | - | |||||||||||||
63 | extern char *__progname; | - | ||||||||||||
64 | - | |||||||||||||
65 | #define LOG_SYSLOG_VIS (VIS_CSTYLE|VIS_NL|VIS_TAB|VIS_OCTAL) | - | ||||||||||||
66 | #define LOG_STDERR_VIS (VIS_SAFE|VIS_OCTAL) | - | ||||||||||||
67 | - | |||||||||||||
68 | /* textual representation of log-facilities/levels */ | - | ||||||||||||
69 | - | |||||||||||||
70 | static struct { | - | ||||||||||||
71 | const char *name; | - | ||||||||||||
72 | SyslogFacility val; | - | ||||||||||||
73 | } log_facilities[] = { | - | ||||||||||||
74 | { "DAEMON", SYSLOG_FACILITY_DAEMON }, | - | ||||||||||||
75 | { "USER", SYSLOG_FACILITY_USER }, | - | ||||||||||||
76 | { "AUTH", SYSLOG_FACILITY_AUTH }, | - | ||||||||||||
77 | #ifdef LOG_AUTHPRIV | - | ||||||||||||
78 | { "AUTHPRIV", SYSLOG_FACILITY_AUTHPRIV }, | - | ||||||||||||
79 | #endif | - | ||||||||||||
80 | { "LOCAL0", SYSLOG_FACILITY_LOCAL0 }, | - | ||||||||||||
81 | { "LOCAL1", SYSLOG_FACILITY_LOCAL1 }, | - | ||||||||||||
82 | { "LOCAL2", SYSLOG_FACILITY_LOCAL2 }, | - | ||||||||||||
83 | { "LOCAL3", SYSLOG_FACILITY_LOCAL3 }, | - | ||||||||||||
84 | { "LOCAL4", SYSLOG_FACILITY_LOCAL4 }, | - | ||||||||||||
85 | { "LOCAL5", SYSLOG_FACILITY_LOCAL5 }, | - | ||||||||||||
86 | { "LOCAL6", SYSLOG_FACILITY_LOCAL6 }, | - | ||||||||||||
87 | { "LOCAL7", SYSLOG_FACILITY_LOCAL7 }, | - | ||||||||||||
88 | { NULL, SYSLOG_FACILITY_NOT_SET } | - | ||||||||||||
89 | }; | - | ||||||||||||
90 | - | |||||||||||||
91 | static struct { | - | ||||||||||||
92 | const char *name; | - | ||||||||||||
93 | LogLevel val; | - | ||||||||||||
94 | } log_levels[] = | - | ||||||||||||
95 | { | - | ||||||||||||
96 | { "QUIET", SYSLOG_LEVEL_QUIET }, | - | ||||||||||||
97 | { "FATAL", SYSLOG_LEVEL_FATAL }, | - | ||||||||||||
98 | { "ERROR", SYSLOG_LEVEL_ERROR }, | - | ||||||||||||
99 | { "INFO", SYSLOG_LEVEL_INFO }, | - | ||||||||||||
100 | { "VERBOSE", SYSLOG_LEVEL_VERBOSE }, | - | ||||||||||||
101 | { "DEBUG", SYSLOG_LEVEL_DEBUG1 }, | - | ||||||||||||
102 | { "DEBUG1", SYSLOG_LEVEL_DEBUG1 }, | - | ||||||||||||
103 | { "DEBUG2", SYSLOG_LEVEL_DEBUG2 }, | - | ||||||||||||
104 | { "DEBUG3", SYSLOG_LEVEL_DEBUG3 }, | - | ||||||||||||
105 | { NULL, SYSLOG_LEVEL_NOT_SET } | - | ||||||||||||
106 | }; | - | ||||||||||||
107 | - | |||||||||||||
108 | LogLevel | - | ||||||||||||
109 | log_level_get(void) | - | ||||||||||||
110 | { | - | ||||||||||||
111 | return log_level; never executed: return log_level; | 0 | ||||||||||||
112 | } | - | ||||||||||||
113 | - | |||||||||||||
114 | SyslogFacility | - | ||||||||||||
115 | log_facility_number(char *name) | - | ||||||||||||
116 | { | - | ||||||||||||
117 | int i; | - | ||||||||||||
118 | - | |||||||||||||
119 | if (name != NULL)
| 0 | ||||||||||||
120 | for (i = 0; log_facilities[i].name; i++)
| 0 | ||||||||||||
121 | if (strcasecmp(log_facilities[i].name, name) == 0)
| 0 | ||||||||||||
122 | return log_facilities[i].val; never executed: return log_facilities[i].val; | 0 | ||||||||||||
123 | return SYSLOG_FACILITY_NOT_SET; never executed: return SYSLOG_FACILITY_NOT_SET; | 0 | ||||||||||||
124 | } | - | ||||||||||||
125 | - | |||||||||||||
126 | const char * | - | ||||||||||||
127 | log_facility_name(SyslogFacility facility) | - | ||||||||||||
128 | { | - | ||||||||||||
129 | u_int i; | - | ||||||||||||
130 | - | |||||||||||||
131 | for (i = 0; log_facilities[i].name; i++)
| 0 | ||||||||||||
132 | if (log_facilities[i].val == facility)
| 0 | ||||||||||||
133 | return log_facilities[i].name; never executed: return log_facilities[i].name; | 0 | ||||||||||||
134 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
135 | } | - | ||||||||||||
136 | - | |||||||||||||
137 | LogLevel | - | ||||||||||||
138 | log_level_number(char *name) | - | ||||||||||||
139 | { | - | ||||||||||||
140 | int i; | - | ||||||||||||
141 | - | |||||||||||||
142 | if (name != NULL)
| 0-2 | ||||||||||||
143 | for (i = 0; log_levels[i].name; i++)
| 0-18 | ||||||||||||
144 | if (strcasecmp(log_levels[i].name, name) == 0)
| 2-16 | ||||||||||||
145 | return log_levels[i].val; executed 2 times by 1 test: return log_levels[i].val; Executed by:
| 2 | ||||||||||||
146 | return SYSLOG_LEVEL_NOT_SET; never executed: return SYSLOG_LEVEL_NOT_SET; | 0 | ||||||||||||
147 | } | - | ||||||||||||
148 | - | |||||||||||||
149 | const char * | - | ||||||||||||
150 | log_level_name(LogLevel level) | - | ||||||||||||
151 | { | - | ||||||||||||
152 | u_int i; | - | ||||||||||||
153 | - | |||||||||||||
154 | for (i = 0; log_levels[i].name != NULL; i++)
| 0 | ||||||||||||
155 | if (log_levels[i].val == level)
| 0 | ||||||||||||
156 | return log_levels[i].name; never executed: return log_levels[i].name; | 0 | ||||||||||||
157 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
158 | } | - | ||||||||||||
159 | - | |||||||||||||
160 | /* Error messages that should be logged. */ | - | ||||||||||||
161 | - | |||||||||||||
162 | void | - | ||||||||||||
163 | error(const char *fmt,...) | - | ||||||||||||
164 | { | - | ||||||||||||
165 | va_list args; | - | ||||||||||||
166 | - | |||||||||||||
167 | va_start(args, fmt); | - | ||||||||||||
168 | do_log(SYSLOG_LEVEL_ERROR, fmt, args); | - | ||||||||||||
169 | va_end(args); | - | ||||||||||||
170 | } never executed: end of block | 0 | ||||||||||||
171 | - | |||||||||||||
172 | void | - | ||||||||||||
173 | sigdie(const char *fmt,...) | - | ||||||||||||
174 | { | - | ||||||||||||
175 | #ifdef DO_LOG_SAFE_IN_SIGHAND | - | ||||||||||||
176 | va_list args; | - | ||||||||||||
177 | - | |||||||||||||
178 | va_start(args, fmt); | - | ||||||||||||
179 | do_log(SYSLOG_LEVEL_FATAL, fmt, args); | - | ||||||||||||
180 | va_end(args); | - | ||||||||||||
181 | #endif | - | ||||||||||||
182 | _exit(1); | - | ||||||||||||
183 | } never executed: end of block | 0 | ||||||||||||
184 | - | |||||||||||||
185 | void | - | ||||||||||||
186 | logdie(const char *fmt,...) | - | ||||||||||||
187 | { | - | ||||||||||||
188 | va_list args; | - | ||||||||||||
189 | - | |||||||||||||
190 | va_start(args, fmt); | - | ||||||||||||
191 | do_log(SYSLOG_LEVEL_INFO, fmt, args); | - | ||||||||||||
192 | va_end(args); | - | ||||||||||||
193 | cleanup_exit(255); | - | ||||||||||||
194 | } never executed: end of block | 0 | ||||||||||||
195 | - | |||||||||||||
196 | /* Log this message (information that usually should go to the log). */ | - | ||||||||||||
197 | - | |||||||||||||
198 | void | - | ||||||||||||
199 | logit(const char *fmt,...) | - | ||||||||||||
200 | { | - | ||||||||||||
201 | va_list args; | - | ||||||||||||
202 | - | |||||||||||||
203 | va_start(args, fmt); | - | ||||||||||||
204 | do_log(SYSLOG_LEVEL_INFO, fmt, args); | - | ||||||||||||
205 | va_end(args); | - | ||||||||||||
206 | } executed 40 times by 1 test: end of block Executed by:
| 40 | ||||||||||||
207 | - | |||||||||||||
208 | /* More detailed messages (information that does not need to go to the log). */ | - | ||||||||||||
209 | - | |||||||||||||
210 | void | - | ||||||||||||
211 | verbose(const char *fmt,...) | - | ||||||||||||
212 | { | - | ||||||||||||
213 | va_list args; | - | ||||||||||||
214 | - | |||||||||||||
215 | va_start(args, fmt); | - | ||||||||||||
216 | do_log(SYSLOG_LEVEL_VERBOSE, fmt, args); | - | ||||||||||||
217 | va_end(args); | - | ||||||||||||
218 | } executed 18 times by 1 test: end of block Executed by:
| 18 | ||||||||||||
219 | - | |||||||||||||
220 | /* Debugging messages that should not be logged during normal operation. */ | - | ||||||||||||
221 | - | |||||||||||||
222 | void | - | ||||||||||||
223 | debug(const char *fmt,...) | - | ||||||||||||
224 | { | - | ||||||||||||
225 | va_list args; | - | ||||||||||||
226 | - | |||||||||||||
227 | va_start(args, fmt); | - | ||||||||||||
228 | do_log(SYSLOG_LEVEL_DEBUG1, fmt, args); | - | ||||||||||||
229 | va_end(args); | - | ||||||||||||
230 | } executed 5063 times by 3 tests: end of block Executed by:
| 5063 | ||||||||||||
231 | - | |||||||||||||
232 | void | - | ||||||||||||
233 | debug2(const char *fmt,...) | - | ||||||||||||
234 | { | - | ||||||||||||
235 | va_list args; | - | ||||||||||||
236 | - | |||||||||||||
237 | va_start(args, fmt); | - | ||||||||||||
238 | do_log(SYSLOG_LEVEL_DEBUG2, fmt, args); | - | ||||||||||||
239 | va_end(args); | - | ||||||||||||
240 | } executed 24594 times by 5 tests: end of block Executed by:
| 24594 | ||||||||||||
241 | - | |||||||||||||
242 | void | - | ||||||||||||
243 | debug3(const char *fmt,...) | - | ||||||||||||
244 | { | - | ||||||||||||
245 | va_list args; | - | ||||||||||||
246 | - | |||||||||||||
247 | va_start(args, fmt); | - | ||||||||||||
248 | do_log(SYSLOG_LEVEL_DEBUG3, fmt, args); | - | ||||||||||||
249 | va_end(args); | - | ||||||||||||
250 | } executed 3195 times by 3 tests: end of block Executed by:
| 3195 | ||||||||||||
251 | - | |||||||||||||
252 | /* | - | ||||||||||||
253 | * Initialize the log. | - | ||||||||||||
254 | */ | - | ||||||||||||
255 | - | |||||||||||||
256 | void | - | ||||||||||||
257 | log_init(char *av0, LogLevel level, SyslogFacility facility, int on_stderr) | - | ||||||||||||
258 | { | - | ||||||||||||
259 | #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) | - | ||||||||||||
260 | struct syslog_data sdata = SYSLOG_DATA_INIT; | - | ||||||||||||
261 | #endif | - | ||||||||||||
262 | - | |||||||||||||
263 | argv0 = av0; | - | ||||||||||||
264 | - | |||||||||||||
265 | if (log_change_level(level) != 0) {
| 0-58 | ||||||||||||
266 | fprintf(stderr, "Unrecognized internal syslog level code %d\n", | - | ||||||||||||
267 | (int) level); | - | ||||||||||||
268 | exit(1); never executed: exit(1); | 0 | ||||||||||||
269 | } | - | ||||||||||||
270 | - | |||||||||||||
271 | log_handler = NULL; | - | ||||||||||||
272 | log_handler_ctx = NULL; | - | ||||||||||||
273 | - | |||||||||||||
274 | log_on_stderr = on_stderr; | - | ||||||||||||
275 | if (on_stderr)
| 0-58 | ||||||||||||
276 | return; executed 58 times by 2 tests: return; Executed by:
| 58 | ||||||||||||
277 | - | |||||||||||||
278 | switch (facility) { | - | ||||||||||||
279 | case SYSLOG_FACILITY_DAEMON: never executed: case SYSLOG_FACILITY_DAEMON: | 0 | ||||||||||||
280 | log_facility = LOG_DAEMON; | - | ||||||||||||
281 | break; never executed: break; | 0 | ||||||||||||
282 | case SYSLOG_FACILITY_USER: never executed: case SYSLOG_FACILITY_USER: | 0 | ||||||||||||
283 | log_facility = LOG_USER; | - | ||||||||||||
284 | break; never executed: break; | 0 | ||||||||||||
285 | case SYSLOG_FACILITY_AUTH: never executed: case SYSLOG_FACILITY_AUTH: | 0 | ||||||||||||
286 | log_facility = LOG_AUTH; | - | ||||||||||||
287 | break; never executed: break; | 0 | ||||||||||||
288 | #ifdef LOG_AUTHPRIV | - | ||||||||||||
289 | case SYSLOG_FACILITY_AUTHPRIV: never executed: case SYSLOG_FACILITY_AUTHPRIV: | 0 | ||||||||||||
290 | log_facility = LOG_AUTHPRIV; | - | ||||||||||||
291 | break; never executed: break; | 0 | ||||||||||||
292 | #endif | - | ||||||||||||
293 | case SYSLOG_FACILITY_LOCAL0: never executed: case SYSLOG_FACILITY_LOCAL0: | 0 | ||||||||||||
294 | log_facility = LOG_LOCAL0; | - | ||||||||||||
295 | break; never executed: break; | 0 | ||||||||||||
296 | case SYSLOG_FACILITY_LOCAL1: never executed: case SYSLOG_FACILITY_LOCAL1: | 0 | ||||||||||||
297 | log_facility = LOG_LOCAL1; | - | ||||||||||||
298 | break; never executed: break; | 0 | ||||||||||||
299 | case SYSLOG_FACILITY_LOCAL2: never executed: case SYSLOG_FACILITY_LOCAL2: | 0 | ||||||||||||
300 | log_facility = LOG_LOCAL2; | - | ||||||||||||
301 | break; never executed: break; | 0 | ||||||||||||
302 | case SYSLOG_FACILITY_LOCAL3: never executed: case SYSLOG_FACILITY_LOCAL3: | 0 | ||||||||||||
303 | log_facility = LOG_LOCAL3; | - | ||||||||||||
304 | break; never executed: break; | 0 | ||||||||||||
305 | case SYSLOG_FACILITY_LOCAL4: never executed: case SYSLOG_FACILITY_LOCAL4: | 0 | ||||||||||||
306 | log_facility = LOG_LOCAL4; | - | ||||||||||||
307 | break; never executed: break; | 0 | ||||||||||||
308 | case SYSLOG_FACILITY_LOCAL5: never executed: case SYSLOG_FACILITY_LOCAL5: | 0 | ||||||||||||
309 | log_facility = LOG_LOCAL5; | - | ||||||||||||
310 | break; never executed: break; | 0 | ||||||||||||
311 | case SYSLOG_FACILITY_LOCAL6: never executed: case SYSLOG_FACILITY_LOCAL6: | 0 | ||||||||||||
312 | log_facility = LOG_LOCAL6; | - | ||||||||||||
313 | break; never executed: break; | 0 | ||||||||||||
314 | case SYSLOG_FACILITY_LOCAL7: never executed: case SYSLOG_FACILITY_LOCAL7: | 0 | ||||||||||||
315 | log_facility = LOG_LOCAL7; | - | ||||||||||||
316 | break; never executed: break; | 0 | ||||||||||||
317 | default: never executed: default: | 0 | ||||||||||||
318 | fprintf(stderr, | - | ||||||||||||
319 | "Unrecognized internal syslog facility code %d\n", | - | ||||||||||||
320 | (int) facility); | - | ||||||||||||
321 | exit(1); never executed: exit(1); | 0 | ||||||||||||
322 | } | - | ||||||||||||
323 | - | |||||||||||||
324 | /* | - | ||||||||||||
325 | * If an external library (eg libwrap) attempts to use syslog | - | ||||||||||||
326 | * immediately after reexec, syslog may be pointing to the wrong | - | ||||||||||||
327 | * facility, so we force an open/close of syslog here. | - | ||||||||||||
328 | */ | - | ||||||||||||
329 | #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) | - | ||||||||||||
330 | openlog_r(argv0 ? argv0 : __progname, LOG_PID, log_facility, &sdata); | - | ||||||||||||
331 | closelog_r(&sdata); | - | ||||||||||||
332 | #else | - | ||||||||||||
333 | openlog(argv0 ? argv0 : __progname, LOG_PID, log_facility); | - | ||||||||||||
334 | closelog(); | - | ||||||||||||
335 | #endif | - | ||||||||||||
336 | } never executed: end of block | 0 | ||||||||||||
337 | - | |||||||||||||
338 | int | - | ||||||||||||
339 | log_change_level(LogLevel new_log_level) | - | ||||||||||||
340 | { | - | ||||||||||||
341 | /* no-op if log_init has not been called */ | - | ||||||||||||
342 | if (argv0 == NULL)
| 0-58 | ||||||||||||
343 | return 0; never executed: return 0; | 0 | ||||||||||||
344 | - | |||||||||||||
345 | switch (new_log_level) { | - | ||||||||||||
346 | case SYSLOG_LEVEL_QUIET: never executed: case SYSLOG_LEVEL_QUIET: | 0 | ||||||||||||
347 | case SYSLOG_LEVEL_FATAL: never executed: case SYSLOG_LEVEL_FATAL: | 0 | ||||||||||||
348 | case SYSLOG_LEVEL_ERROR: never executed: case SYSLOG_LEVEL_ERROR: | 0 | ||||||||||||
349 | case SYSLOG_LEVEL_INFO: executed 58 times by 2 tests: case SYSLOG_LEVEL_INFO: Executed by:
| 58 | ||||||||||||
350 | case SYSLOG_LEVEL_VERBOSE: never executed: case SYSLOG_LEVEL_VERBOSE: | 0 | ||||||||||||
351 | case SYSLOG_LEVEL_DEBUG1: never executed: case SYSLOG_LEVEL_DEBUG1: | 0 | ||||||||||||
352 | case SYSLOG_LEVEL_DEBUG2: never executed: case SYSLOG_LEVEL_DEBUG2: | 0 | ||||||||||||
353 | case SYSLOG_LEVEL_DEBUG3: never executed: case SYSLOG_LEVEL_DEBUG3: | 0 | ||||||||||||
354 | log_level = new_log_level; | - | ||||||||||||
355 | return 0; executed 58 times by 2 tests: return 0; Executed by:
| 58 | ||||||||||||
356 | default: never executed: default: | 0 | ||||||||||||
357 | return -1; never executed: return -1; | 0 | ||||||||||||
358 | } | - | ||||||||||||
359 | } | - | ||||||||||||
360 | - | |||||||||||||
361 | int | - | ||||||||||||
362 | log_is_on_stderr(void) | - | ||||||||||||
363 | { | - | ||||||||||||
364 | return log_on_stderr && log_stderr_fd == STDERR_FILENO; never executed: return log_on_stderr && log_stderr_fd == 2 ;
| 0 | ||||||||||||
365 | } | - | ||||||||||||
366 | - | |||||||||||||
367 | /* redirect what would usually get written to stderr to specified file */ | - | ||||||||||||
368 | void | - | ||||||||||||
369 | log_redirect_stderr_to(const char *logfile) | - | ||||||||||||
370 | { | - | ||||||||||||
371 | int fd; | - | ||||||||||||
372 | - | |||||||||||||
373 | if ((fd = open(logfile, O_WRONLY|O_CREAT|O_APPEND, 0600)) == -1) {
| 0 | ||||||||||||
374 | fprintf(stderr, "Couldn't open logfile %s: %s\n", logfile, | - | ||||||||||||
375 | strerror(errno)); | - | ||||||||||||
376 | exit(1); never executed: exit(1); | 0 | ||||||||||||
377 | } | - | ||||||||||||
378 | log_stderr_fd = fd; | - | ||||||||||||
379 | } never executed: end of block | 0 | ||||||||||||
380 | - | |||||||||||||
381 | #define MSGBUFSIZ 1024 | - | ||||||||||||
382 | - | |||||||||||||
383 | void | - | ||||||||||||
384 | set_log_handler(log_handler_fn *handler, void *ctx) | - | ||||||||||||
385 | { | - | ||||||||||||
386 | log_handler = handler; | - | ||||||||||||
387 | log_handler_ctx = ctx; | - | ||||||||||||
388 | } never executed: end of block | 0 | ||||||||||||
389 | - | |||||||||||||
390 | void | - | ||||||||||||
391 | do_log2(LogLevel level, const char *fmt,...) | - | ||||||||||||
392 | { | - | ||||||||||||
393 | va_list args; | - | ||||||||||||
394 | - | |||||||||||||
395 | va_start(args, fmt); | - | ||||||||||||
396 | do_log(level, fmt, args); | - | ||||||||||||
397 | va_end(args); | - | ||||||||||||
398 | } never executed: end of block | 0 | ||||||||||||
399 | - | |||||||||||||
400 | void | - | ||||||||||||
401 | do_log(LogLevel level, const char *fmt, va_list args) | - | ||||||||||||
402 | { | - | ||||||||||||
403 | #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) | - | ||||||||||||
404 | struct syslog_data sdata = SYSLOG_DATA_INIT; | - | ||||||||||||
405 | #endif | - | ||||||||||||
406 | char msgbuf[MSGBUFSIZ]; | - | ||||||||||||
407 | char fmtbuf[MSGBUFSIZ]; | - | ||||||||||||
408 | char *txt = NULL; | - | ||||||||||||
409 | int pri = LOG_INFO; | - | ||||||||||||
410 | int saved_errno = errno; | - | ||||||||||||
411 | log_handler_fn *tmp_handler; | - | ||||||||||||
412 | - | |||||||||||||
413 | if (level > log_level)
| 40-32870 | ||||||||||||
414 | return; executed 32870 times by 6 tests: return; Executed by:
| 32870 | ||||||||||||
415 | - | |||||||||||||
416 | switch (level) { | - | ||||||||||||
417 | case SYSLOG_LEVEL_FATAL: never executed: case SYSLOG_LEVEL_FATAL: | 0 | ||||||||||||
418 | if (!log_on_stderr)
| 0 | ||||||||||||
419 | txt = "fatal"; never executed: txt = "fatal"; | 0 | ||||||||||||
420 | pri = LOG_CRIT; | - | ||||||||||||
421 | break; never executed: break; | 0 | ||||||||||||
422 | case SYSLOG_LEVEL_ERROR: never executed: case SYSLOG_LEVEL_ERROR: | 0 | ||||||||||||
423 | if (!log_on_stderr)
| 0 | ||||||||||||
424 | txt = "error"; never executed: txt = "error"; | 0 | ||||||||||||
425 | pri = LOG_ERR; | - | ||||||||||||
426 | break; never executed: break; | 0 | ||||||||||||
427 | case SYSLOG_LEVEL_INFO: executed 40 times by 1 test: case SYSLOG_LEVEL_INFO: Executed by:
| 40 | ||||||||||||
428 | pri = LOG_INFO; | - | ||||||||||||
429 | break; executed 40 times by 1 test: break; Executed by:
| 40 | ||||||||||||
430 | case SYSLOG_LEVEL_VERBOSE: never executed: case SYSLOG_LEVEL_VERBOSE: | 0 | ||||||||||||
431 | pri = LOG_INFO; | - | ||||||||||||
432 | break; never executed: break; | 0 | ||||||||||||
433 | case SYSLOG_LEVEL_DEBUG1: never executed: case SYSLOG_LEVEL_DEBUG1: | 0 | ||||||||||||
434 | txt = "debug1"; | - | ||||||||||||
435 | pri = LOG_DEBUG; | - | ||||||||||||
436 | break; never executed: break; | 0 | ||||||||||||
437 | case SYSLOG_LEVEL_DEBUG2: never executed: case SYSLOG_LEVEL_DEBUG2: | 0 | ||||||||||||
438 | txt = "debug2"; | - | ||||||||||||
439 | pri = LOG_DEBUG; | - | ||||||||||||
440 | break; never executed: break; | 0 | ||||||||||||
441 | case SYSLOG_LEVEL_DEBUG3: never executed: case SYSLOG_LEVEL_DEBUG3: | 0 | ||||||||||||
442 | txt = "debug3"; | - | ||||||||||||
443 | pri = LOG_DEBUG; | - | ||||||||||||
444 | break; never executed: break; | 0 | ||||||||||||
445 | default: never executed: default: | 0 | ||||||||||||
446 | txt = "internal error"; | - | ||||||||||||
447 | pri = LOG_ERR; | - | ||||||||||||
448 | break; never executed: break; | 0 | ||||||||||||
449 | } | - | ||||||||||||
450 | if (txt != NULL && log_handler == NULL) {
| 0-40 | ||||||||||||
451 | snprintf(fmtbuf, sizeof(fmtbuf), "%s: %s", txt, fmt); | - | ||||||||||||
452 | vsnprintf(msgbuf, sizeof(msgbuf), fmtbuf, args); | - | ||||||||||||
453 | } else { never executed: end of block | 0 | ||||||||||||
454 | vsnprintf(msgbuf, sizeof(msgbuf), fmt, args); | - | ||||||||||||
455 | } executed 40 times by 1 test: end of block Executed by:
| 40 | ||||||||||||
456 | strnvis(fmtbuf, msgbuf, sizeof(fmtbuf), | - | ||||||||||||
457 | log_on_stderr ? LOG_STDERR_VIS : LOG_SYSLOG_VIS); | - | ||||||||||||
458 | if (log_handler != NULL) {
| 0-40 | ||||||||||||
459 | /* Avoid recursion */ | - | ||||||||||||
460 | tmp_handler = log_handler; | - | ||||||||||||
461 | log_handler = NULL; | - | ||||||||||||
462 | tmp_handler(level, fmtbuf, log_handler_ctx); | - | ||||||||||||
463 | log_handler = tmp_handler; | - | ||||||||||||
464 | } else if (log_on_stderr) { never executed: end of block
| 0-40 | ||||||||||||
465 | snprintf(msgbuf, sizeof msgbuf, "%.*s\r\n", | - | ||||||||||||
466 | (int)sizeof msgbuf - 3, fmtbuf); | - | ||||||||||||
467 | (void)write(log_stderr_fd, msgbuf, strlen(msgbuf)); | - | ||||||||||||
468 | } else { executed 40 times by 1 test: end of block Executed by:
| 40 | ||||||||||||
469 | #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) | - | ||||||||||||
470 | openlog_r(argv0 ? argv0 : __progname, LOG_PID, log_facility, &sdata); | - | ||||||||||||
471 | syslog_r(pri, &sdata, "%.500s", fmtbuf); | - | ||||||||||||
472 | closelog_r(&sdata); | - | ||||||||||||
473 | #else | - | ||||||||||||
474 | openlog(argv0 ? argv0 : __progname, LOG_PID, log_facility); | - | ||||||||||||
475 | syslog(pri, "%.500s", fmtbuf); | - | ||||||||||||
476 | closelog(); | - | ||||||||||||
477 | #endif | - | ||||||||||||
478 | } never executed: end of block | 0 | ||||||||||||
479 | errno = saved_errno; | - | ||||||||||||
480 | } executed 40 times by 1 test: end of block Executed by:
| 40 | ||||||||||||
Source code | Switch to Preprocessed file |