xref: /openbsd-src/usr.sbin/dvmrpd/log.c (revision c12a113b35e1205515fafcad825ead07690aabee)
1*c12a113bSclaudio /*	$OpenBSD: log.c,v 1.7 2021/01/19 11:39:13 claudio Exp $ */
2978e5cffSnorby 
3978e5cffSnorby /*
4978e5cffSnorby  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5978e5cffSnorby  *
6978e5cffSnorby  * Permission to use, copy, modify, and distribute this software for any
7978e5cffSnorby  * purpose with or without fee is hereby granted, provided that the above
8978e5cffSnorby  * copyright notice and this permission notice appear in all copies.
9978e5cffSnorby  *
10978e5cffSnorby  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11978e5cffSnorby  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12978e5cffSnorby  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13978e5cffSnorby  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14978e5cffSnorby  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15978e5cffSnorby  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16978e5cffSnorby  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17978e5cffSnorby  */
18978e5cffSnorby 
19978e5cffSnorby #include <errno.h>
20978e5cffSnorby #include <stdarg.h>
21978e5cffSnorby #include <stdio.h>
22978e5cffSnorby #include <stdlib.h>
23978e5cffSnorby #include <string.h>
24978e5cffSnorby #include <syslog.h>
252e743b2fSbenno #include <time.h>
26978e5cffSnorby #include <unistd.h>
27978e5cffSnorby 
282e743b2fSbenno #include "log.h"
29978e5cffSnorby #include "igmp.h"
30978e5cffSnorby #include "dvmrpd.h"
31978e5cffSnorby 
32978e5cffSnorby int		 debug;
3320d80477Sclaudio int		 verbose;
342e743b2fSbenno const char	*log_procname;
35978e5cffSnorby 
36978e5cffSnorby void
log_init(int n_debug)37978e5cffSnorby log_init(int n_debug)
38978e5cffSnorby {
39978e5cffSnorby 	extern char	*__progname;
40978e5cffSnorby 
41978e5cffSnorby 	debug = n_debug;
42978e5cffSnorby 
43978e5cffSnorby 	if (!debug)
44978e5cffSnorby 		openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
45978e5cffSnorby 
46978e5cffSnorby 	tzset();
47978e5cffSnorby }
48978e5cffSnorby 
49978e5cffSnorby void
log_verbose(int v)5020d80477Sclaudio log_verbose(int v)
5120d80477Sclaudio {
5220d80477Sclaudio 	verbose = v;
5320d80477Sclaudio }
5420d80477Sclaudio 
5520d80477Sclaudio void
logit(int pri,const char * fmt,...)56978e5cffSnorby logit(int pri, const char *fmt, ...)
57978e5cffSnorby {
58978e5cffSnorby 	va_list	ap;
59978e5cffSnorby 
60978e5cffSnorby 	va_start(ap, fmt);
61978e5cffSnorby 	vlog(pri, fmt, ap);
62978e5cffSnorby 	va_end(ap);
63978e5cffSnorby }
64978e5cffSnorby 
65978e5cffSnorby void
vlog(int pri,const char * fmt,va_list ap)66978e5cffSnorby vlog(int pri, const char *fmt, va_list ap)
67978e5cffSnorby {
68978e5cffSnorby 	char	*nfmt;
69978e5cffSnorby 
70978e5cffSnorby 	if (debug) {
71978e5cffSnorby 		/* best effort in out of mem situations */
72978e5cffSnorby 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
73978e5cffSnorby 			vfprintf(stderr, fmt, ap);
74978e5cffSnorby 			fprintf(stderr, "\n");
75978e5cffSnorby 		} else {
76978e5cffSnorby 			vfprintf(stderr, nfmt, ap);
77978e5cffSnorby 			free(nfmt);
78978e5cffSnorby 		}
79978e5cffSnorby 		fflush(stderr);
80978e5cffSnorby 	} else
81978e5cffSnorby 		vsyslog(pri, fmt, ap);
82978e5cffSnorby }
83978e5cffSnorby 
84978e5cffSnorby void
log_warn(const char * emsg,...)85978e5cffSnorby log_warn(const char *emsg, ...)
86978e5cffSnorby {
87978e5cffSnorby 	char	*nfmt;
88978e5cffSnorby 	va_list	 ap;
89978e5cffSnorby 
90978e5cffSnorby 	/* best effort to even work in out of memory situations */
91978e5cffSnorby 	if (emsg == NULL)
929b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(errno));
93978e5cffSnorby 	else {
94978e5cffSnorby 		va_start(ap, emsg);
95978e5cffSnorby 
96978e5cffSnorby 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
97978e5cffSnorby 			/* we tried it... */
989b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
999b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(errno));
100978e5cffSnorby 		} else {
1019b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
102978e5cffSnorby 			free(nfmt);
103978e5cffSnorby 		}
104978e5cffSnorby 		va_end(ap);
105978e5cffSnorby 	}
106978e5cffSnorby }
107978e5cffSnorby 
108978e5cffSnorby void
log_warnx(const char * emsg,...)109978e5cffSnorby log_warnx(const char *emsg, ...)
110978e5cffSnorby {
111978e5cffSnorby 	va_list	 ap;
112978e5cffSnorby 
113978e5cffSnorby 	va_start(ap, emsg);
1149b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
115978e5cffSnorby 	va_end(ap);
116978e5cffSnorby }
117978e5cffSnorby 
118978e5cffSnorby void
log_info(const char * emsg,...)119978e5cffSnorby log_info(const char *emsg, ...)
120978e5cffSnorby {
121978e5cffSnorby 	va_list	 ap;
122978e5cffSnorby 
123978e5cffSnorby 	va_start(ap, emsg);
124978e5cffSnorby 	vlog(LOG_INFO, emsg, ap);
125978e5cffSnorby 	va_end(ap);
126978e5cffSnorby }
127978e5cffSnorby 
128978e5cffSnorby void
log_debug(const char * emsg,...)129978e5cffSnorby log_debug(const char *emsg, ...)
130978e5cffSnorby {
131978e5cffSnorby 	va_list	 ap;
132978e5cffSnorby 
13320d80477Sclaudio 	if (verbose) {
134978e5cffSnorby 		va_start(ap, emsg);
135978e5cffSnorby 		vlog(LOG_DEBUG, emsg, ap);
136978e5cffSnorby 		va_end(ap);
137978e5cffSnorby 	}
138978e5cffSnorby }
139978e5cffSnorby 
140978e5cffSnorby void
fatal(const char * emsg)141978e5cffSnorby fatal(const char *emsg)
142978e5cffSnorby {
143978e5cffSnorby 	if (emsg == NULL)
1442e743b2fSbenno 		logit(LOG_CRIT, "fatal in %s: %s", log_procname,
145978e5cffSnorby 		    strerror(errno));
146978e5cffSnorby 	else
147978e5cffSnorby 		if (errno)
148978e5cffSnorby 			logit(LOG_CRIT, "fatal in %s: %s: %s",
1492e743b2fSbenno 			    log_procname, emsg, strerror(errno));
150978e5cffSnorby 		else
151978e5cffSnorby 			logit(LOG_CRIT, "fatal in %s: %s",
1522e743b2fSbenno 			    log_procname, emsg);
153978e5cffSnorby 
154978e5cffSnorby 	exit(1);
155978e5cffSnorby }
156978e5cffSnorby 
157978e5cffSnorby void
fatalx(const char * emsg)158978e5cffSnorby fatalx(const char *emsg)
159978e5cffSnorby {
160978e5cffSnorby 	errno = 0;
161978e5cffSnorby 	fatal(emsg);
162978e5cffSnorby }
163