xref: /openbsd-src/usr.sbin/snmpd/log.c (revision a9292d2a63fa67dc6b2075a718b776ad5d932d51)
1*a9292d2aSmartijn /*	$OpenBSD: log.c,v 1.17 2023/12/21 12:43:31 martijn Exp $	*/
246e6c55bSreyk 
346e6c55bSreyk /*
446e6c55bSreyk  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
546e6c55bSreyk  *
646e6c55bSreyk  * Permission to use, copy, modify, and distribute this software for any
746e6c55bSreyk  * purpose with or without fee is hereby granted, provided that the above
846e6c55bSreyk  * copyright notice and this permission notice appear in all copies.
946e6c55bSreyk  *
1046e6c55bSreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1146e6c55bSreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1246e6c55bSreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1346e6c55bSreyk  * 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.
1746e6c55bSreyk  */
1846e6c55bSreyk 
19*a9292d2aSmartijn #include <sys/types.h>
20*a9292d2aSmartijn 
2146e6c55bSreyk #include <stdio.h>
2246e6c55bSreyk #include <stdlib.h>
232685bdaeSreyk #include <stdarg.h>
2446e6c55bSreyk #include <string.h>
2546e6c55bSreyk #include <syslog.h>
262685bdaeSreyk #include <errno.h>
272685bdaeSreyk #include <time.h>
2846e6c55bSreyk 
29871fc12cSreyk static int	 debug;
30871fc12cSreyk static int	 verbose;
310f12961aSreyk const char	*log_procname;
3246e6c55bSreyk 
330f12961aSreyk void	log_init(int, int);
340f12961aSreyk void	log_procinit(const char *);
35871fc12cSreyk void	log_setverbose(int);
36871fc12cSreyk int	log_getverbose(void);
372685bdaeSreyk void	log_warn(const char *, ...)
382685bdaeSreyk 	    __attribute__((__format__ (printf, 1, 2)));
392685bdaeSreyk void	log_warnx(const char *, ...)
402685bdaeSreyk 	    __attribute__((__format__ (printf, 1, 2)));
412685bdaeSreyk void	log_info(const char *, ...)
422685bdaeSreyk 	    __attribute__((__format__ (printf, 1, 2)));
432685bdaeSreyk void	log_debug(const char *, ...)
442685bdaeSreyk 	    __attribute__((__format__ (printf, 1, 2)));
452685bdaeSreyk void	logit(int, const char *, ...)
462685bdaeSreyk 	    __attribute__((__format__ (printf, 2, 3)));
472685bdaeSreyk void	vlog(int, const char *, va_list)
482685bdaeSreyk 	    __attribute__((__format__ (printf, 2, 0)));
490f12961aSreyk __dead void fatal(const char *, ...)
500f12961aSreyk 	    __attribute__((__format__ (printf, 1, 2)));
510f12961aSreyk __dead void fatalx(const char *, ...)
520f12961aSreyk 	    __attribute__((__format__ (printf, 1, 2)));
5346e6c55bSreyk 
5446e6c55bSreyk void
log_init(int n_debug,int facility)550f12961aSreyk log_init(int n_debug, int facility)
5646e6c55bSreyk {
5746e6c55bSreyk 	extern char	*__progname;
5846e6c55bSreyk 
5946e6c55bSreyk 	debug = n_debug;
60f05d8813Stedu 	verbose = n_debug;
610f12961aSreyk 	log_procinit(__progname);
6246e6c55bSreyk 
6346e6c55bSreyk 	if (!debug)
640f12961aSreyk 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
6546e6c55bSreyk 
6646e6c55bSreyk 	tzset();
6746e6c55bSreyk }
6846e6c55bSreyk 
6946e6c55bSreyk void
log_procinit(const char * procname)700f12961aSreyk log_procinit(const char *procname)
710f12961aSreyk {
720f12961aSreyk 	if (procname != NULL)
730f12961aSreyk 		log_procname = procname;
740f12961aSreyk }
750f12961aSreyk 
760f12961aSreyk void
log_setverbose(int v)77871fc12cSreyk log_setverbose(int v)
7860996bedSreyk {
7960996bedSreyk 	verbose = v;
8060996bedSreyk }
8160996bedSreyk 
82871fc12cSreyk int
log_getverbose(void)83871fc12cSreyk log_getverbose(void)
84871fc12cSreyk {
85871fc12cSreyk 	return (verbose);
86871fc12cSreyk }
87871fc12cSreyk 
8860996bedSreyk void
logit(int pri,const char * fmt,...)8946e6c55bSreyk logit(int pri, const char *fmt, ...)
9046e6c55bSreyk {
9146e6c55bSreyk 	va_list	ap;
9246e6c55bSreyk 
9346e6c55bSreyk 	va_start(ap, fmt);
9446e6c55bSreyk 	vlog(pri, fmt, ap);
9546e6c55bSreyk 	va_end(ap);
9646e6c55bSreyk }
9746e6c55bSreyk 
9846e6c55bSreyk void
vlog(int pri,const char * fmt,va_list ap)9946e6c55bSreyk vlog(int pri, const char *fmt, va_list ap)
10046e6c55bSreyk {
10146e6c55bSreyk 	char	*nfmt;
1029f5ef5a9Sreyk 	int	 saved_errno = errno;
10346e6c55bSreyk 
10446e6c55bSreyk 	if (debug) {
10546e6c55bSreyk 		/* best effort in out of mem situations */
10646e6c55bSreyk 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
10746e6c55bSreyk 			vfprintf(stderr, fmt, ap);
10846e6c55bSreyk 			fprintf(stderr, "\n");
10946e6c55bSreyk 		} else {
11046e6c55bSreyk 			vfprintf(stderr, nfmt, ap);
11146e6c55bSreyk 			free(nfmt);
11246e6c55bSreyk 		}
11346e6c55bSreyk 		fflush(stderr);
11446e6c55bSreyk 	} else
11546e6c55bSreyk 		vsyslog(pri, fmt, ap);
11646e6c55bSreyk 
1179f5ef5a9Sreyk 	errno = saved_errno;
1189f5ef5a9Sreyk }
11946e6c55bSreyk 
12046e6c55bSreyk void
log_warn(const char * emsg,...)12146e6c55bSreyk log_warn(const char *emsg, ...)
12246e6c55bSreyk {
12346e6c55bSreyk 	char		*nfmt;
12446e6c55bSreyk 	va_list		 ap;
125a6bfe157Sreyk 	int		 saved_errno = errno;
12646e6c55bSreyk 
12746e6c55bSreyk 	/* best effort to even work in out of memory situations */
12846e6c55bSreyk 	if (emsg == NULL)
1299b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
13046e6c55bSreyk 	else {
13146e6c55bSreyk 		va_start(ap, emsg);
13246e6c55bSreyk 
133a6bfe157Sreyk 		if (asprintf(&nfmt, "%s: %s", emsg,
134a6bfe157Sreyk 		    strerror(saved_errno)) == -1) {
13546e6c55bSreyk 			/* we tried it... */
1369b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
1379b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(saved_errno));
13846e6c55bSreyk 		} else {
1399b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
14046e6c55bSreyk 			free(nfmt);
14146e6c55bSreyk 		}
14246e6c55bSreyk 		va_end(ap);
14346e6c55bSreyk 	}
1449f5ef5a9Sreyk 
1459f5ef5a9Sreyk 	errno = saved_errno;
14646e6c55bSreyk }
14746e6c55bSreyk 
14846e6c55bSreyk void
log_warnx(const char * emsg,...)14946e6c55bSreyk log_warnx(const char *emsg, ...)
15046e6c55bSreyk {
15146e6c55bSreyk 	va_list	 ap;
15246e6c55bSreyk 
15346e6c55bSreyk 	va_start(ap, emsg);
1549b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
15546e6c55bSreyk 	va_end(ap);
15646e6c55bSreyk }
15746e6c55bSreyk 
15846e6c55bSreyk void
log_info(const char * emsg,...)15946e6c55bSreyk log_info(const char *emsg, ...)
16046e6c55bSreyk {
16146e6c55bSreyk 	va_list	 ap;
16246e6c55bSreyk 
16346e6c55bSreyk 	va_start(ap, emsg);
16446e6c55bSreyk 	vlog(LOG_INFO, emsg, ap);
16546e6c55bSreyk 	va_end(ap);
16646e6c55bSreyk }
16746e6c55bSreyk 
16846e6c55bSreyk void
log_debug(const char * emsg,...)16946e6c55bSreyk log_debug(const char *emsg, ...)
17046e6c55bSreyk {
17146e6c55bSreyk 	va_list	 ap;
17246e6c55bSreyk 
17360996bedSreyk 	if (verbose > 1) {
17446e6c55bSreyk 		va_start(ap, emsg);
17546e6c55bSreyk 		vlog(LOG_DEBUG, emsg, ap);
17646e6c55bSreyk 		va_end(ap);
17746e6c55bSreyk 	}
17846e6c55bSreyk }
17946e6c55bSreyk 
1800f12961aSreyk static void
vfatalc(int code,const char * emsg,va_list ap)1819f5ef5a9Sreyk vfatalc(int code, const char *emsg, va_list ap)
18246e6c55bSreyk {
1830f12961aSreyk 	static char	s[BUFSIZ];
1840f12961aSreyk 	const char	*sep;
18546e6c55bSreyk 
1860f12961aSreyk 	if (emsg != NULL) {
1870f12961aSreyk 		(void)vsnprintf(s, sizeof(s), emsg, ap);
1880f12961aSreyk 		sep = ": ";
1890f12961aSreyk 	} else {
1900f12961aSreyk 		s[0] = '\0';
1910f12961aSreyk 		sep = "";
1920f12961aSreyk 	}
1939f5ef5a9Sreyk 	if (code)
194cd7658e8Sreyk 		logit(LOG_CRIT, "%s: %s%s%s",
1959f5ef5a9Sreyk 		    log_procname, s, sep, strerror(code));
1960f12961aSreyk 	else
197cd7658e8Sreyk 		logit(LOG_CRIT, "%s%s%s", log_procname, sep, s);
1980f12961aSreyk }
1990f12961aSreyk 
2000f12961aSreyk void
fatal(const char * emsg,...)2010f12961aSreyk fatal(const char *emsg, ...)
2020f12961aSreyk {
2030f12961aSreyk 	va_list	ap;
2040f12961aSreyk 
2050f12961aSreyk 	va_start(ap, emsg);
2069f5ef5a9Sreyk 	vfatalc(errno, emsg, ap);
2070f12961aSreyk 	va_end(ap);
20846e6c55bSreyk 	exit(1);
20946e6c55bSreyk }
21046e6c55bSreyk 
21146e6c55bSreyk void
fatalx(const char * emsg,...)2120f12961aSreyk fatalx(const char *emsg, ...)
21346e6c55bSreyk {
2140f12961aSreyk 	va_list	ap;
2150f12961aSreyk 
2160f12961aSreyk 	va_start(ap, emsg);
2179f5ef5a9Sreyk 	vfatalc(0, emsg, ap);
2180f12961aSreyk 	va_end(ap);
2190f12961aSreyk 	exit(1);
22046e6c55bSreyk }
221