xref: /openbsd-src/usr.sbin/vmd/log.c (revision 08d0da61ad3ca376416319ae810abe5d5ad26604)
1*08d0da61Sdv /*	$OpenBSD: log.c,v 1.9 2023/09/26 01:53:54 dv Exp $	*/
27da934edSreyk 
37da934edSreyk /*
47da934edSreyk  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
57da934edSreyk  *
67da934edSreyk  * Permission to use, copy, modify, and distribute this software for any
77da934edSreyk  * purpose with or without fee is hereby granted, provided that the above
87da934edSreyk  * copyright notice and this permission notice appear in all copies.
97da934edSreyk  *
107da934edSreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
117da934edSreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
127da934edSreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
137da934edSreyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
147da934edSreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
157da934edSreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
167da934edSreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
177da934edSreyk  */
187da934edSreyk 
197da934edSreyk #include <stdio.h>
207da934edSreyk #include <stdlib.h>
217da934edSreyk #include <stdarg.h>
227da934edSreyk #include <string.h>
237da934edSreyk #include <syslog.h>
247da934edSreyk #include <errno.h>
257da934edSreyk #include <time.h>
267da934edSreyk 
27*08d0da61Sdv #include "proc.h"
28*08d0da61Sdv 
29871fc12cSreyk static int	 debug;
30871fc12cSreyk static int	 verbose;
31*08d0da61Sdv static char	 log_procname[2048];
327da934edSreyk 
337da934edSreyk void
log_init(int n_debug,int facility)347da934edSreyk log_init(int n_debug, int facility)
357da934edSreyk {
367da934edSreyk 	extern char	*__progname;
377da934edSreyk 
387da934edSreyk 	debug = n_debug;
397da934edSreyk 	verbose = n_debug;
40*08d0da61Sdv 	log_procinit("%s", __progname);
417da934edSreyk 
427da934edSreyk 	if (!debug)
437da934edSreyk 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
447da934edSreyk 
457da934edSreyk 	tzset();
467da934edSreyk }
477da934edSreyk 
487da934edSreyk void
log_procinit(const char * fmt,...)49*08d0da61Sdv log_procinit(const char *fmt, ...)
507da934edSreyk {
51*08d0da61Sdv 	va_list ap;
52*08d0da61Sdv 	va_start(ap, fmt);
53*08d0da61Sdv 	vsnprintf(log_procname, sizeof(log_procname), fmt, ap);
54*08d0da61Sdv 	va_end(ap);
557da934edSreyk }
567da934edSreyk 
577da934edSreyk void
log_setverbose(int v)58871fc12cSreyk log_setverbose(int v)
597da934edSreyk {
607da934edSreyk 	verbose = v;
617da934edSreyk }
627da934edSreyk 
63871fc12cSreyk int
log_getverbose(void)64871fc12cSreyk log_getverbose(void)
65871fc12cSreyk {
66871fc12cSreyk 	return (verbose);
67871fc12cSreyk }
68871fc12cSreyk 
697da934edSreyk void
logit(int pri,const char * fmt,...)707da934edSreyk logit(int pri, const char *fmt, ...)
717da934edSreyk {
727da934edSreyk 	va_list	ap;
737da934edSreyk 
747da934edSreyk 	va_start(ap, fmt);
757da934edSreyk 	vlog(pri, fmt, ap);
767da934edSreyk 	va_end(ap);
777da934edSreyk }
787da934edSreyk 
797da934edSreyk void
vlog(int pri,const char * fmt,va_list ap)807da934edSreyk vlog(int pri, const char *fmt, va_list ap)
817da934edSreyk {
827da934edSreyk 	char	*nfmt;
83db8420cbSreyk 	int	 saved_errno = errno;
847da934edSreyk 
857da934edSreyk 	if (debug) {
867da934edSreyk 		/* best effort in out of mem situations */
87*08d0da61Sdv 		if (asprintf(&nfmt, "%s: %s\n", log_procname, fmt) == -1) {
887da934edSreyk 			vfprintf(stderr, fmt, ap);
897da934edSreyk 			fprintf(stderr, "\n");
907da934edSreyk 		} else {
917da934edSreyk 			vfprintf(stderr, nfmt, ap);
927da934edSreyk 			free(nfmt);
937da934edSreyk 		}
947da934edSreyk 		fflush(stderr);
957da934edSreyk 	} else
967da934edSreyk 		vsyslog(pri, fmt, ap);
977da934edSreyk 
98db8420cbSreyk 	errno = saved_errno;
99db8420cbSreyk }
1007da934edSreyk 
1017da934edSreyk void
log_warn(const char * emsg,...)1027da934edSreyk log_warn(const char *emsg, ...)
1037da934edSreyk {
1047da934edSreyk 	char		*nfmt;
1057da934edSreyk 	va_list		 ap;
106cadeec72Sreyk 	int		 saved_errno = errno;
1077da934edSreyk 
1087da934edSreyk 	/* best effort to even work in out of memory situations */
1097da934edSreyk 	if (emsg == NULL)
1109b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
1117da934edSreyk 	else {
1127da934edSreyk 		va_start(ap, emsg);
1137da934edSreyk 
114cadeec72Sreyk 		if (asprintf(&nfmt, "%s: %s", emsg,
115cadeec72Sreyk 		    strerror(saved_errno)) == -1) {
1167da934edSreyk 			/* we tried it... */
1179b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
1189b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(saved_errno));
1197da934edSreyk 		} else {
1209b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
1217da934edSreyk 			free(nfmt);
1227da934edSreyk 		}
1237da934edSreyk 		va_end(ap);
1247da934edSreyk 	}
125a4f3ffb8Sreyk 
126a4f3ffb8Sreyk 	errno = saved_errno;
1277da934edSreyk }
1287da934edSreyk 
1297da934edSreyk void
log_warnx(const char * emsg,...)1307da934edSreyk log_warnx(const char *emsg, ...)
1317da934edSreyk {
1327da934edSreyk 	va_list	 ap;
1337da934edSreyk 
1347da934edSreyk 	va_start(ap, emsg);
1359b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
1367da934edSreyk 	va_end(ap);
1377da934edSreyk }
1387da934edSreyk 
1397da934edSreyk void
log_info(const char * emsg,...)1407da934edSreyk log_info(const char *emsg, ...)
1417da934edSreyk {
1427da934edSreyk 	va_list	 ap;
1437da934edSreyk 
1447da934edSreyk 	va_start(ap, emsg);
1457da934edSreyk 	vlog(LOG_INFO, emsg, ap);
1467da934edSreyk 	va_end(ap);
1477da934edSreyk }
1487da934edSreyk 
1497da934edSreyk void
log_debug(const char * emsg,...)1507da934edSreyk log_debug(const char *emsg, ...)
1517da934edSreyk {
1527da934edSreyk 	va_list	 ap;
1537da934edSreyk 
1547da934edSreyk 	if (verbose > 1) {
1557da934edSreyk 		va_start(ap, emsg);
1567da934edSreyk 		vlog(LOG_DEBUG, emsg, ap);
1577da934edSreyk 		va_end(ap);
1587da934edSreyk 	}
1597da934edSreyk }
1607da934edSreyk 
1617da934edSreyk static void
vfatalc(int code,const char * emsg,va_list ap)162b7af0f14Sguenther vfatalc(int code, const char *emsg, va_list ap)
1637da934edSreyk {
1647da934edSreyk 	static char	s[BUFSIZ];
1657da934edSreyk 	const char	*sep;
1667da934edSreyk 
1677da934edSreyk 	if (emsg != NULL) {
1687da934edSreyk 		(void)vsnprintf(s, sizeof(s), emsg, ap);
1697da934edSreyk 		sep = ": ";
1707da934edSreyk 	} else {
1717da934edSreyk 		s[0] = '\0';
1727da934edSreyk 		sep = "";
1737da934edSreyk 	}
174b7af0f14Sguenther 	if (code)
1752eb38aa0Sreyk 		logit(LOG_CRIT, "%s: %s%s%s",
176b7af0f14Sguenther 		    log_procname, s, sep, strerror(code));
1777da934edSreyk 	else
1782eb38aa0Sreyk 		logit(LOG_CRIT, "%s%s%s", log_procname, sep, s);
1797da934edSreyk }
1807da934edSreyk 
1817da934edSreyk void
fatal(const char * emsg,...)1827da934edSreyk fatal(const char *emsg, ...)
1837da934edSreyk {
1847da934edSreyk 	va_list	ap;
1857da934edSreyk 
1867da934edSreyk 	va_start(ap, emsg);
187b7af0f14Sguenther 	vfatalc(errno, emsg, ap);
1887da934edSreyk 	va_end(ap);
1897da934edSreyk 	exit(1);
1907da934edSreyk }
1917da934edSreyk 
1927da934edSreyk void
fatalx(const char * emsg,...)1937da934edSreyk fatalx(const char *emsg, ...)
1947da934edSreyk {
1957da934edSreyk 	va_list	ap;
1967da934edSreyk 
1977da934edSreyk 	va_start(ap, emsg);
198b7af0f14Sguenther 	vfatalc(0, emsg, ap);
1997da934edSreyk 	va_end(ap);
2007da934edSreyk 	exit(1);
2017da934edSreyk }
202