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