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