xref: /openbsd-src/usr.sbin/ifstated/log.c (revision bfdb9ad444cb5d17bc1b9442362fbf55eee5e8f5)
1*bfdb9ad4Sbenno /*	$OpenBSD: log.c,v 1.5 2017/06/18 12:03:47 benno Exp $	*/
235360db1Spyr 
335360db1Spyr /*
435360db1Spyr  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
535360db1Spyr  *
635360db1Spyr  * Permission to use, copy, modify, and distribute this software for any
735360db1Spyr  * purpose with or without fee is hereby granted, provided that the above
835360db1Spyr  * copyright notice and this permission notice appear in all copies.
935360db1Spyr  *
1035360db1Spyr  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1135360db1Spyr  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1235360db1Spyr  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1335360db1Spyr  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
144c905955Sbenno  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
154c905955Sbenno  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
164c905955Sbenno  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1735360db1Spyr  */
1835360db1Spyr 
1935360db1Spyr #include <stdio.h>
2035360db1Spyr #include <stdlib.h>
21*bfdb9ad4Sbenno #include <stdarg.h>
2235360db1Spyr #include <string.h>
2335360db1Spyr #include <syslog.h>
24*bfdb9ad4Sbenno #include <errno.h>
254c905955Sbenno #include <time.h>
2635360db1Spyr 
27*bfdb9ad4Sbenno #include "log.h"
2835360db1Spyr 
29*bfdb9ad4Sbenno static int		 debug;
30*bfdb9ad4Sbenno static int		 verbose;
31*bfdb9ad4Sbenno static const char	*log_procname;
324c905955Sbenno 
3335360db1Spyr void
log_init(int n_debug,int facility)34*bfdb9ad4Sbenno log_init(int n_debug, int facility)
3535360db1Spyr {
3635360db1Spyr 	extern char	*__progname;
3735360db1Spyr 
3835360db1Spyr 	debug = n_debug;
39*bfdb9ad4Sbenno 	verbose = n_debug;
40*bfdb9ad4Sbenno 	log_procinit(__progname);
4135360db1Spyr 
4235360db1Spyr 	if (!debug)
43*bfdb9ad4Sbenno 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
4435360db1Spyr 
4535360db1Spyr 	tzset();
4635360db1Spyr }
4735360db1Spyr 
4835360db1Spyr void
log_procinit(const char * procname)49*bfdb9ad4Sbenno log_procinit(const char *procname)
50*bfdb9ad4Sbenno {
51*bfdb9ad4Sbenno 	if (procname != NULL)
52*bfdb9ad4Sbenno 		log_procname = procname;
53*bfdb9ad4Sbenno }
54*bfdb9ad4Sbenno 
55*bfdb9ad4Sbenno void
log_setverbose(int v)56*bfdb9ad4Sbenno log_setverbose(int v)
57*bfdb9ad4Sbenno {
58*bfdb9ad4Sbenno 	verbose = v;
59*bfdb9ad4Sbenno }
60*bfdb9ad4Sbenno 
61*bfdb9ad4Sbenno int
log_getverbose(void)62*bfdb9ad4Sbenno log_getverbose(void)
63*bfdb9ad4Sbenno {
64*bfdb9ad4Sbenno 	return (verbose);
65*bfdb9ad4Sbenno }
66*bfdb9ad4Sbenno 
67*bfdb9ad4Sbenno void
logit(int pri,const char * fmt,...)6835360db1Spyr logit(int pri, const char *fmt, ...)
6935360db1Spyr {
7035360db1Spyr 	va_list	ap;
7135360db1Spyr 
7235360db1Spyr 	va_start(ap, fmt);
7335360db1Spyr 	vlog(pri, fmt, ap);
7435360db1Spyr 	va_end(ap);
7535360db1Spyr }
7635360db1Spyr 
7735360db1Spyr void
vlog(int pri,const char * fmt,va_list ap)7835360db1Spyr vlog(int pri, const char *fmt, va_list ap)
7935360db1Spyr {
8035360db1Spyr 	char	*nfmt;
81*bfdb9ad4Sbenno 	int	 saved_errno = errno;
8235360db1Spyr 
8335360db1Spyr 	if (debug) {
8435360db1Spyr 		/* best effort in out of mem situations */
8535360db1Spyr 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
8635360db1Spyr 			vfprintf(stderr, fmt, ap);
8735360db1Spyr 			fprintf(stderr, "\n");
8835360db1Spyr 		} else {
8935360db1Spyr 			vfprintf(stderr, nfmt, ap);
9035360db1Spyr 			free(nfmt);
9135360db1Spyr 		}
9235360db1Spyr 		fflush(stderr);
9335360db1Spyr 	} else
9435360db1Spyr 		vsyslog(pri, fmt, ap);
95*bfdb9ad4Sbenno 
96*bfdb9ad4Sbenno 	errno = saved_errno;
9735360db1Spyr }
9835360db1Spyr 
9935360db1Spyr void
log_warn(const char * emsg,...)10035360db1Spyr log_warn(const char *emsg, ...)
10135360db1Spyr {
10235360db1Spyr 	char		*nfmt;
10335360db1Spyr 	va_list		 ap;
104*bfdb9ad4Sbenno 	int		 saved_errno = errno;
10535360db1Spyr 
10635360db1Spyr 	/* best effort to even work in out of memory situations */
10735360db1Spyr 	if (emsg == NULL)
108*bfdb9ad4Sbenno 		logit(LOG_ERR, "%s", strerror(saved_errno));
10935360db1Spyr 	else {
11035360db1Spyr 		va_start(ap, emsg);
11135360db1Spyr 
112*bfdb9ad4Sbenno 		if (asprintf(&nfmt, "%s: %s", emsg,
113*bfdb9ad4Sbenno 		    strerror(saved_errno)) == -1) {
11435360db1Spyr 			/* we tried it... */
1159b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
116*bfdb9ad4Sbenno 			logit(LOG_ERR, "%s", strerror(saved_errno));
11735360db1Spyr 		} else {
1189b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
11935360db1Spyr 			free(nfmt);
12035360db1Spyr 		}
12135360db1Spyr 		va_end(ap);
12235360db1Spyr 	}
123*bfdb9ad4Sbenno 
124*bfdb9ad4Sbenno 	errno = saved_errno;
12535360db1Spyr }
12635360db1Spyr 
12735360db1Spyr void
log_warnx(const char * emsg,...)12835360db1Spyr log_warnx(const char *emsg, ...)
12935360db1Spyr {
13035360db1Spyr 	va_list	 ap;
13135360db1Spyr 
13235360db1Spyr 	va_start(ap, emsg);
1339b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
13435360db1Spyr 	va_end(ap);
13535360db1Spyr }
13635360db1Spyr 
13735360db1Spyr void
log_info(const char * emsg,...)13835360db1Spyr log_info(const char *emsg, ...)
13935360db1Spyr {
14035360db1Spyr 	va_list	 ap;
14135360db1Spyr 
14235360db1Spyr 	va_start(ap, emsg);
14335360db1Spyr 	vlog(LOG_INFO, emsg, ap);
14435360db1Spyr 	va_end(ap);
14535360db1Spyr }
14635360db1Spyr 
14735360db1Spyr void
log_debug(const char * emsg,...)14835360db1Spyr log_debug(const char *emsg, ...)
14935360db1Spyr {
15035360db1Spyr 	va_list	 ap;
15135360db1Spyr 
152*bfdb9ad4Sbenno 	if (verbose) {
15335360db1Spyr 		va_start(ap, emsg);
15435360db1Spyr 		vlog(LOG_DEBUG, emsg, ap);
15535360db1Spyr 		va_end(ap);
15635360db1Spyr 	}
15735360db1Spyr }
15835360db1Spyr 
159*bfdb9ad4Sbenno static void
vfatalc(int code,const char * emsg,va_list ap)160*bfdb9ad4Sbenno vfatalc(int code, const char *emsg, va_list ap)
16135360db1Spyr {
162*bfdb9ad4Sbenno 	static char	s[BUFSIZ];
163*bfdb9ad4Sbenno 	const char	*sep;
16435360db1Spyr 
165*bfdb9ad4Sbenno 	if (emsg != NULL) {
166*bfdb9ad4Sbenno 		(void)vsnprintf(s, sizeof(s), emsg, ap);
167*bfdb9ad4Sbenno 		sep = ": ";
168*bfdb9ad4Sbenno 	} else {
169*bfdb9ad4Sbenno 		s[0] = '\0';
170*bfdb9ad4Sbenno 		sep = "";
171*bfdb9ad4Sbenno 	}
172*bfdb9ad4Sbenno 	if (code)
173*bfdb9ad4Sbenno 		logit(LOG_CRIT, "fatal in %s: %s%s%s",
174*bfdb9ad4Sbenno 		    log_procname, s, sep, strerror(code));
175*bfdb9ad4Sbenno 	else
176*bfdb9ad4Sbenno 		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
177*bfdb9ad4Sbenno }
178*bfdb9ad4Sbenno 
179*bfdb9ad4Sbenno void
fatal(const char * emsg,...)180*bfdb9ad4Sbenno fatal(const char *emsg, ...)
181*bfdb9ad4Sbenno {
182*bfdb9ad4Sbenno 	va_list	ap;
183*bfdb9ad4Sbenno 
184*bfdb9ad4Sbenno 	va_start(ap, emsg);
185*bfdb9ad4Sbenno 	vfatalc(errno, emsg, ap);
186*bfdb9ad4Sbenno 	va_end(ap);
18735360db1Spyr 	exit(1);
18835360db1Spyr }
18935360db1Spyr 
19035360db1Spyr void
fatalx(const char * emsg,...)191*bfdb9ad4Sbenno fatalx(const char *emsg, ...)
19235360db1Spyr {
193*bfdb9ad4Sbenno 	va_list	ap;
194*bfdb9ad4Sbenno 
195*bfdb9ad4Sbenno 	va_start(ap, emsg);
196*bfdb9ad4Sbenno 	vfatalc(0, emsg, ap);
197*bfdb9ad4Sbenno 	va_end(ap);
198*bfdb9ad4Sbenno 	exit(1);
19935360db1Spyr }
200