15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* $OpenBSD: err.c,v 1.2 2002/06/25 15:50:15 mickey Exp $ */ 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * log.c 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Based on err.c, which was adapted from OpenBSD libc *err* *warn* code. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2005 Nick Mathewson <nickm@freehaven.net> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2000 Dug Song <dugsong@monkey.org> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1993 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Regents of the University of California. All rights reserved. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met: 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. Neither the name of the University nor the names of its contributors 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * may be used to endorse or promote products derived from this software 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without specific prior written permission. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SUCH DAMAGE. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CONFIG_H 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WIN32 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WIN32_LEAN_AND_MEAN 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef WIN32_LEAN_AND_MEAN 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIME_H 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h> 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/_libevent_time.h> 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "event.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "log.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "evutil.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void _warn_helper(int severity, int log_errno, const char *fmt, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void event_log(int severity, const char *msg); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_err(int eval, const char *fmt, ...) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _warn_helper(_EVENT_LOG_ERR, errno, fmt, ap); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(eval); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_warn(const char *fmt, ...) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _warn_helper(_EVENT_LOG_WARN, errno, fmt, ap); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_errx(int eval, const char *fmt, ...) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _warn_helper(_EVENT_LOG_ERR, -1, fmt, ap); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(eval); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_warnx(const char *fmt, ...) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _warn_helper(_EVENT_LOG_WARN, -1, fmt, ap); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_msgx(const char *fmt, ...) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _warn_helper(_EVENT_LOG_MSG, -1, fmt, ap); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_event_debugx(const char *fmt, ...) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _warn_helper(_EVENT_LOG_DEBUG, -1, fmt, ap); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_warn_helper(int severity, int log_errno, const char *fmt, va_list ap) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[1024]; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fmt != NULL) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evutil_vsnprintf(buf, sizeof(buf), fmt, ap); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[0] = '\0'; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_errno >= 0) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = strlen(buf); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len < sizeof(buf) - 3) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evutil_snprintf(buf + len, sizeof(buf) - len, ": %s", 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strerror(log_errno)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_log(severity, buf); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static event_log_cb log_fn = NULL; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_set_log_callback(event_log_cb cb) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_fn = cb; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event_log(int severity, const char *msg) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_fn) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_fn(severity, msg); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *severity_str; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (severity) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case _EVENT_LOG_DEBUG: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) severity_str = "debug"; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case _EVENT_LOG_MSG: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) severity_str = "msg"; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case _EVENT_LOG_WARN: 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) severity_str = "warn"; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case _EVENT_LOG_ERR: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) severity_str = "err"; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) severity_str = "???"; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void)fprintf(stderr, "[%s] %s\n", severity_str, msg); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 188