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