xref: /openbsd-src/sbin/dhcp6leased/log.c (revision ad7c548deeaa2c33bdc52cd7728abc53a491537f)
1*ad7c548dSflorian /*	$OpenBSD: log.c,v 1.1 2024/06/02 12:28:05 florian Exp $	*/
2*ad7c548dSflorian 
3*ad7c548dSflorian /*
4*ad7c548dSflorian  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5*ad7c548dSflorian  *
6*ad7c548dSflorian  * Permission to use, copy, modify, and distribute this software for any
7*ad7c548dSflorian  * purpose with or without fee is hereby granted, provided that the above
8*ad7c548dSflorian  * copyright notice and this permission notice appear in all copies.
9*ad7c548dSflorian  *
10*ad7c548dSflorian  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*ad7c548dSflorian  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*ad7c548dSflorian  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*ad7c548dSflorian  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*ad7c548dSflorian  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*ad7c548dSflorian  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*ad7c548dSflorian  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*ad7c548dSflorian  */
18*ad7c548dSflorian 
19*ad7c548dSflorian #include <stdio.h>
20*ad7c548dSflorian #include <stdlib.h>
21*ad7c548dSflorian #include <stdarg.h>
22*ad7c548dSflorian #include <string.h>
23*ad7c548dSflorian #include <syslog.h>
24*ad7c548dSflorian #include <errno.h>
25*ad7c548dSflorian #include <time.h>
26*ad7c548dSflorian 
27*ad7c548dSflorian #include "log.h"
28*ad7c548dSflorian 
29*ad7c548dSflorian static int		 debug;
30*ad7c548dSflorian static int		 verbose;
31*ad7c548dSflorian static const char	*log_procname;
32*ad7c548dSflorian 
33*ad7c548dSflorian void
log_init(int n_debug,int facility)34*ad7c548dSflorian log_init(int n_debug, int facility)
35*ad7c548dSflorian {
36*ad7c548dSflorian 	extern char	*__progname;
37*ad7c548dSflorian 
38*ad7c548dSflorian 	debug = n_debug;
39*ad7c548dSflorian 	verbose = n_debug;
40*ad7c548dSflorian 	log_procinit(__progname);
41*ad7c548dSflorian 
42*ad7c548dSflorian 	if (!debug)
43*ad7c548dSflorian 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
44*ad7c548dSflorian 
45*ad7c548dSflorian 	tzset();
46*ad7c548dSflorian }
47*ad7c548dSflorian 
48*ad7c548dSflorian void
log_procinit(const char * procname)49*ad7c548dSflorian log_procinit(const char *procname)
50*ad7c548dSflorian {
51*ad7c548dSflorian 	if (procname != NULL)
52*ad7c548dSflorian 		log_procname = procname;
53*ad7c548dSflorian }
54*ad7c548dSflorian 
55*ad7c548dSflorian void
log_setverbose(int v)56*ad7c548dSflorian log_setverbose(int v)
57*ad7c548dSflorian {
58*ad7c548dSflorian 	verbose = v;
59*ad7c548dSflorian }
60*ad7c548dSflorian 
61*ad7c548dSflorian int
log_getverbose(void)62*ad7c548dSflorian log_getverbose(void)
63*ad7c548dSflorian {
64*ad7c548dSflorian 	return (verbose);
65*ad7c548dSflorian }
66*ad7c548dSflorian 
67*ad7c548dSflorian void
logit(int pri,const char * fmt,...)68*ad7c548dSflorian logit(int pri, const char *fmt, ...)
69*ad7c548dSflorian {
70*ad7c548dSflorian 	va_list	ap;
71*ad7c548dSflorian 
72*ad7c548dSflorian 	va_start(ap, fmt);
73*ad7c548dSflorian 	vlog(pri, fmt, ap);
74*ad7c548dSflorian 	va_end(ap);
75*ad7c548dSflorian }
76*ad7c548dSflorian 
77*ad7c548dSflorian void
vlog(int pri,const char * fmt,va_list ap)78*ad7c548dSflorian vlog(int pri, const char *fmt, va_list ap)
79*ad7c548dSflorian {
80*ad7c548dSflorian 	char	*nfmt;
81*ad7c548dSflorian 	int	 saved_errno = errno;
82*ad7c548dSflorian 
83*ad7c548dSflorian 	if (debug) {
84*ad7c548dSflorian 		/* best effort in out of mem situations */
85*ad7c548dSflorian 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
86*ad7c548dSflorian 			vfprintf(stderr, fmt, ap);
87*ad7c548dSflorian 			fprintf(stderr, "\n");
88*ad7c548dSflorian 		} else {
89*ad7c548dSflorian 			vfprintf(stderr, nfmt, ap);
90*ad7c548dSflorian 			free(nfmt);
91*ad7c548dSflorian 		}
92*ad7c548dSflorian 		fflush(stderr);
93*ad7c548dSflorian 	} else
94*ad7c548dSflorian 		vsyslog(pri, fmt, ap);
95*ad7c548dSflorian 
96*ad7c548dSflorian 	errno = saved_errno;
97*ad7c548dSflorian }
98*ad7c548dSflorian 
99*ad7c548dSflorian void
log_warn(const char * emsg,...)100*ad7c548dSflorian log_warn(const char *emsg, ...)
101*ad7c548dSflorian {
102*ad7c548dSflorian 	char		*nfmt;
103*ad7c548dSflorian 	va_list		 ap;
104*ad7c548dSflorian 	int		 saved_errno = errno;
105*ad7c548dSflorian 
106*ad7c548dSflorian 	/* best effort to even work in out of memory situations */
107*ad7c548dSflorian 	if (emsg == NULL)
108*ad7c548dSflorian 		logit(LOG_ERR, "%s", strerror(saved_errno));
109*ad7c548dSflorian 	else {
110*ad7c548dSflorian 		va_start(ap, emsg);
111*ad7c548dSflorian 
112*ad7c548dSflorian 		if (asprintf(&nfmt, "%s: %s", emsg,
113*ad7c548dSflorian 		    strerror(saved_errno)) == -1) {
114*ad7c548dSflorian 			/* we tried it... */
115*ad7c548dSflorian 			vlog(LOG_ERR, emsg, ap);
116*ad7c548dSflorian 			logit(LOG_ERR, "%s", strerror(saved_errno));
117*ad7c548dSflorian 		} else {
118*ad7c548dSflorian 			vlog(LOG_ERR, nfmt, ap);
119*ad7c548dSflorian 			free(nfmt);
120*ad7c548dSflorian 		}
121*ad7c548dSflorian 		va_end(ap);
122*ad7c548dSflorian 	}
123*ad7c548dSflorian 
124*ad7c548dSflorian 	errno = saved_errno;
125*ad7c548dSflorian }
126*ad7c548dSflorian 
127*ad7c548dSflorian void
log_warnx(const char * emsg,...)128*ad7c548dSflorian log_warnx(const char *emsg, ...)
129*ad7c548dSflorian {
130*ad7c548dSflorian 	va_list	 ap;
131*ad7c548dSflorian 
132*ad7c548dSflorian 	va_start(ap, emsg);
133*ad7c548dSflorian 	vlog(LOG_ERR, emsg, ap);
134*ad7c548dSflorian 	va_end(ap);
135*ad7c548dSflorian }
136*ad7c548dSflorian 
137*ad7c548dSflorian void
log_info(const char * emsg,...)138*ad7c548dSflorian log_info(const char *emsg, ...)
139*ad7c548dSflorian {
140*ad7c548dSflorian 	va_list	 ap;
141*ad7c548dSflorian 
142*ad7c548dSflorian 	va_start(ap, emsg);
143*ad7c548dSflorian 	vlog(LOG_INFO, emsg, ap);
144*ad7c548dSflorian 	va_end(ap);
145*ad7c548dSflorian }
146*ad7c548dSflorian 
147*ad7c548dSflorian void
log_debug(const char * emsg,...)148*ad7c548dSflorian log_debug(const char *emsg, ...)
149*ad7c548dSflorian {
150*ad7c548dSflorian 	va_list	 ap;
151*ad7c548dSflorian 
152*ad7c548dSflorian 	if (verbose) {
153*ad7c548dSflorian 		va_start(ap, emsg);
154*ad7c548dSflorian 		vlog(LOG_DEBUG, emsg, ap);
155*ad7c548dSflorian 		va_end(ap);
156*ad7c548dSflorian 	}
157*ad7c548dSflorian }
158*ad7c548dSflorian 
159*ad7c548dSflorian static void
vfatalc(int code,const char * emsg,va_list ap)160*ad7c548dSflorian vfatalc(int code, const char *emsg, va_list ap)
161*ad7c548dSflorian {
162*ad7c548dSflorian 	static char	s[BUFSIZ];
163*ad7c548dSflorian 	const char	*sep;
164*ad7c548dSflorian 
165*ad7c548dSflorian 	if (emsg != NULL) {
166*ad7c548dSflorian 		(void)vsnprintf(s, sizeof(s), emsg, ap);
167*ad7c548dSflorian 		sep = ": ";
168*ad7c548dSflorian 	} else {
169*ad7c548dSflorian 		s[0] = '\0';
170*ad7c548dSflorian 		sep = "";
171*ad7c548dSflorian 	}
172*ad7c548dSflorian 	if (code)
173*ad7c548dSflorian 		logit(LOG_CRIT, "fatal in %s: %s%s%s",
174*ad7c548dSflorian 		    log_procname, s, sep, strerror(code));
175*ad7c548dSflorian 	else
176*ad7c548dSflorian 		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
177*ad7c548dSflorian }
178*ad7c548dSflorian 
179*ad7c548dSflorian void
fatal(const char * emsg,...)180*ad7c548dSflorian fatal(const char *emsg, ...)
181*ad7c548dSflorian {
182*ad7c548dSflorian 	va_list	ap;
183*ad7c548dSflorian 
184*ad7c548dSflorian 	va_start(ap, emsg);
185*ad7c548dSflorian 	vfatalc(errno, emsg, ap);
186*ad7c548dSflorian 	va_end(ap);
187*ad7c548dSflorian 	exit(1);
188*ad7c548dSflorian }
189*ad7c548dSflorian 
190*ad7c548dSflorian void
fatalx(const char * emsg,...)191*ad7c548dSflorian fatalx(const char *emsg, ...)
192*ad7c548dSflorian {
193*ad7c548dSflorian 	va_list	ap;
194*ad7c548dSflorian 
195*ad7c548dSflorian 	va_start(ap, emsg);
196*ad7c548dSflorian 	vfatalc(0, emsg, ap);
197*ad7c548dSflorian 	va_end(ap);
198*ad7c548dSflorian 	exit(1);
199*ad7c548dSflorian }
200