xref: /openbsd-src/usr.sbin/syslogd/log.c (revision 9244353d92eebc58bb8dcd775b8bff3e20c6cde0)
1*9244353dSbluhm /*	$OpenBSD: log.c,v 1.4 2017/04/28 14:52:13 bluhm Exp $	*/
2bafa06e1Sbluhm 
3bafa06e1Sbluhm /*
4bafa06e1Sbluhm  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5bafa06e1Sbluhm  * Copyright (c) 2017 Alexander Bluhm <bluhm@openbsd.org>
6bafa06e1Sbluhm  *
7bafa06e1Sbluhm  * Permission to use, copy, modify, and distribute this software for any
8bafa06e1Sbluhm  * purpose with or without fee is hereby granted, provided that the above
9bafa06e1Sbluhm  * copyright notice and this permission notice appear in all copies.
10bafa06e1Sbluhm  *
11bafa06e1Sbluhm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12bafa06e1Sbluhm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13bafa06e1Sbluhm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14bafa06e1Sbluhm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15bafa06e1Sbluhm  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16bafa06e1Sbluhm  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17bafa06e1Sbluhm  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18bafa06e1Sbluhm  */
19bafa06e1Sbluhm 
20ed00ae78Sbluhm #include <err.h>
21bafa06e1Sbluhm #include <errno.h>
22bafa06e1Sbluhm #include <stdio.h>
23ed00ae78Sbluhm #include <stdlib.h>
24bafa06e1Sbluhm #include <string.h>
25bafa06e1Sbluhm #include <syslog.h>
26bafa06e1Sbluhm #include <time.h>
27bafa06e1Sbluhm 
28bafa06e1Sbluhm #include "log.h"
29bafa06e1Sbluhm #include "syslogd.h"
30bafa06e1Sbluhm 
31bafa06e1Sbluhm static int		 verbose;
32bafa06e1Sbluhm static int		 facility;
33bafa06e1Sbluhm static const char	*log_procname;
34ed00ae78Sbluhm static char		*debug_ebuf;
35ed00ae78Sbluhm static size_t		 debug_length;
36bafa06e1Sbluhm 
37bafa06e1Sbluhm void
log_init(int n_debug,int fac)38bafa06e1Sbluhm log_init(int n_debug, int fac)
39bafa06e1Sbluhm {
40bafa06e1Sbluhm 	extern char	*__progname;
41bafa06e1Sbluhm 
42bafa06e1Sbluhm 	verbose = n_debug;
43bafa06e1Sbluhm 	facility = fac;
44bafa06e1Sbluhm 	log_procinit(__progname);
45bafa06e1Sbluhm 
46ed00ae78Sbluhm 	if (debug_ebuf == NULL)
47ed00ae78Sbluhm 		if ((debug_ebuf = malloc(ERRBUFSIZE)) == NULL)
48ed00ae78Sbluhm 			err(1, "allocate debug buffer");
49ed00ae78Sbluhm 	debug_ebuf[0] = '\0';
50ed00ae78Sbluhm 	debug_length = 0;
51ed00ae78Sbluhm 
52bafa06e1Sbluhm 	tzset();
53bafa06e1Sbluhm }
54bafa06e1Sbluhm 
55bafa06e1Sbluhm void
log_procinit(const char * procname)56bafa06e1Sbluhm log_procinit(const char *procname)
57bafa06e1Sbluhm {
58bafa06e1Sbluhm 	if (procname != NULL)
59bafa06e1Sbluhm 		log_procname = procname;
60bafa06e1Sbluhm }
61bafa06e1Sbluhm 
62bafa06e1Sbluhm void
log_setverbose(int v)63bafa06e1Sbluhm log_setverbose(int v)
64bafa06e1Sbluhm {
65bafa06e1Sbluhm 	verbose = v;
66bafa06e1Sbluhm }
67bafa06e1Sbluhm 
68bafa06e1Sbluhm int
log_getverbose(void)69bafa06e1Sbluhm log_getverbose(void)
70bafa06e1Sbluhm {
71bafa06e1Sbluhm 	return (verbose);
72bafa06e1Sbluhm }
73bafa06e1Sbluhm 
74bafa06e1Sbluhm void
logit(int pri,const char * fmt,...)75bafa06e1Sbluhm logit(int pri, const char *fmt, ...)
76bafa06e1Sbluhm {
77bafa06e1Sbluhm 	va_list	ap;
78bafa06e1Sbluhm 
79bafa06e1Sbluhm 	va_start(ap, fmt);
80bafa06e1Sbluhm 	vlog(pri, fmt, ap);
81bafa06e1Sbluhm 	va_end(ap);
82bafa06e1Sbluhm }
83bafa06e1Sbluhm 
84bafa06e1Sbluhm void
vlog(int pri,const char * fmt,va_list ap)85bafa06e1Sbluhm vlog(int pri, const char *fmt, va_list ap)
86bafa06e1Sbluhm {
87bafa06e1Sbluhm 	int	 saved_errno = errno;
88bafa06e1Sbluhm 
89be87e301Sbluhm 	vlogmsg(facility|pri, log_procname, fmt, ap);
90bafa06e1Sbluhm 
91bafa06e1Sbluhm 	errno = saved_errno;
92bafa06e1Sbluhm }
93bafa06e1Sbluhm 
94bafa06e1Sbluhm void
log_warn(const char * emsg,...)95bafa06e1Sbluhm log_warn(const char *emsg, ...)
96bafa06e1Sbluhm {
97bafa06e1Sbluhm 	char	 ebuf[ERRBUFSIZE];
98bafa06e1Sbluhm 	size_t	 l;
99bafa06e1Sbluhm 	va_list	 ap;
100bafa06e1Sbluhm 	int	 saved_errno = errno;
101bafa06e1Sbluhm 
102bafa06e1Sbluhm 	/* best effort to even work in out of memory situations */
103bafa06e1Sbluhm 	if (emsg == NULL)
104bafa06e1Sbluhm 		logit(LOG_ERR, "%s", strerror(saved_errno));
105bafa06e1Sbluhm 	else {
106bafa06e1Sbluhm 		va_start(ap, emsg);
107bafa06e1Sbluhm 		l = vsnprintf(ebuf, sizeof(ebuf), emsg, ap);
108bafa06e1Sbluhm 		if (l < sizeof(ebuf))
109bafa06e1Sbluhm 			snprintf(ebuf+l, sizeof(ebuf)-l, ": %s",
110bafa06e1Sbluhm 			    strerror(saved_errno));
111bafa06e1Sbluhm 		logit(LOG_ERR, "%s", ebuf);
112bafa06e1Sbluhm 		va_end(ap);
113bafa06e1Sbluhm 	}
114bafa06e1Sbluhm 	errno = saved_errno;
115bafa06e1Sbluhm }
116bafa06e1Sbluhm 
117bafa06e1Sbluhm void
log_warnx(const char * emsg,...)118bafa06e1Sbluhm log_warnx(const char *emsg, ...)
119bafa06e1Sbluhm {
120bafa06e1Sbluhm 	va_list	 ap;
121bafa06e1Sbluhm 
122bafa06e1Sbluhm 	va_start(ap, emsg);
123bafa06e1Sbluhm 	vlog(LOG_ERR, emsg, ap);
124bafa06e1Sbluhm 	va_end(ap);
125bafa06e1Sbluhm }
126bafa06e1Sbluhm 
127bafa06e1Sbluhm void
log_info(int pri,const char * emsg,...)128bafa06e1Sbluhm log_info(int pri, const char *emsg, ...)
129bafa06e1Sbluhm {
130bafa06e1Sbluhm 	va_list	 ap;
131bafa06e1Sbluhm 
132bafa06e1Sbluhm 	va_start(ap, emsg);
133bafa06e1Sbluhm 	vlog(pri, emsg, ap);
134bafa06e1Sbluhm 	va_end(ap);
135bafa06e1Sbluhm }
136bafa06e1Sbluhm 
137bafa06e1Sbluhm void
log_debug(const char * emsg,...)138bafa06e1Sbluhm log_debug(const char *emsg, ...)
139bafa06e1Sbluhm {
140bafa06e1Sbluhm 	va_list	 ap;
141bafa06e1Sbluhm 	int	 saved_errno;
142bafa06e1Sbluhm 
143bafa06e1Sbluhm 	if (verbose) {
144bafa06e1Sbluhm 		saved_errno = errno;
145bafa06e1Sbluhm 		va_start(ap, emsg);
146ed00ae78Sbluhm 		if (debug_length < ERRBUFSIZE - 1)
147ed00ae78Sbluhm 			vsnprintf(debug_ebuf + debug_length,
148ed00ae78Sbluhm 			    ERRBUFSIZE - debug_length, emsg, ap);
149ed00ae78Sbluhm 		fprintf(stderr, "%s\n", debug_ebuf);
150bafa06e1Sbluhm 		fflush(stderr);
151bafa06e1Sbluhm 		va_end(ap);
152bafa06e1Sbluhm 		errno = saved_errno;
153bafa06e1Sbluhm 	}
154ed00ae78Sbluhm 	debug_ebuf[0] = '\0';
155ed00ae78Sbluhm 	debug_length = 0;
156ed00ae78Sbluhm }
157ed00ae78Sbluhm 
158ed00ae78Sbluhm void
log_debugadd(const char * emsg,...)159ed00ae78Sbluhm log_debugadd(const char *emsg, ...)
160ed00ae78Sbluhm {
161ed00ae78Sbluhm 	size_t	 l;
162ed00ae78Sbluhm 	va_list	 ap;
163ed00ae78Sbluhm 	int	 saved_errno;
164ed00ae78Sbluhm 
165ed00ae78Sbluhm 	if (verbose) {
166ed00ae78Sbluhm 		saved_errno = errno;
167ed00ae78Sbluhm 		va_start(ap, emsg);
168ed00ae78Sbluhm 		if (debug_length < ERRBUFSIZE - 1) {
169ed00ae78Sbluhm 			l = vsnprintf(debug_ebuf + debug_length,
170ed00ae78Sbluhm 			    ERRBUFSIZE - debug_length, emsg, ap);
171ed00ae78Sbluhm 			if (l < ERRBUFSIZE - debug_length)
172ed00ae78Sbluhm 				debug_length += l;
173ed00ae78Sbluhm 			else
174ed00ae78Sbluhm 				debug_length = ERRBUFSIZE - 1;
175ed00ae78Sbluhm 		}
176ed00ae78Sbluhm 		va_end(ap);
177ed00ae78Sbluhm 		errno = saved_errno;
178ed00ae78Sbluhm 	}
179bafa06e1Sbluhm }
180bafa06e1Sbluhm 
181bafa06e1Sbluhm static void
vfatalc(int error,const char * emsg,va_list ap)182bafa06e1Sbluhm vfatalc(int error, const char *emsg, va_list ap)
183bafa06e1Sbluhm {
184bafa06e1Sbluhm 	char		 ebuf[ERRBUFSIZE];
185bafa06e1Sbluhm 	const char	*sep;
186bafa06e1Sbluhm 
187bafa06e1Sbluhm 	if (emsg != NULL) {
188bafa06e1Sbluhm 		(void)vsnprintf(ebuf, sizeof(ebuf), emsg, ap);
189bafa06e1Sbluhm 		sep = ": ";
190bafa06e1Sbluhm 	} else {
191bafa06e1Sbluhm 		ebuf[0] = '\0';
192bafa06e1Sbluhm 		sep = "";
193bafa06e1Sbluhm 	}
194bafa06e1Sbluhm 	if (error)
195bafa06e1Sbluhm 		logit(LOG_CRIT, "fatal in %s: %s%s%s",
196bafa06e1Sbluhm 		    log_procname, ebuf, sep, strerror(error));
197bafa06e1Sbluhm 	else
198bafa06e1Sbluhm 		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, ebuf);
199bafa06e1Sbluhm }
200bafa06e1Sbluhm 
201bafa06e1Sbluhm void
fatal(const char * emsg,...)202bafa06e1Sbluhm fatal(const char *emsg, ...)
203bafa06e1Sbluhm {
204bafa06e1Sbluhm 	va_list	ap;
205bafa06e1Sbluhm 
206bafa06e1Sbluhm 	va_start(ap, emsg);
207bafa06e1Sbluhm 	vfatalc(errno, emsg, ap);
208bafa06e1Sbluhm 	va_end(ap);
209bafa06e1Sbluhm 	die(0);
210bafa06e1Sbluhm }
211bafa06e1Sbluhm 
212bafa06e1Sbluhm void
fatalx(const char * emsg,...)213bafa06e1Sbluhm fatalx(const char *emsg, ...)
214bafa06e1Sbluhm {
215bafa06e1Sbluhm 	va_list	ap;
216bafa06e1Sbluhm 
217bafa06e1Sbluhm 	va_start(ap, emsg);
218bafa06e1Sbluhm 	vfatalc(0, emsg, ap);
219bafa06e1Sbluhm 	va_end(ap);
220bafa06e1Sbluhm 	die(0);
221bafa06e1Sbluhm }
222