xref: /openbsd-src/usr.sbin/dhcrelay6/log.c (revision 89044269eb539d9f535931ac9adfeba8143de79d)
1*89044269Sbluhm /*	$OpenBSD: log.c,v 1.2 2017/03/21 12:38:23 bluhm Exp $	*/
29cbab583Srzalamena 
39cbab583Srzalamena /*
49cbab583Srzalamena  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
59cbab583Srzalamena  *
69cbab583Srzalamena  * Permission to use, copy, modify, and distribute this software for any
79cbab583Srzalamena  * purpose with or without fee is hereby granted, provided that the above
89cbab583Srzalamena  * copyright notice and this permission notice appear in all copies.
99cbab583Srzalamena  *
109cbab583Srzalamena  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
119cbab583Srzalamena  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
129cbab583Srzalamena  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
139cbab583Srzalamena  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
149cbab583Srzalamena  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
159cbab583Srzalamena  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
169cbab583Srzalamena  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
179cbab583Srzalamena  */
189cbab583Srzalamena 
199cbab583Srzalamena #include <stdio.h>
209cbab583Srzalamena #include <stdlib.h>
219cbab583Srzalamena #include <stdarg.h>
229cbab583Srzalamena #include <string.h>
239cbab583Srzalamena #include <syslog.h>
249cbab583Srzalamena #include <errno.h>
259cbab583Srzalamena #include <time.h>
269cbab583Srzalamena 
279cbab583Srzalamena #include "log.h"
289cbab583Srzalamena 
299cbab583Srzalamena static int		 debug;
309cbab583Srzalamena static int		 verbose;
319cbab583Srzalamena static const char	*log_procname;
329cbab583Srzalamena 
339cbab583Srzalamena void
log_init(int n_debug,int facility)349cbab583Srzalamena log_init(int n_debug, int facility)
359cbab583Srzalamena {
369cbab583Srzalamena 	extern char	*__progname;
379cbab583Srzalamena 
389cbab583Srzalamena 	debug = n_debug;
399cbab583Srzalamena 	verbose = n_debug;
409cbab583Srzalamena 	log_procinit(__progname);
419cbab583Srzalamena 
429cbab583Srzalamena 	if (!debug)
439cbab583Srzalamena 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
449cbab583Srzalamena 
459cbab583Srzalamena 	tzset();
469cbab583Srzalamena }
479cbab583Srzalamena 
489cbab583Srzalamena void
log_procinit(const char * procname)499cbab583Srzalamena log_procinit(const char *procname)
509cbab583Srzalamena {
519cbab583Srzalamena 	if (procname != NULL)
529cbab583Srzalamena 		log_procname = procname;
539cbab583Srzalamena }
549cbab583Srzalamena 
559cbab583Srzalamena void
log_setverbose(int v)569cbab583Srzalamena log_setverbose(int v)
579cbab583Srzalamena {
589cbab583Srzalamena 	verbose = v;
599cbab583Srzalamena }
609cbab583Srzalamena 
619cbab583Srzalamena int
log_getverbose(void)629cbab583Srzalamena log_getverbose(void)
639cbab583Srzalamena {
649cbab583Srzalamena 	return (verbose);
659cbab583Srzalamena }
669cbab583Srzalamena 
679cbab583Srzalamena void
logit(int pri,const char * fmt,...)689cbab583Srzalamena logit(int pri, const char *fmt, ...)
699cbab583Srzalamena {
709cbab583Srzalamena 	va_list	ap;
719cbab583Srzalamena 
729cbab583Srzalamena 	va_start(ap, fmt);
739cbab583Srzalamena 	vlog(pri, fmt, ap);
749cbab583Srzalamena 	va_end(ap);
759cbab583Srzalamena }
769cbab583Srzalamena 
779cbab583Srzalamena void
vlog(int pri,const char * fmt,va_list ap)789cbab583Srzalamena vlog(int pri, const char *fmt, va_list ap)
799cbab583Srzalamena {
809cbab583Srzalamena 	char	*nfmt;
819cbab583Srzalamena 	int	 saved_errno = errno;
829cbab583Srzalamena 
839cbab583Srzalamena 	if (debug) {
849cbab583Srzalamena 		/* best effort in out of mem situations */
859cbab583Srzalamena 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
869cbab583Srzalamena 			vfprintf(stderr, fmt, ap);
879cbab583Srzalamena 			fprintf(stderr, "\n");
889cbab583Srzalamena 		} else {
899cbab583Srzalamena 			vfprintf(stderr, nfmt, ap);
909cbab583Srzalamena 			free(nfmt);
919cbab583Srzalamena 		}
929cbab583Srzalamena 		fflush(stderr);
939cbab583Srzalamena 	} else
949cbab583Srzalamena 		vsyslog(pri, fmt, ap);
959cbab583Srzalamena 
969cbab583Srzalamena 	errno = saved_errno;
979cbab583Srzalamena }
989cbab583Srzalamena 
999cbab583Srzalamena void
log_warn(const char * emsg,...)1009cbab583Srzalamena log_warn(const char *emsg, ...)
1019cbab583Srzalamena {
1029cbab583Srzalamena 	char		*nfmt;
1039cbab583Srzalamena 	va_list		 ap;
1049cbab583Srzalamena 	int		 saved_errno = errno;
1059cbab583Srzalamena 
1069cbab583Srzalamena 	/* best effort to even work in out of memory situations */
1079cbab583Srzalamena 	if (emsg == NULL)
108*89044269Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
1099cbab583Srzalamena 	else {
1109cbab583Srzalamena 		va_start(ap, emsg);
1119cbab583Srzalamena 
1129cbab583Srzalamena 		if (asprintf(&nfmt, "%s: %s", emsg,
1139cbab583Srzalamena 		    strerror(saved_errno)) == -1) {
1149cbab583Srzalamena 			/* we tried it... */
115*89044269Sbluhm 			vlog(LOG_ERR, emsg, ap);
116*89044269Sbluhm 			logit(LOG_ERR, "%s", strerror(saved_errno));
1179cbab583Srzalamena 		} else {
118*89044269Sbluhm 			vlog(LOG_ERR, nfmt, ap);
1199cbab583Srzalamena 			free(nfmt);
1209cbab583Srzalamena 		}
1219cbab583Srzalamena 		va_end(ap);
1229cbab583Srzalamena 	}
1239cbab583Srzalamena 
1249cbab583Srzalamena 	errno = saved_errno;
1259cbab583Srzalamena }
1269cbab583Srzalamena 
1279cbab583Srzalamena void
log_warnx(const char * emsg,...)1289cbab583Srzalamena log_warnx(const char *emsg, ...)
1299cbab583Srzalamena {
1309cbab583Srzalamena 	va_list	 ap;
1319cbab583Srzalamena 
1329cbab583Srzalamena 	va_start(ap, emsg);
133*89044269Sbluhm 	vlog(LOG_ERR, emsg, ap);
1349cbab583Srzalamena 	va_end(ap);
1359cbab583Srzalamena }
1369cbab583Srzalamena 
1379cbab583Srzalamena void
log_info(const char * emsg,...)1389cbab583Srzalamena log_info(const char *emsg, ...)
1399cbab583Srzalamena {
1409cbab583Srzalamena 	va_list	 ap;
1419cbab583Srzalamena 
1429cbab583Srzalamena 	va_start(ap, emsg);
1439cbab583Srzalamena 	vlog(LOG_INFO, emsg, ap);
1449cbab583Srzalamena 	va_end(ap);
1459cbab583Srzalamena }
1469cbab583Srzalamena 
1479cbab583Srzalamena void
log_debug(const char * emsg,...)1489cbab583Srzalamena log_debug(const char *emsg, ...)
1499cbab583Srzalamena {
1509cbab583Srzalamena 	va_list	 ap;
1519cbab583Srzalamena 
1529cbab583Srzalamena 	if (verbose) {
1539cbab583Srzalamena 		va_start(ap, emsg);
1549cbab583Srzalamena 		vlog(LOG_DEBUG, emsg, ap);
1559cbab583Srzalamena 		va_end(ap);
1569cbab583Srzalamena 	}
1579cbab583Srzalamena }
1589cbab583Srzalamena 
1599cbab583Srzalamena static void
vfatalc(int code,const char * emsg,va_list ap)1609cbab583Srzalamena vfatalc(int code, const char *emsg, va_list ap)
1619cbab583Srzalamena {
1629cbab583Srzalamena 	static char	s[BUFSIZ];
1639cbab583Srzalamena 	const char	*sep;
1649cbab583Srzalamena 
1659cbab583Srzalamena 	if (emsg != NULL) {
1669cbab583Srzalamena 		(void)vsnprintf(s, sizeof(s), emsg, ap);
1679cbab583Srzalamena 		sep = ": ";
1689cbab583Srzalamena 	} else {
1699cbab583Srzalamena 		s[0] = '\0';
1709cbab583Srzalamena 		sep = "";
1719cbab583Srzalamena 	}
1729cbab583Srzalamena 	if (code)
1739cbab583Srzalamena 		logit(LOG_CRIT, "fatal in %s: %s%s%s",
1749cbab583Srzalamena 		    log_procname, s, sep, strerror(code));
1759cbab583Srzalamena 	else
1769cbab583Srzalamena 		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
1779cbab583Srzalamena }
1789cbab583Srzalamena 
1799cbab583Srzalamena void
fatal(const char * emsg,...)1809cbab583Srzalamena fatal(const char *emsg, ...)
1819cbab583Srzalamena {
1829cbab583Srzalamena 	va_list	ap;
1839cbab583Srzalamena 
1849cbab583Srzalamena 	va_start(ap, emsg);
1859cbab583Srzalamena 	vfatalc(errno, emsg, ap);
1869cbab583Srzalamena 	va_end(ap);
1879cbab583Srzalamena 	exit(1);
1889cbab583Srzalamena }
1899cbab583Srzalamena 
1909cbab583Srzalamena void
fatalx(const char * emsg,...)1919cbab583Srzalamena fatalx(const char *emsg, ...)
1929cbab583Srzalamena {
1939cbab583Srzalamena 	va_list	ap;
1949cbab583Srzalamena 
1959cbab583Srzalamena 	va_start(ap, emsg);
1969cbab583Srzalamena 	vfatalc(0, emsg, ap);
1979cbab583Srzalamena 	va_end(ap);
1989cbab583Srzalamena 	exit(1);
1999cbab583Srzalamena }
200