xref: /openbsd/lib/libevent/log.c (revision de140b1d)
1*de140b1dSnicm /*	$OpenBSD: log.c,v 1.12 2015/12/11 18:49:39 nicm Exp $	*/
24643be29Sbrad 
34643be29Sbrad /*
44643be29Sbrad  * log.c
54643be29Sbrad  *
64643be29Sbrad  * Based on err.c, which was adapted from OpenBSD libc *err* *warn* code.
74643be29Sbrad  *
84643be29Sbrad  * Copyright (c) 2005 Nick Mathewson <nickm@freehaven.net>
94643be29Sbrad  *
104643be29Sbrad  * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
114643be29Sbrad  *
124643be29Sbrad  * Copyright (c) 1993
134643be29Sbrad  *	The Regents of the University of California.  All rights reserved.
144643be29Sbrad  *
154643be29Sbrad  * Redistribution and use in source and binary forms, with or without
164643be29Sbrad  * modification, are permitted provided that the following conditions
174643be29Sbrad  * are met:
184643be29Sbrad  * 1. Redistributions of source code must retain the above copyright
194643be29Sbrad  *    notice, this list of conditions and the following disclaimer.
204643be29Sbrad  * 2. Redistributions in binary form must reproduce the above copyright
214643be29Sbrad  *    notice, this list of conditions and the following disclaimer in the
224643be29Sbrad  *    documentation and/or other materials provided with the distribution.
234643be29Sbrad  * 3. Neither the name of the University nor the names of its contributors
244643be29Sbrad  *    may be used to endorse or promote products derived from this software
254643be29Sbrad  *    without specific prior written permission.
264643be29Sbrad  *
274643be29Sbrad  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
284643be29Sbrad  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
294643be29Sbrad  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
304643be29Sbrad  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
314643be29Sbrad  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
324643be29Sbrad  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
334643be29Sbrad  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
344643be29Sbrad  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
354643be29Sbrad  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
364643be29Sbrad  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
374643be29Sbrad  * SUCH DAMAGE.
384643be29Sbrad  */
394643be29Sbrad 
404643be29Sbrad #include <sys/types.h>
414643be29Sbrad #include <sys/time.h>
42defc4074Sbluhm 
434643be29Sbrad #include <stdio.h>
444643be29Sbrad #include <stdlib.h>
454643be29Sbrad #include <stdarg.h>
464643be29Sbrad #include <string.h>
474643be29Sbrad #include <errno.h>
484643be29Sbrad 
49defc4074Sbluhm #include "event.h"
504643be29Sbrad #include "log.h"
514643be29Sbrad 
524643be29Sbrad static void	_warn_helper(int severity, int log_errno, const char *fmt,
534643be29Sbrad 		    va_list ap);
544643be29Sbrad static void	event_log(int severity, const char *msg);
554643be29Sbrad 
564643be29Sbrad void
event_err(int eval,const char * fmt,...)574643be29Sbrad event_err(int eval, const char *fmt, ...)
584643be29Sbrad {
594643be29Sbrad 	va_list ap;
604643be29Sbrad 
614643be29Sbrad 	va_start(ap, fmt);
624643be29Sbrad 	_warn_helper(_EVENT_LOG_ERR, errno, fmt, ap);
634643be29Sbrad 	va_end(ap);
644643be29Sbrad 	exit(eval);
654643be29Sbrad }
664643be29Sbrad 
674643be29Sbrad void
event_warn(const char * fmt,...)684643be29Sbrad event_warn(const char *fmt, ...)
694643be29Sbrad {
704643be29Sbrad 	va_list ap;
714643be29Sbrad 
724643be29Sbrad 	va_start(ap, fmt);
734643be29Sbrad 	_warn_helper(_EVENT_LOG_WARN, errno, fmt, ap);
744643be29Sbrad 	va_end(ap);
754643be29Sbrad }
764643be29Sbrad 
774643be29Sbrad void
event_errx(int eval,const char * fmt,...)784643be29Sbrad event_errx(int eval, const char *fmt, ...)
794643be29Sbrad {
804643be29Sbrad 	va_list ap;
814643be29Sbrad 
824643be29Sbrad 	va_start(ap, fmt);
834643be29Sbrad 	_warn_helper(_EVENT_LOG_ERR, -1, fmt, ap);
844643be29Sbrad 	va_end(ap);
854643be29Sbrad 	exit(eval);
864643be29Sbrad }
874643be29Sbrad 
884643be29Sbrad void
event_warnx(const char * fmt,...)894643be29Sbrad event_warnx(const char *fmt, ...)
904643be29Sbrad {
914643be29Sbrad 	va_list ap;
924643be29Sbrad 
934643be29Sbrad 	va_start(ap, fmt);
944643be29Sbrad 	_warn_helper(_EVENT_LOG_WARN, -1, fmt, ap);
954643be29Sbrad 	va_end(ap);
964643be29Sbrad }
974643be29Sbrad 
984643be29Sbrad void
event_msgx(const char * fmt,...)994643be29Sbrad event_msgx(const char *fmt, ...)
1004643be29Sbrad {
1014643be29Sbrad 	va_list ap;
1024643be29Sbrad 
1034643be29Sbrad 	va_start(ap, fmt);
1044643be29Sbrad 	_warn_helper(_EVENT_LOG_MSG, -1, fmt, ap);
1054643be29Sbrad 	va_end(ap);
1064643be29Sbrad }
1074643be29Sbrad 
1084643be29Sbrad void
_event_debugx(const char * fmt,...)1094643be29Sbrad _event_debugx(const char *fmt, ...)
1104643be29Sbrad {
1114643be29Sbrad 	va_list ap;
1124643be29Sbrad 
1134643be29Sbrad 	va_start(ap, fmt);
1144643be29Sbrad 	_warn_helper(_EVENT_LOG_DEBUG, -1, fmt, ap);
1154643be29Sbrad 	va_end(ap);
1164643be29Sbrad }
1174643be29Sbrad 
1184643be29Sbrad static void
_warn_helper(int severity,int log_errno,const char * fmt,va_list ap)1194643be29Sbrad _warn_helper(int severity, int log_errno, const char *fmt, va_list ap)
1204643be29Sbrad {
1214643be29Sbrad 	char buf[1024];
1224643be29Sbrad 	size_t len;
1234643be29Sbrad 
1244643be29Sbrad 	if (fmt != NULL)
12584ea67e3Sbluhm 		vsnprintf(buf, sizeof(buf), fmt, ap);
1264643be29Sbrad 	else
1274643be29Sbrad 		buf[0] = '\0';
1284643be29Sbrad 
1294643be29Sbrad 	if (log_errno >= 0) {
1304643be29Sbrad 		len = strlen(buf);
1314643be29Sbrad 		if (len < sizeof(buf) - 3) {
13284ea67e3Sbluhm 			snprintf(buf + len, sizeof(buf) - len, ": %s",
1334643be29Sbrad 			    strerror(log_errno));
1344643be29Sbrad 		}
1354643be29Sbrad 	}
1364643be29Sbrad 
1374643be29Sbrad 	event_log(severity, buf);
1384643be29Sbrad }
1394643be29Sbrad 
1404643be29Sbrad static event_log_cb log_fn = NULL;
1414643be29Sbrad 
1424643be29Sbrad void
event_set_log_callback(event_log_cb cb)1434643be29Sbrad event_set_log_callback(event_log_cb cb)
1444643be29Sbrad {
1454643be29Sbrad 	log_fn = cb;
1464643be29Sbrad }
1474643be29Sbrad 
1484643be29Sbrad static void
event_log(int severity,const char * msg)1494643be29Sbrad event_log(int severity, const char *msg)
1504643be29Sbrad {
1514643be29Sbrad 	if (log_fn)
1524643be29Sbrad 		log_fn(severity, msg);
1534643be29Sbrad }
154