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