xref: /openbsd-src/usr.sbin/dhcrelay/log.c (revision 9b2c1562932ce8ef5a9c88720f87a65f2e0ed290)
1*9b2c1562Sbluhm /*	$OpenBSD: log.c,v 1.2 2017/03/21 12:06:55 bluhm Exp $	*/
2986dbb4cSkrw 
3986dbb4cSkrw /*
4986dbb4cSkrw  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5986dbb4cSkrw  *
6986dbb4cSkrw  * Permission to use, copy, modify, and distribute this software for any
7986dbb4cSkrw  * purpose with or without fee is hereby granted, provided that the above
8986dbb4cSkrw  * copyright notice and this permission notice appear in all copies.
9986dbb4cSkrw  *
10986dbb4cSkrw  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11986dbb4cSkrw  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12986dbb4cSkrw  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13986dbb4cSkrw  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14986dbb4cSkrw  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15986dbb4cSkrw  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16986dbb4cSkrw  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17986dbb4cSkrw  */
18986dbb4cSkrw 
19986dbb4cSkrw #include <stdio.h>
20986dbb4cSkrw #include <stdlib.h>
21986dbb4cSkrw #include <stdarg.h>
22986dbb4cSkrw #include <string.h>
23986dbb4cSkrw #include <syslog.h>
24986dbb4cSkrw #include <errno.h>
25986dbb4cSkrw #include <time.h>
26986dbb4cSkrw 
27986dbb4cSkrw #include "log.h"
28986dbb4cSkrw 
29986dbb4cSkrw static int		 debug;
30986dbb4cSkrw static int		 verbose;
31986dbb4cSkrw static const char	*log_procname;
32986dbb4cSkrw 
33986dbb4cSkrw void
log_init(int n_debug,int facility)34986dbb4cSkrw log_init(int n_debug, int facility)
35986dbb4cSkrw {
36986dbb4cSkrw 	extern char	*__progname;
37986dbb4cSkrw 
38986dbb4cSkrw 	debug = n_debug;
39986dbb4cSkrw 	verbose = n_debug;
40986dbb4cSkrw 	log_procinit(__progname);
41986dbb4cSkrw 
42986dbb4cSkrw 	if (!debug)
43986dbb4cSkrw 		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
44986dbb4cSkrw 
45986dbb4cSkrw 	tzset();
46986dbb4cSkrw }
47986dbb4cSkrw 
48986dbb4cSkrw void
log_procinit(const char * procname)49986dbb4cSkrw log_procinit(const char *procname)
50986dbb4cSkrw {
51986dbb4cSkrw 	if (procname != NULL)
52986dbb4cSkrw 		log_procname = procname;
53986dbb4cSkrw }
54986dbb4cSkrw 
55986dbb4cSkrw void
log_setverbose(int v)56986dbb4cSkrw log_setverbose(int v)
57986dbb4cSkrw {
58986dbb4cSkrw 	verbose = v;
59986dbb4cSkrw }
60986dbb4cSkrw 
61986dbb4cSkrw int
log_getverbose(void)62986dbb4cSkrw log_getverbose(void)
63986dbb4cSkrw {
64986dbb4cSkrw 	return (verbose);
65986dbb4cSkrw }
66986dbb4cSkrw 
67986dbb4cSkrw void
logit(int pri,const char * fmt,...)68986dbb4cSkrw logit(int pri, const char *fmt, ...)
69986dbb4cSkrw {
70986dbb4cSkrw 	va_list	ap;
71986dbb4cSkrw 
72986dbb4cSkrw 	va_start(ap, fmt);
73986dbb4cSkrw 	vlog(pri, fmt, ap);
74986dbb4cSkrw 	va_end(ap);
75986dbb4cSkrw }
76986dbb4cSkrw 
77986dbb4cSkrw void
vlog(int pri,const char * fmt,va_list ap)78986dbb4cSkrw vlog(int pri, const char *fmt, va_list ap)
79986dbb4cSkrw {
80986dbb4cSkrw 	char	*nfmt;
81986dbb4cSkrw 	int	 saved_errno = errno;
82986dbb4cSkrw 
83986dbb4cSkrw 	if (debug) {
84986dbb4cSkrw 		/* best effort in out of mem situations */
85986dbb4cSkrw 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
86986dbb4cSkrw 			vfprintf(stderr, fmt, ap);
87986dbb4cSkrw 			fprintf(stderr, "\n");
88986dbb4cSkrw 		} else {
89986dbb4cSkrw 			vfprintf(stderr, nfmt, ap);
90986dbb4cSkrw 			free(nfmt);
91986dbb4cSkrw 		}
92986dbb4cSkrw 		fflush(stderr);
93986dbb4cSkrw 	} else
94986dbb4cSkrw 		vsyslog(pri, fmt, ap);
95986dbb4cSkrw 
96986dbb4cSkrw 	errno = saved_errno;
97986dbb4cSkrw }
98986dbb4cSkrw 
99986dbb4cSkrw void
log_warn(const char * emsg,...)100986dbb4cSkrw log_warn(const char *emsg, ...)
101986dbb4cSkrw {
102986dbb4cSkrw 	char		*nfmt;
103986dbb4cSkrw 	va_list		 ap;
104986dbb4cSkrw 	int		 saved_errno = errno;
105986dbb4cSkrw 
106986dbb4cSkrw 	/* best effort to even work in out of memory situations */
107986dbb4cSkrw 	if (emsg == NULL)
108*9b2c1562Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
109986dbb4cSkrw 	else {
110986dbb4cSkrw 		va_start(ap, emsg);
111986dbb4cSkrw 
112986dbb4cSkrw 		if (asprintf(&nfmt, "%s: %s", emsg,
113986dbb4cSkrw 		    strerror(saved_errno)) == -1) {
114986dbb4cSkrw 			/* we tried it... */
115*9b2c1562Sbluhm 			vlog(LOG_ERR, emsg, ap);
116*9b2c1562Sbluhm 			logit(LOG_ERR, "%s", strerror(saved_errno));
117986dbb4cSkrw 		} else {
118*9b2c1562Sbluhm 			vlog(LOG_ERR, nfmt, ap);
119986dbb4cSkrw 			free(nfmt);
120986dbb4cSkrw 		}
121986dbb4cSkrw 		va_end(ap);
122986dbb4cSkrw 	}
123986dbb4cSkrw 
124986dbb4cSkrw 	errno = saved_errno;
125986dbb4cSkrw }
126986dbb4cSkrw 
127986dbb4cSkrw void
log_warnx(const char * emsg,...)128986dbb4cSkrw log_warnx(const char *emsg, ...)
129986dbb4cSkrw {
130986dbb4cSkrw 	va_list	 ap;
131986dbb4cSkrw 
132986dbb4cSkrw 	va_start(ap, emsg);
133*9b2c1562Sbluhm 	vlog(LOG_ERR, emsg, ap);
134986dbb4cSkrw 	va_end(ap);
135986dbb4cSkrw }
136986dbb4cSkrw 
137986dbb4cSkrw void
log_info(const char * emsg,...)138986dbb4cSkrw log_info(const char *emsg, ...)
139986dbb4cSkrw {
140986dbb4cSkrw 	va_list	 ap;
141986dbb4cSkrw 
142986dbb4cSkrw 	va_start(ap, emsg);
143986dbb4cSkrw 	vlog(LOG_INFO, emsg, ap);
144986dbb4cSkrw 	va_end(ap);
145986dbb4cSkrw }
146986dbb4cSkrw 
147986dbb4cSkrw void
log_debug(const char * emsg,...)148986dbb4cSkrw log_debug(const char *emsg, ...)
149986dbb4cSkrw {
150986dbb4cSkrw 	va_list	 ap;
151986dbb4cSkrw 
152986dbb4cSkrw 	if (verbose) {
153986dbb4cSkrw 		va_start(ap, emsg);
154986dbb4cSkrw 		vlog(LOG_DEBUG, emsg, ap);
155986dbb4cSkrw 		va_end(ap);
156986dbb4cSkrw 	}
157986dbb4cSkrw }
158986dbb4cSkrw 
159986dbb4cSkrw static void
vfatalc(int code,const char * emsg,va_list ap)160986dbb4cSkrw vfatalc(int code, const char *emsg, va_list ap)
161986dbb4cSkrw {
162986dbb4cSkrw 	static char	s[BUFSIZ];
163986dbb4cSkrw 	const char	*sep;
164986dbb4cSkrw 
165986dbb4cSkrw 	if (emsg != NULL) {
166986dbb4cSkrw 		(void)vsnprintf(s, sizeof(s), emsg, ap);
167986dbb4cSkrw 		sep = ": ";
168986dbb4cSkrw 	} else {
169986dbb4cSkrw 		s[0] = '\0';
170986dbb4cSkrw 		sep = "";
171986dbb4cSkrw 	}
172986dbb4cSkrw 	if (code)
173986dbb4cSkrw 		logit(LOG_CRIT, "fatal in %s: %s%s%s",
174986dbb4cSkrw 		    log_procname, s, sep, strerror(code));
175986dbb4cSkrw 	else
176986dbb4cSkrw 		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
177986dbb4cSkrw }
178986dbb4cSkrw 
179986dbb4cSkrw void
fatal(const char * emsg,...)180986dbb4cSkrw fatal(const char *emsg, ...)
181986dbb4cSkrw {
182986dbb4cSkrw 	va_list	ap;
183986dbb4cSkrw 
184986dbb4cSkrw 	va_start(ap, emsg);
185986dbb4cSkrw 	vfatalc(errno, emsg, ap);
186986dbb4cSkrw 	va_end(ap);
187986dbb4cSkrw 	exit(1);
188986dbb4cSkrw }
189986dbb4cSkrw 
190986dbb4cSkrw void
fatalx(const char * emsg,...)191986dbb4cSkrw fatalx(const char *emsg, ...)
192986dbb4cSkrw {
193986dbb4cSkrw 	va_list	ap;
194986dbb4cSkrw 
195986dbb4cSkrw 	va_start(ap, emsg);
196986dbb4cSkrw 	vfatalc(0, emsg, ap);
197986dbb4cSkrw 	va_end(ap);
198986dbb4cSkrw 	exit(1);
199986dbb4cSkrw }
200