xref: /freebsd-src/contrib/pf/libevent/log.c (revision fc515400ab05695df359c4b4d5fab9285a642699)
1*67ecd4f3SMax Laier /*	$OpenBSD: err.c,v 1.2 2002/06/25 15:50:15 mickey Exp $	*/
2*67ecd4f3SMax Laier 
3*67ecd4f3SMax Laier /*
4*67ecd4f3SMax Laier  * log.c
5*67ecd4f3SMax Laier  *
6*67ecd4f3SMax Laier  * Based on err.c, which was adapted from OpenBSD libc *err* *warn* code.
7*67ecd4f3SMax Laier  *
8*67ecd4f3SMax Laier  * Copyright (c) 2005 Nick Mathewson <nickm@freehaven.net>
9*67ecd4f3SMax Laier  *
10*67ecd4f3SMax Laier  * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
11*67ecd4f3SMax Laier  *
12*67ecd4f3SMax Laier  * Copyright (c) 1993
13*67ecd4f3SMax Laier  *	The Regents of the University of California.  All rights reserved.
14*67ecd4f3SMax Laier  *
15*67ecd4f3SMax Laier  * Redistribution and use in source and binary forms, with or without
16*67ecd4f3SMax Laier  * modification, are permitted provided that the following conditions
17*67ecd4f3SMax Laier  * are met:
18*67ecd4f3SMax Laier  * 1. Redistributions of source code must retain the above copyright
19*67ecd4f3SMax Laier  *    notice, this list of conditions and the following disclaimer.
20*67ecd4f3SMax Laier  * 2. Redistributions in binary form must reproduce the above copyright
21*67ecd4f3SMax Laier  *    notice, this list of conditions and the following disclaimer in the
22*67ecd4f3SMax Laier  *    documentation and/or other materials provided with the distribution.
23*67ecd4f3SMax Laier  * 3. Neither the name of the University nor the names of its contributors
24*67ecd4f3SMax Laier  *    may be used to endorse or promote products derived from this software
25*67ecd4f3SMax Laier  *    without specific prior written permission.
26*67ecd4f3SMax Laier  *
27*67ecd4f3SMax Laier  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28*67ecd4f3SMax Laier  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29*67ecd4f3SMax Laier  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30*67ecd4f3SMax Laier  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31*67ecd4f3SMax Laier  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32*67ecd4f3SMax Laier  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33*67ecd4f3SMax Laier  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34*67ecd4f3SMax Laier  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35*67ecd4f3SMax Laier  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36*67ecd4f3SMax Laier  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37*67ecd4f3SMax Laier  * SUCH DAMAGE.
38*67ecd4f3SMax Laier  */
39*67ecd4f3SMax Laier 
40*67ecd4f3SMax Laier #ifdef HAVE_CONFIG_H
41*67ecd4f3SMax Laier #include "config.h"
42*67ecd4f3SMax Laier #endif
43*67ecd4f3SMax Laier 
44*67ecd4f3SMax Laier #ifdef WIN32
45*67ecd4f3SMax Laier #define WIN32_LEAN_AND_MEAN
46*67ecd4f3SMax Laier #include <windows.h>
47*67ecd4f3SMax Laier #undef WIN32_LEAN_AND_MEAN
48*67ecd4f3SMax Laier #include "misc.h"
49*67ecd4f3SMax Laier #endif
50*67ecd4f3SMax Laier #include <sys/types.h>
51*67ecd4f3SMax Laier #include <sys/tree.h>
52*67ecd4f3SMax Laier #ifdef HAVE_SYS_TIME_H
53*67ecd4f3SMax Laier #include <sys/time.h>
54*67ecd4f3SMax Laier #else
55*67ecd4f3SMax Laier #include <sys/_time.h>
56*67ecd4f3SMax Laier #endif
57*67ecd4f3SMax Laier #include <stdio.h>
58*67ecd4f3SMax Laier #include <stdlib.h>
59*67ecd4f3SMax Laier #include <stdarg.h>
60*67ecd4f3SMax Laier #include <string.h>
61*67ecd4f3SMax Laier #include <errno.h>
62*67ecd4f3SMax Laier #include "event.h"
63*67ecd4f3SMax Laier 
64*67ecd4f3SMax Laier #include "log.h"
65*67ecd4f3SMax Laier 
66*67ecd4f3SMax Laier static void _warn_helper(int severity, int log_errno, const char *fmt,
67*67ecd4f3SMax Laier                          va_list ap);
68*67ecd4f3SMax Laier static void event_log(int severity, const char *msg);
69*67ecd4f3SMax Laier 
70*67ecd4f3SMax Laier static int
event_vsnprintf(char * str,size_t size,const char * format,va_list args)71*67ecd4f3SMax Laier event_vsnprintf(char *str, size_t size, const char *format, va_list args)
72*67ecd4f3SMax Laier {
73*67ecd4f3SMax Laier 	int r;
74*67ecd4f3SMax Laier 	if (size == 0)
75*67ecd4f3SMax Laier 		return -1;
76*67ecd4f3SMax Laier #ifdef WIN32
77*67ecd4f3SMax Laier 	r = _vsnprintf(str, size, format, args);
78*67ecd4f3SMax Laier #else
79*67ecd4f3SMax Laier 	r = vsnprintf(str, size, format, args);
80*67ecd4f3SMax Laier #endif
81*67ecd4f3SMax Laier 	str[size-1] = '\0';
82*67ecd4f3SMax Laier 	if (r < 0 || ((size_t)r) >= size) {
83*67ecd4f3SMax Laier 		/* different platforms behave differently on overflow;
84*67ecd4f3SMax Laier 		 * handle both kinds. */
85*67ecd4f3SMax Laier 		return -1;
86*67ecd4f3SMax Laier 	}
87*67ecd4f3SMax Laier 	return r;
88*67ecd4f3SMax Laier }
89*67ecd4f3SMax Laier 
90*67ecd4f3SMax Laier static int
event_snprintf(char * str,size_t size,const char * format,...)91*67ecd4f3SMax Laier event_snprintf(char *str, size_t size, const char *format, ...)
92*67ecd4f3SMax Laier {
93*67ecd4f3SMax Laier     va_list ap;
94*67ecd4f3SMax Laier     int r;
95*67ecd4f3SMax Laier     va_start(ap, format);
96*67ecd4f3SMax Laier     r = event_vsnprintf(str, size, format, ap);
97*67ecd4f3SMax Laier     va_end(ap);
98*67ecd4f3SMax Laier     return r;
99*67ecd4f3SMax Laier }
100*67ecd4f3SMax Laier 
101*67ecd4f3SMax Laier void
event_err(int eval,const char * fmt,...)102*67ecd4f3SMax Laier event_err(int eval, const char *fmt, ...)
103*67ecd4f3SMax Laier {
104*67ecd4f3SMax Laier 	va_list ap;
105*67ecd4f3SMax Laier 
106*67ecd4f3SMax Laier 	va_start(ap, fmt);
107*67ecd4f3SMax Laier 	_warn_helper(_EVENT_LOG_ERR, errno, fmt, ap);
108*67ecd4f3SMax Laier 	va_end(ap);
109*67ecd4f3SMax Laier 	exit(eval);
110*67ecd4f3SMax Laier }
111*67ecd4f3SMax Laier 
112*67ecd4f3SMax Laier void
event_warn(const char * fmt,...)113*67ecd4f3SMax Laier event_warn(const char *fmt, ...)
114*67ecd4f3SMax Laier {
115*67ecd4f3SMax Laier 	va_list ap;
116*67ecd4f3SMax Laier 
117*67ecd4f3SMax Laier 	va_start(ap, fmt);
118*67ecd4f3SMax Laier 	_warn_helper(_EVENT_LOG_WARN, errno, fmt, ap);
119*67ecd4f3SMax Laier 	va_end(ap);
120*67ecd4f3SMax Laier }
121*67ecd4f3SMax Laier 
122*67ecd4f3SMax Laier void
event_errx(int eval,const char * fmt,...)123*67ecd4f3SMax Laier event_errx(int eval, const char *fmt, ...)
124*67ecd4f3SMax Laier {
125*67ecd4f3SMax Laier 	va_list ap;
126*67ecd4f3SMax Laier 
127*67ecd4f3SMax Laier 	va_start(ap, fmt);
128*67ecd4f3SMax Laier 	_warn_helper(_EVENT_LOG_ERR, -1, fmt, ap);
129*67ecd4f3SMax Laier 	va_end(ap);
130*67ecd4f3SMax Laier 	exit(eval);
131*67ecd4f3SMax Laier }
132*67ecd4f3SMax Laier 
133*67ecd4f3SMax Laier void
event_warnx(const char * fmt,...)134*67ecd4f3SMax Laier event_warnx(const char *fmt, ...)
135*67ecd4f3SMax Laier {
136*67ecd4f3SMax Laier 	va_list ap;
137*67ecd4f3SMax Laier 
138*67ecd4f3SMax Laier 	va_start(ap, fmt);
139*67ecd4f3SMax Laier 	_warn_helper(_EVENT_LOG_WARN, -1, fmt, ap);
140*67ecd4f3SMax Laier 	va_end(ap);
141*67ecd4f3SMax Laier }
142*67ecd4f3SMax Laier 
143*67ecd4f3SMax Laier void
event_msgx(const char * fmt,...)144*67ecd4f3SMax Laier event_msgx(const char *fmt, ...)
145*67ecd4f3SMax Laier {
146*67ecd4f3SMax Laier 	va_list ap;
147*67ecd4f3SMax Laier 
148*67ecd4f3SMax Laier 	va_start(ap, fmt);
149*67ecd4f3SMax Laier 	_warn_helper(_EVENT_LOG_MSG, -1, fmt, ap);
150*67ecd4f3SMax Laier 	va_end(ap);
151*67ecd4f3SMax Laier }
152*67ecd4f3SMax Laier 
153*67ecd4f3SMax Laier void
_event_debugx(const char * fmt,...)154*67ecd4f3SMax Laier _event_debugx(const char *fmt, ...)
155*67ecd4f3SMax Laier {
156*67ecd4f3SMax Laier 	va_list ap;
157*67ecd4f3SMax Laier 
158*67ecd4f3SMax Laier 	va_start(ap, fmt);
159*67ecd4f3SMax Laier 	_warn_helper(_EVENT_LOG_DEBUG, -1, fmt, ap);
160*67ecd4f3SMax Laier 	va_end(ap);
161*67ecd4f3SMax Laier }
162*67ecd4f3SMax Laier 
163*67ecd4f3SMax Laier static void
_warn_helper(int severity,int log_errno,const char * fmt,va_list ap)164*67ecd4f3SMax Laier _warn_helper(int severity, int log_errno, const char *fmt, va_list ap)
165*67ecd4f3SMax Laier {
166*67ecd4f3SMax Laier 	char buf[1024];
167*67ecd4f3SMax Laier 	size_t len;
168*67ecd4f3SMax Laier 
169*67ecd4f3SMax Laier 	if (fmt != NULL)
170*67ecd4f3SMax Laier 		event_vsnprintf(buf, sizeof(buf), fmt, ap);
171*67ecd4f3SMax Laier 	else
172*67ecd4f3SMax Laier 		buf[0] = '\0';
173*67ecd4f3SMax Laier 
174*67ecd4f3SMax Laier 	if (log_errno >= 0) {
175*67ecd4f3SMax Laier 		len = strlen(buf);
176*67ecd4f3SMax Laier 		if (len < sizeof(buf) - 3) {
177*67ecd4f3SMax Laier 			event_snprintf(buf + len, sizeof(buf) - len, ": %s",
178*67ecd4f3SMax Laier 			    strerror(log_errno));
179*67ecd4f3SMax Laier 		}
180*67ecd4f3SMax Laier 	}
181*67ecd4f3SMax Laier 
182*67ecd4f3SMax Laier 	event_log(severity, buf);
183*67ecd4f3SMax Laier }
184*67ecd4f3SMax Laier 
185*67ecd4f3SMax Laier static event_log_cb log_fn = NULL;
186*67ecd4f3SMax Laier 
187*67ecd4f3SMax Laier void
event_set_log_callback(event_log_cb cb)188*67ecd4f3SMax Laier event_set_log_callback(event_log_cb cb)
189*67ecd4f3SMax Laier {
190*67ecd4f3SMax Laier 	log_fn = cb;
191*67ecd4f3SMax Laier }
192*67ecd4f3SMax Laier 
193*67ecd4f3SMax Laier static void
event_log(int severity,const char * msg)194*67ecd4f3SMax Laier event_log(int severity, const char *msg)
195*67ecd4f3SMax Laier {
196*67ecd4f3SMax Laier 	if (log_fn)
197*67ecd4f3SMax Laier 		log_fn(severity, msg);
198*67ecd4f3SMax Laier 	else {
199*67ecd4f3SMax Laier 		const char *severity_str;
200*67ecd4f3SMax Laier 		switch (severity) {
201*67ecd4f3SMax Laier 		case _EVENT_LOG_DEBUG:
202*67ecd4f3SMax Laier 			severity_str = "debug";
203*67ecd4f3SMax Laier 			break;
204*67ecd4f3SMax Laier 		case _EVENT_LOG_MSG:
205*67ecd4f3SMax Laier 			severity_str = "msg";
206*67ecd4f3SMax Laier 			break;
207*67ecd4f3SMax Laier 		case _EVENT_LOG_WARN:
208*67ecd4f3SMax Laier 			severity_str = "warn";
209*67ecd4f3SMax Laier 			break;
210*67ecd4f3SMax Laier 		case _EVENT_LOG_ERR:
211*67ecd4f3SMax Laier 			severity_str = "err";
212*67ecd4f3SMax Laier 			break;
213*67ecd4f3SMax Laier 		default:
214*67ecd4f3SMax Laier 			severity_str = "???";
215*67ecd4f3SMax Laier 			break;
216*67ecd4f3SMax Laier 		}
217*67ecd4f3SMax Laier 		(void)fprintf(stderr, "[%s] %s\n", severity_str, msg);
218*67ecd4f3SMax Laier 	}
219*67ecd4f3SMax Laier }
220