xref: /openbsd-src/usr.sbin/ospfd/log.c (revision 9b2c1562932ce8ef5a9c88720f87a65f2e0ed290)
1*9b2c1562Sbluhm /*	$OpenBSD: log.c,v 1.12 2017/03/21 12:06:56 bluhm Exp $	*/
2204df0f8Sclaudio 
3204df0f8Sclaudio /*
4204df0f8Sclaudio  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5204df0f8Sclaudio  *
6204df0f8Sclaudio  * Permission to use, copy, modify, and distribute this software for any
7204df0f8Sclaudio  * purpose with or without fee is hereby granted, provided that the above
8204df0f8Sclaudio  * copyright notice and this permission notice appear in all copies.
9204df0f8Sclaudio  *
10204df0f8Sclaudio  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11204df0f8Sclaudio  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12204df0f8Sclaudio  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13204df0f8Sclaudio  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14204df0f8Sclaudio  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15204df0f8Sclaudio  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16204df0f8Sclaudio  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17204df0f8Sclaudio  */
18204df0f8Sclaudio 
19204df0f8Sclaudio #include <stdio.h>
20204df0f8Sclaudio #include <stdlib.h>
21f2e37bc3Sbenno #include <stdarg.h>
22204df0f8Sclaudio #include <string.h>
23204df0f8Sclaudio #include <syslog.h>
24f2e37bc3Sbenno #include <errno.h>
252d29f8f3Sbenno #include <time.h>
26204df0f8Sclaudio 
27204df0f8Sclaudio #include "log.h"
28cd7a28e2Sclaudio 
29f2e37bc3Sbenno static int		 debug;
30f2e37bc3Sbenno static int		 verbose;
31f2e37bc3Sbenno static const char	*log_procname;
32204df0f8Sclaudio 
33204df0f8Sclaudio void
log_init(int n_debug,int facility)34f2e37bc3Sbenno log_init(int n_debug, int facility)
35204df0f8Sclaudio {
36204df0f8Sclaudio 	extern char	*__progname;
37204df0f8Sclaudio 
38204df0f8Sclaudio 	debug = n_debug;
39f2e37bc3Sbenno 	verbose = n_debug;
40f2e37bc3Sbenno 	log_procinit(__progname);
41204df0f8Sclaudio 
42204df0f8Sclaudio 	if (!debug)
43f2e37bc3Sbenno 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
44204df0f8Sclaudio 
45204df0f8Sclaudio 	tzset();
46204df0f8Sclaudio }
47204df0f8Sclaudio 
48204df0f8Sclaudio void
log_procinit(const char * procname)49f2e37bc3Sbenno log_procinit(const char *procname)
50f2e37bc3Sbenno {
51f2e37bc3Sbenno 	if (procname != NULL)
52f2e37bc3Sbenno 		log_procname = procname;
53f2e37bc3Sbenno }
54f2e37bc3Sbenno 
55f2e37bc3Sbenno void
log_setverbose(int v)56f2e37bc3Sbenno log_setverbose(int v)
57636d06c3Sclaudio {
58636d06c3Sclaudio 	verbose = v;
59636d06c3Sclaudio }
60636d06c3Sclaudio 
61f2e37bc3Sbenno int
log_getverbose(void)62f2e37bc3Sbenno log_getverbose(void)
63f2e37bc3Sbenno {
64f2e37bc3Sbenno 	return (verbose);
65f2e37bc3Sbenno }
66f2e37bc3Sbenno 
67636d06c3Sclaudio void
logit(int pri,const char * fmt,...)68204df0f8Sclaudio logit(int pri, const char *fmt, ...)
69204df0f8Sclaudio {
70204df0f8Sclaudio 	va_list	ap;
71204df0f8Sclaudio 
72204df0f8Sclaudio 	va_start(ap, fmt);
73204df0f8Sclaudio 	vlog(pri, fmt, ap);
74204df0f8Sclaudio 	va_end(ap);
75204df0f8Sclaudio }
76204df0f8Sclaudio 
77204df0f8Sclaudio void
vlog(int pri,const char * fmt,va_list ap)78204df0f8Sclaudio vlog(int pri, const char *fmt, va_list ap)
79204df0f8Sclaudio {
80204df0f8Sclaudio 	char	*nfmt;
81f2e37bc3Sbenno 	int	 saved_errno = errno;
82204df0f8Sclaudio 
83204df0f8Sclaudio 	if (debug) {
84204df0f8Sclaudio 		/* best effort in out of mem situations */
85204df0f8Sclaudio 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
86204df0f8Sclaudio 			vfprintf(stderr, fmt, ap);
87204df0f8Sclaudio 			fprintf(stderr, "\n");
88204df0f8Sclaudio 		} else {
89204df0f8Sclaudio 			vfprintf(stderr, nfmt, ap);
90204df0f8Sclaudio 			free(nfmt);
91204df0f8Sclaudio 		}
92204df0f8Sclaudio 		fflush(stderr);
93204df0f8Sclaudio 	} else
94204df0f8Sclaudio 		vsyslog(pri, fmt, ap);
95f2e37bc3Sbenno 
96f2e37bc3Sbenno 	errno = saved_errno;
97204df0f8Sclaudio }
98204df0f8Sclaudio 
99204df0f8Sclaudio void
log_warn(const char * emsg,...)100204df0f8Sclaudio log_warn(const char *emsg, ...)
101204df0f8Sclaudio {
102204df0f8Sclaudio 	char		*nfmt;
103204df0f8Sclaudio 	va_list		 ap;
104f2e37bc3Sbenno 	int		 saved_errno = errno;
105204df0f8Sclaudio 
106204df0f8Sclaudio 	/* best effort to even work in out of memory situations */
107204df0f8Sclaudio 	if (emsg == NULL)
108*9b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
109204df0f8Sclaudio 	else {
110204df0f8Sclaudio 		va_start(ap, emsg);
111204df0f8Sclaudio 
112f2e37bc3Sbenno 		if (asprintf(&nfmt, "%s: %s", emsg,
113f2e37bc3Sbenno 		    strerror(saved_errno)) == -1) {
114204df0f8Sclaudio 			/* we tried it... */
115*9b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
116*9b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(saved_errno));
117204df0f8Sclaudio 		} else {
118*9b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
119204df0f8Sclaudio 			free(nfmt);
120204df0f8Sclaudio 		}
121204df0f8Sclaudio 		va_end(ap);
122204df0f8Sclaudio 	}
123f2e37bc3Sbenno 
124f2e37bc3Sbenno 	errno = saved_errno;
125204df0f8Sclaudio }
126204df0f8Sclaudio 
127204df0f8Sclaudio void
log_warnx(const char * emsg,...)128204df0f8Sclaudio log_warnx(const char *emsg, ...)
129204df0f8Sclaudio {
130204df0f8Sclaudio 	va_list	 ap;
131204df0f8Sclaudio 
132204df0f8Sclaudio 	va_start(ap, emsg);
133*9b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
134204df0f8Sclaudio 	va_end(ap);
135204df0f8Sclaudio }
136204df0f8Sclaudio 
137204df0f8Sclaudio void
log_info(const char * emsg,...)138204df0f8Sclaudio log_info(const char *emsg, ...)
139204df0f8Sclaudio {
140204df0f8Sclaudio 	va_list	 ap;
141204df0f8Sclaudio 
142204df0f8Sclaudio 	va_start(ap, emsg);
143204df0f8Sclaudio 	vlog(LOG_INFO, emsg, ap);
144204df0f8Sclaudio 	va_end(ap);
145204df0f8Sclaudio }
146204df0f8Sclaudio 
147204df0f8Sclaudio void
log_debug(const char * emsg,...)148204df0f8Sclaudio log_debug(const char *emsg, ...)
149204df0f8Sclaudio {
150204df0f8Sclaudio 	va_list	 ap;
151204df0f8Sclaudio 
152636d06c3Sclaudio 	if (verbose) {
153204df0f8Sclaudio 		va_start(ap, emsg);
154204df0f8Sclaudio 		vlog(LOG_DEBUG, emsg, ap);
155204df0f8Sclaudio 		va_end(ap);
156204df0f8Sclaudio 	}
157204df0f8Sclaudio }
158204df0f8Sclaudio 
159f2e37bc3Sbenno static void
vfatalc(int code,const char * emsg,va_list ap)160f2e37bc3Sbenno vfatalc(int code, const char *emsg, va_list ap)
161f2e37bc3Sbenno {
162f2e37bc3Sbenno 	static char	s[BUFSIZ];
163f2e37bc3Sbenno 	const char	*sep;
164f2e37bc3Sbenno 
165f2e37bc3Sbenno 	if (emsg != NULL) {
166f2e37bc3Sbenno 		(void)vsnprintf(s, sizeof(s), emsg, ap);
167f2e37bc3Sbenno 		sep = ": ";
168f2e37bc3Sbenno 	} else {
169f2e37bc3Sbenno 		s[0] = '\0';
170f2e37bc3Sbenno 		sep = "";
171f2e37bc3Sbenno 	}
172f2e37bc3Sbenno 	if (code)
173f2e37bc3Sbenno 		logit(LOG_CRIT, "fatal in %s: %s%s%s",
174f2e37bc3Sbenno 		    log_procname, s, sep, strerror(code));
175f2e37bc3Sbenno 	else
176f2e37bc3Sbenno 		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
177f2e37bc3Sbenno }
178f2e37bc3Sbenno 
179204df0f8Sclaudio void
fatal(const char * emsg,...)180db8e85afSbenno fatal(const char *emsg, ...)
181204df0f8Sclaudio {
182db8e85afSbenno 	va_list	ap;
183db8e85afSbenno 
184db8e85afSbenno 	va_start(ap, emsg);
185f2e37bc3Sbenno 	vfatalc(errno, emsg, ap);
186db8e85afSbenno 	va_end(ap);
187204df0f8Sclaudio 	exit(1);
188204df0f8Sclaudio }
189204df0f8Sclaudio 
190204df0f8Sclaudio void
fatalx(const char * emsg,...)191f2e37bc3Sbenno fatalx(const char *emsg, ...)
192204df0f8Sclaudio {
193f2e37bc3Sbenno 	va_list	ap;
194f2e37bc3Sbenno 
195f2e37bc3Sbenno 	va_start(ap, emsg);
196f2e37bc3Sbenno 	vfatalc(0, emsg, ap);
197f2e37bc3Sbenno 	va_end(ap);
198f2e37bc3Sbenno 	exit(1);
199204df0f8Sclaudio }
200