xref: /openbsd-src/usr.sbin/eigrpd/log.c (revision 6bae335dd015f9e023db26fea05e06c52cf1d0d7)
1*6bae335dSjsg /*	$OpenBSD: log.c,v 1.10 2023/04/19 12:58:16 jsg Exp $ */
243509a12Srenato 
343509a12Srenato /*
443509a12Srenato  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
543509a12Srenato  *
643509a12Srenato  * Permission to use, copy, modify, and distribute this software for any
743509a12Srenato  * purpose with or without fee is hereby granted, provided that the above
843509a12Srenato  * copyright notice and this permission notice appear in all copies.
943509a12Srenato  *
1043509a12Srenato  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1143509a12Srenato  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1243509a12Srenato  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1343509a12Srenato  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1443509a12Srenato  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1543509a12Srenato  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1643509a12Srenato  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1743509a12Srenato  */
1843509a12Srenato 
198072de9bSrenato #include <sys/types.h>
208072de9bSrenato 
218072de9bSrenato #include <arpa/inet.h>
2243509a12Srenato #include <errno.h>
238072de9bSrenato #include <netdb.h>
2443509a12Srenato #include <stdarg.h>
2543509a12Srenato #include <stdio.h>
2643509a12Srenato #include <stdlib.h>
2743509a12Srenato #include <string.h>
2843509a12Srenato #include <syslog.h>
29fcdf914bSbenno #include <time.h>
3043509a12Srenato #include <unistd.h>
3143509a12Srenato 
3243509a12Srenato #include "eigrpd.h"
3343509a12Srenato #include "log.h"
3443509a12Srenato 
3543509a12Srenato int		 debug;
3643509a12Srenato int		 verbose;
37fcdf914bSbenno const char	*log_procname;
3843509a12Srenato 
3943509a12Srenato void
log_init(int n_debug)4043509a12Srenato log_init(int n_debug)
4143509a12Srenato {
4243509a12Srenato 	extern char	*__progname;
4343509a12Srenato 
4443509a12Srenato 	debug = n_debug;
4543509a12Srenato 
4643509a12Srenato 	if (!debug)
4743509a12Srenato 		openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
4843509a12Srenato 
4943509a12Srenato 	tzset();
5043509a12Srenato }
5143509a12Srenato 
5243509a12Srenato void
log_verbose(int v)5343509a12Srenato log_verbose(int v)
5443509a12Srenato {
5543509a12Srenato 	verbose = v;
5643509a12Srenato }
5743509a12Srenato 
5843509a12Srenato void
logit(int pri,const char * fmt,...)5943509a12Srenato logit(int pri, const char *fmt, ...)
6043509a12Srenato {
6143509a12Srenato 	va_list	ap;
6243509a12Srenato 
6343509a12Srenato 	va_start(ap, fmt);
6443509a12Srenato 	vlog(pri, fmt, ap);
6543509a12Srenato 	va_end(ap);
6643509a12Srenato }
6743509a12Srenato 
6843509a12Srenato void
vlog(int pri,const char * fmt,va_list ap)6943509a12Srenato vlog(int pri, const char *fmt, va_list ap)
7043509a12Srenato {
7143509a12Srenato 	char	*nfmt;
7243509a12Srenato 
7343509a12Srenato 	if (debug) {
7443509a12Srenato 		/* best effort in out of mem situations */
7543509a12Srenato 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
7643509a12Srenato 			vfprintf(stderr, fmt, ap);
7743509a12Srenato 			fprintf(stderr, "\n");
7843509a12Srenato 		} else {
7943509a12Srenato 			vfprintf(stderr, nfmt, ap);
8043509a12Srenato 			free(nfmt);
8143509a12Srenato 		}
8243509a12Srenato 		fflush(stderr);
8343509a12Srenato 	} else
8443509a12Srenato 		vsyslog(pri, fmt, ap);
8543509a12Srenato }
8643509a12Srenato 
8743509a12Srenato void
log_warn(const char * emsg,...)8843509a12Srenato log_warn(const char *emsg, ...)
8943509a12Srenato {
9043509a12Srenato 	char	*nfmt;
9143509a12Srenato 	va_list	 ap;
9243509a12Srenato 
9343509a12Srenato 	/* best effort to even work in out of memory situations */
9443509a12Srenato 	if (emsg == NULL)
959b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(errno));
9643509a12Srenato 	else {
9743509a12Srenato 		va_start(ap, emsg);
9843509a12Srenato 
9943509a12Srenato 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
10043509a12Srenato 			/* we tried it... */
1019b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
1029b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(errno));
10343509a12Srenato 		} else {
1049b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
10543509a12Srenato 			free(nfmt);
10643509a12Srenato 		}
10743509a12Srenato 		va_end(ap);
10843509a12Srenato 	}
10943509a12Srenato }
11043509a12Srenato 
11143509a12Srenato void
log_warnx(const char * emsg,...)11243509a12Srenato log_warnx(const char *emsg, ...)
11343509a12Srenato {
11443509a12Srenato 	va_list	 ap;
11543509a12Srenato 
11643509a12Srenato 	va_start(ap, emsg);
1179b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
11843509a12Srenato 	va_end(ap);
11943509a12Srenato }
12043509a12Srenato 
12143509a12Srenato void
log_info(const char * emsg,...)12243509a12Srenato log_info(const char *emsg, ...)
12343509a12Srenato {
12443509a12Srenato 	va_list	 ap;
12543509a12Srenato 
12643509a12Srenato 	va_start(ap, emsg);
12743509a12Srenato 	vlog(LOG_INFO, emsg, ap);
12843509a12Srenato 	va_end(ap);
12943509a12Srenato }
13043509a12Srenato 
13143509a12Srenato void
log_debug(const char * emsg,...)13243509a12Srenato log_debug(const char *emsg, ...)
13343509a12Srenato {
13443509a12Srenato 	va_list	 ap;
13543509a12Srenato 
13643509a12Srenato 	if (verbose) {
13743509a12Srenato 		va_start(ap, emsg);
13843509a12Srenato 		vlog(LOG_DEBUG, emsg, ap);
13943509a12Srenato 		va_end(ap);
14043509a12Srenato 	}
14143509a12Srenato }
14243509a12Srenato 
14343509a12Srenato void
fatal(const char * emsg)14443509a12Srenato fatal(const char *emsg)
14543509a12Srenato {
14643509a12Srenato 	if (emsg == NULL)
1474aa216a1Sclaudio 		logit(LOG_CRIT, "fatal in %s: %s", log_procname,
14843509a12Srenato 		    strerror(errno));
14943509a12Srenato 	else
15043509a12Srenato 		if (errno)
15143509a12Srenato 			logit(LOG_CRIT, "fatal in %s: %s: %s",
1524aa216a1Sclaudio 			    log_procname, emsg, strerror(errno));
15343509a12Srenato 		else
15443509a12Srenato 			logit(LOG_CRIT, "fatal in %s: %s",
1554aa216a1Sclaudio 			    log_procname, emsg);
15643509a12Srenato 
15743509a12Srenato 	exit(1);
15843509a12Srenato }
15943509a12Srenato 
16043509a12Srenato void
fatalx(const char * emsg)16143509a12Srenato fatalx(const char *emsg)
16243509a12Srenato {
16343509a12Srenato 	errno = 0;
16443509a12Srenato 	fatal(emsg);
16543509a12Srenato }
166