xref: /openbsd-src/sbin/iked/log.c (revision 9b2c1562932ce8ef5a9c88720f87a65f2e0ed290)
1*9b2c1562Sbluhm /*	$OpenBSD: log.c,v 1.12 2017/03/21 12:06:55 bluhm Exp $	*/
245ae9d61Sreyk 
345ae9d61Sreyk /*
445ae9d61Sreyk  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
545ae9d61Sreyk  *
645ae9d61Sreyk  * Permission to use, copy, modify, and distribute this software for any
745ae9d61Sreyk  * purpose with or without fee is hereby granted, provided that the above
845ae9d61Sreyk  * copyright notice and this permission notice appear in all copies.
945ae9d61Sreyk  *
1045ae9d61Sreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1145ae9d61Sreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1245ae9d61Sreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1345ae9d61Sreyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14d4fdf7edSreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15d4fdf7edSreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16d4fdf7edSreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1745ae9d61Sreyk  */
1845ae9d61Sreyk 
1945ae9d61Sreyk #include <stdio.h>
2045ae9d61Sreyk #include <stdlib.h>
216a7fa426Sreyk #include <stdarg.h>
2245ae9d61Sreyk #include <string.h>
2345ae9d61Sreyk #include <syslog.h>
246a7fa426Sreyk #include <errno.h>
256a7fa426Sreyk #include <time.h>
2645ae9d61Sreyk 
27871fc12cSreyk static int	 debug;
28871fc12cSreyk static int	 verbose;
290f12961aSreyk const char	*log_procname;
3045ae9d61Sreyk 
310f12961aSreyk void	log_init(int, int);
320f12961aSreyk void	log_procinit(const char *);
33871fc12cSreyk void	log_setverbose(int);
34871fc12cSreyk int	log_getverbose(void);
356a7fa426Sreyk void	log_warn(const char *, ...)
366a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
376a7fa426Sreyk void	log_warnx(const char *, ...)
386a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
396a7fa426Sreyk void	log_info(const char *, ...)
406a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
416a7fa426Sreyk void	log_debug(const char *, ...)
426a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
436a7fa426Sreyk void	logit(int, const char *, ...)
446a7fa426Sreyk 	    __attribute__((__format__ (printf, 2, 3)));
456a7fa426Sreyk void	vlog(int, const char *, va_list)
466a7fa426Sreyk 	    __attribute__((__format__ (printf, 2, 0)));
470f12961aSreyk __dead void fatal(const char *, ...)
480f12961aSreyk 	    __attribute__((__format__ (printf, 1, 2)));
490f12961aSreyk __dead void fatalx(const char *, ...)
500f12961aSreyk 	    __attribute__((__format__ (printf, 1, 2)));
5145ae9d61Sreyk 
5245ae9d61Sreyk void
log_init(int n_debug,int facility)530f12961aSreyk log_init(int n_debug, int facility)
5445ae9d61Sreyk {
5545ae9d61Sreyk 	extern char	*__progname;
5645ae9d61Sreyk 
5745ae9d61Sreyk 	debug = n_debug;
5845ae9d61Sreyk 	verbose = n_debug;
590f12961aSreyk 	log_procinit(__progname);
6045ae9d61Sreyk 
6145ae9d61Sreyk 	if (!debug)
620f12961aSreyk 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
6345ae9d61Sreyk 
6445ae9d61Sreyk 	tzset();
6545ae9d61Sreyk }
6645ae9d61Sreyk 
6745ae9d61Sreyk void
log_procinit(const char * procname)680f12961aSreyk log_procinit(const char *procname)
690f12961aSreyk {
700f12961aSreyk 	if (procname != NULL)
710f12961aSreyk 		log_procname = procname;
720f12961aSreyk }
730f12961aSreyk 
740f12961aSreyk void
log_setverbose(int v)75871fc12cSreyk log_setverbose(int v)
7645ae9d61Sreyk {
7745ae9d61Sreyk 	verbose = v;
7845ae9d61Sreyk }
7945ae9d61Sreyk 
80871fc12cSreyk int
log_getverbose(void)81871fc12cSreyk log_getverbose(void)
82871fc12cSreyk {
83871fc12cSreyk 	return (verbose);
84871fc12cSreyk }
85871fc12cSreyk 
8645ae9d61Sreyk void
logit(int pri,const char * fmt,...)8745ae9d61Sreyk logit(int pri, const char *fmt, ...)
8845ae9d61Sreyk {
8945ae9d61Sreyk 	va_list	ap;
9045ae9d61Sreyk 
9145ae9d61Sreyk 	va_start(ap, fmt);
9245ae9d61Sreyk 	vlog(pri, fmt, ap);
9345ae9d61Sreyk 	va_end(ap);
9445ae9d61Sreyk }
9545ae9d61Sreyk 
9645ae9d61Sreyk void
vlog(int pri,const char * fmt,va_list ap)9745ae9d61Sreyk vlog(int pri, const char *fmt, va_list ap)
9845ae9d61Sreyk {
9945ae9d61Sreyk 	char	*nfmt;
1009f5ef5a9Sreyk 	int	 saved_errno = errno;
10145ae9d61Sreyk 
10245ae9d61Sreyk 	if (debug) {
10345ae9d61Sreyk 		/* best effort in out of mem situations */
10445ae9d61Sreyk 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
10545ae9d61Sreyk 			vfprintf(stderr, fmt, ap);
10645ae9d61Sreyk 			fprintf(stderr, "\n");
10745ae9d61Sreyk 		} else {
10845ae9d61Sreyk 			vfprintf(stderr, nfmt, ap);
10945ae9d61Sreyk 			free(nfmt);
11045ae9d61Sreyk 		}
11145ae9d61Sreyk 		fflush(stderr);
11245ae9d61Sreyk 	} else
11345ae9d61Sreyk 		vsyslog(pri, fmt, ap);
11445ae9d61Sreyk 
1159f5ef5a9Sreyk 	errno = saved_errno;
1169f5ef5a9Sreyk }
11745ae9d61Sreyk 
11845ae9d61Sreyk void
log_warn(const char * emsg,...)11945ae9d61Sreyk log_warn(const char *emsg, ...)
12045ae9d61Sreyk {
12145ae9d61Sreyk 	char		*nfmt;
12245ae9d61Sreyk 	va_list		 ap;
123a6bfe157Sreyk 	int		 saved_errno = errno;
12445ae9d61Sreyk 
12545ae9d61Sreyk 	/* best effort to even work in out of memory situations */
12645ae9d61Sreyk 	if (emsg == NULL)
127*9b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
12845ae9d61Sreyk 	else {
12945ae9d61Sreyk 		va_start(ap, emsg);
13045ae9d61Sreyk 
131a6bfe157Sreyk 		if (asprintf(&nfmt, "%s: %s", emsg,
132a6bfe157Sreyk 		    strerror(saved_errno)) == -1) {
13345ae9d61Sreyk 			/* we tried it... */
134*9b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
135*9b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(saved_errno));
13645ae9d61Sreyk 		} else {
137*9b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
13845ae9d61Sreyk 			free(nfmt);
13945ae9d61Sreyk 		}
14045ae9d61Sreyk 		va_end(ap);
14145ae9d61Sreyk 	}
1429f5ef5a9Sreyk 
1439f5ef5a9Sreyk 	errno = saved_errno;
14445ae9d61Sreyk }
14545ae9d61Sreyk 
14645ae9d61Sreyk void
log_warnx(const char * emsg,...)14745ae9d61Sreyk log_warnx(const char *emsg, ...)
14845ae9d61Sreyk {
14945ae9d61Sreyk 	va_list	 ap;
15045ae9d61Sreyk 
15145ae9d61Sreyk 	va_start(ap, emsg);
152*9b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
15345ae9d61Sreyk 	va_end(ap);
15445ae9d61Sreyk }
15545ae9d61Sreyk 
15645ae9d61Sreyk void
log_info(const char * emsg,...)15745ae9d61Sreyk log_info(const char *emsg, ...)
15845ae9d61Sreyk {
15945ae9d61Sreyk 	va_list	 ap;
16045ae9d61Sreyk 
16145ae9d61Sreyk 	va_start(ap, emsg);
16245ae9d61Sreyk 	vlog(LOG_INFO, emsg, ap);
16345ae9d61Sreyk 	va_end(ap);
16445ae9d61Sreyk }
16545ae9d61Sreyk 
16645ae9d61Sreyk void
log_debug(const char * emsg,...)16745ae9d61Sreyk log_debug(const char *emsg, ...)
16845ae9d61Sreyk {
16945ae9d61Sreyk 	va_list	 ap;
17045ae9d61Sreyk 
17145ae9d61Sreyk 	if (verbose > 1) {
17245ae9d61Sreyk 		va_start(ap, emsg);
17345ae9d61Sreyk 		vlog(LOG_DEBUG, emsg, ap);
17445ae9d61Sreyk 		va_end(ap);
17545ae9d61Sreyk 	}
17645ae9d61Sreyk }
17745ae9d61Sreyk 
1780f12961aSreyk static void
vfatalc(int code,const char * emsg,va_list ap)1799f5ef5a9Sreyk vfatalc(int code, const char *emsg, va_list ap)
18045ae9d61Sreyk {
1810f12961aSreyk 	static char	s[BUFSIZ];
1820f12961aSreyk 	const char	*sep;
18345ae9d61Sreyk 
1840f12961aSreyk 	if (emsg != NULL) {
1850f12961aSreyk 		(void)vsnprintf(s, sizeof(s), emsg, ap);
1860f12961aSreyk 		sep = ": ";
1870f12961aSreyk 	} else {
1880f12961aSreyk 		s[0] = '\0';
1890f12961aSreyk 		sep = "";
1900f12961aSreyk 	}
1919f5ef5a9Sreyk 	if (code)
192cd7658e8Sreyk 		logit(LOG_CRIT, "%s: %s%s%s",
1939f5ef5a9Sreyk 		    log_procname, s, sep, strerror(code));
1940f12961aSreyk 	else
195cd7658e8Sreyk 		logit(LOG_CRIT, "%s%s%s", log_procname, sep, s);
1960f12961aSreyk }
1970f12961aSreyk 
1980f12961aSreyk void
fatal(const char * emsg,...)1990f12961aSreyk fatal(const char *emsg, ...)
2000f12961aSreyk {
2010f12961aSreyk 	va_list	ap;
2020f12961aSreyk 
2030f12961aSreyk 	va_start(ap, emsg);
2049f5ef5a9Sreyk 	vfatalc(errno, emsg, ap);
2050f12961aSreyk 	va_end(ap);
20645ae9d61Sreyk 	exit(1);
20745ae9d61Sreyk }
20845ae9d61Sreyk 
20945ae9d61Sreyk void
fatalx(const char * emsg,...)2100f12961aSreyk fatalx(const char *emsg, ...)
21145ae9d61Sreyk {
2120f12961aSreyk 	va_list	ap;
2130f12961aSreyk 
2140f12961aSreyk 	va_start(ap, emsg);
2159f5ef5a9Sreyk 	vfatalc(0, emsg, ap);
2160f12961aSreyk 	va_end(ap);
2170f12961aSreyk 	exit(1);
21845ae9d61Sreyk }
219