log.c revision 171169
1155131Srwatson/*	$OpenBSD: err.c,v 1.2 2002/06/25 15:50:15 mickey Exp $	*/
2161630Srwatson
3186647Srwatson/*
4155131Srwatson * log.c
5155131Srwatson *
6155131Srwatson * Based on err.c, which was adapted from OpenBSD libc *err* *warn* code.
7155131Srwatson *
8155131Srwatson * Copyright (c) 2005 Nick Mathewson <nickm@freehaven.net>
9155131Srwatson *
10155131Srwatson * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
11155131Srwatson *
12155131Srwatson * Copyright (c) 1993
13155131Srwatson *	The Regents of the University of California.  All rights reserved.
14155131Srwatson *
15155131Srwatson * Redistribution and use in source and binary forms, with or without
16155131Srwatson * modification, are permitted provided that the following conditions
17155131Srwatson * are met:
18155131Srwatson * 1. Redistributions of source code must retain the above copyright
19155131Srwatson *    notice, this list of conditions and the following disclaimer.
20155131Srwatson * 2. Redistributions in binary form must reproduce the above copyright
21155131Srwatson *    notice, this list of conditions and the following disclaimer in the
22155131Srwatson *    documentation and/or other materials provided with the distribution.
23155131Srwatson * 3. Neither the name of the University nor the names of its contributors
24155131Srwatson *    may be used to endorse or promote products derived from this software
25155131Srwatson *    without specific prior written permission.
26155131Srwatson *
27243750Srwatson * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28155131Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29168777Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30155131Srwatson * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31155131Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32155131Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33155131Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34168777Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35155131Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36155131Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37155131Srwatson * SUCH DAMAGE.
38155131Srwatson */
39155131Srwatson
40155131Srwatson#ifdef HAVE_CONFIG_H
41155131Srwatson#include "config.h"
42155131Srwatson#endif
43155131Srwatson
44155131Srwatson#ifdef WIN32
45168777Srwatson#define WIN32_LEAN_AND_MEAN
46155131Srwatson#include <windows.h>
47155131Srwatson#undef WIN32_LEAN_AND_MEAN
48155131Srwatson#include "misc.h"
49155131Srwatson#endif
50155131Srwatson#include <sys/types.h>
51155131Srwatson#include <sys/tree.h>
52168777Srwatson#ifdef HAVE_SYS_TIME_H
53155131Srwatson#include <sys/time.h>
54168777Srwatson#else
55155131Srwatson#include <sys/_time.h>
56155131Srwatson#endif
57155131Srwatson#include <stdio.h>
58155131Srwatson#include <stdlib.h>
59155131Srwatson#include <stdarg.h>
60155131Srwatson#include <string.h>
61155131Srwatson#include <errno.h>
62155131Srwatson#include "event.h"
63155131Srwatson
64155131Srwatson#include "log.h"
65155131Srwatson
66155131Srwatsonstatic void _warn_helper(int severity, int log_errno, const char *fmt,
67155131Srwatson                         va_list ap);
68155131Srwatsonstatic void event_log(int severity, const char *msg);
69155131Srwatson
70155131Srwatsonstatic int
71155131Srwatsonevent_vsnprintf(char *str, size_t size, const char *format, va_list args)
72168777Srwatson{
73155131Srwatson	int r;
74155131Srwatson	if (size == 0)
75155131Srwatson		return -1;
76155131Srwatson#ifdef WIN32
77155131Srwatson	r = _vsnprintf(str, size, format, args);
78168777Srwatson#else
79155131Srwatson	r = vsnprintf(str, size, format, args);
80155131Srwatson#endif
81168777Srwatson	str[size-1] = '\0';
82168777Srwatson	if (r < 0 || ((size_t)r) >= size) {
83168777Srwatson		/* different platforms behave differently on overflow;
84168777Srwatson		 * handle both kinds. */
85168777Srwatson		return -1;
86243750Srwatson	}
87168777Srwatson	return r;
88155131Srwatson}
89155131Srwatson
90155131Srwatsonstatic int
91168777Srwatsonevent_snprintf(char *str, size_t size, const char *format, ...)
92155131Srwatson{
93155131Srwatson    va_list ap;
94155131Srwatson    int r;
95161630Srwatson    va_start(ap, format);
96168777Srwatson    r = event_vsnprintf(str, size, format, ap);
97155131Srwatson    va_end(ap);
98161630Srwatson    return r;
99161630Srwatson}
100168777Srwatson
101161630Srwatsonvoid
102161630Srwatsonevent_err(int eval, const char *fmt, ...)
103168777Srwatson{
104168777Srwatson	va_list ap;
105168777Srwatson
106168777Srwatson	va_start(ap, fmt);
107168777Srwatson	_warn_helper(_EVENT_LOG_ERR, errno, fmt, ap);
108168777Srwatson	va_end(ap);
109168777Srwatson	exit(eval);
110168777Srwatson}
111168777Srwatson
112155131Srwatsonvoid
113155131Srwatsonevent_warn(const char *fmt, ...)
114155131Srwatson{
115168777Srwatson	va_list ap;
116155131Srwatson
117168777Srwatson	va_start(ap, fmt);
118155131Srwatson	_warn_helper(_EVENT_LOG_WARN, errno, fmt, ap);
119161630Srwatson	va_end(ap);
120168777Srwatson}
121161630Srwatson
122161630Srwatsonvoid
123161630Srwatsonevent_errx(int eval, const char *fmt, ...)
124168777Srwatson{
125161630Srwatson	va_list ap;
126161630Srwatson
127168777Srwatson	va_start(ap, fmt);
128168777Srwatson	_warn_helper(_EVENT_LOG_ERR, -1, fmt, ap);
129168777Srwatson	va_end(ap);
130168777Srwatson	exit(eval);
131168777Srwatson}
132168777Srwatson
133168777Srwatsonvoid
134168777Srwatsonevent_warnx(const char *fmt, ...)
135168777Srwatson{
136168777Srwatson	va_list ap;
137168777Srwatson
138155131Srwatson	va_start(ap, fmt);
139155131Srwatson	_warn_helper(_EVENT_LOG_WARN, -1, fmt, ap);
140155131Srwatson	va_end(ap);
141168777Srwatson}
142155131Srwatson
143186647Srwatsonvoid
144155131Srwatsonevent_msgx(const char *fmt, ...)
145155131Srwatson{
146168777Srwatson	va_list ap;
147155131Srwatson
148155131Srwatson	va_start(ap, fmt);
149168777Srwatson	_warn_helper(_EVENT_LOG_MSG, -1, fmt, ap);
150168777Srwatson	va_end(ap);
151168777Srwatson}
152168777Srwatson
153168777Srwatsonvoid
154155131Srwatson_event_debugx(const char *fmt, ...)
155155131Srwatson{
156155131Srwatson	va_list ap;
157168777Srwatson
158155131Srwatson	va_start(ap, fmt);
159155131Srwatson	_warn_helper(_EVENT_LOG_DEBUG, -1, fmt, ap);
160243750Srwatson	va_end(ap);
161155131Srwatson}
162168777Srwatson
163155131Srwatsonstatic void
164155131Srwatson_warn_helper(int severity, int log_errno, const char *fmt, va_list ap)
165161630Srwatson{
166168777Srwatson	char buf[1024];
167161630Srwatson	size_t len;
168161630Srwatson
169168777Srwatson	if (fmt != NULL)
170168777Srwatson		event_vsnprintf(buf, sizeof(buf), fmt, ap);
171168777Srwatson	else
172168777Srwatson		buf[0] = '\0';
173168777Srwatson
174168777Srwatson	if (log_errno >= 0) {
175168777Srwatson		len = strlen(buf);
176155131Srwatson		if (len < sizeof(buf) - 3) {
177155131Srwatson			event_snprintf(buf + len, sizeof(buf) - len, ": %s",
178155131Srwatson			    strerror(log_errno));
179168777Srwatson		}
180185573Srwatson	}
181155131Srwatson
182168777Srwatson	event_log(severity, buf);
183155131Srwatson}
184155131Srwatson
185185573Srwatsonstatic event_log_cb log_fn = NULL;
186168777Srwatson
187168777Srwatsonvoid
188168777Srwatsonevent_set_log_callback(event_log_cb cb)
189185573Srwatson{
190155131Srwatson	log_fn = cb;
191155131Srwatson}
192155131Srwatson
193185573Srwatsonstatic void
194185573Srwatsonevent_log(int severity, const char *msg)
195185573Srwatson{
196185573Srwatson	if (log_fn)
197185573Srwatson		log_fn(severity, msg);
198185573Srwatson	else {
199185573Srwatson		const char *severity_str;
200155131Srwatson		switch (severity) {
201168777Srwatson		case _EVENT_LOG_DEBUG:
202168777Srwatson			severity_str = "debug";
203168777Srwatson			break;
204168777Srwatson		case _EVENT_LOG_MSG:
205168777Srwatson			severity_str = "msg";
206168777Srwatson			break;
207185573Srwatson		case _EVENT_LOG_WARN:
208185573Srwatson			severity_str = "warn";
209155131Srwatson			break;
210155131Srwatson		case _EVENT_LOG_ERR:
211155131Srwatson			severity_str = "err";
212168777Srwatson			break;
213155131Srwatson		default:
214155131Srwatson			severity_str = "???";
215168777Srwatson			break;
216155364Srwatson		}
217155131Srwatson		(void)fprintf(stderr, "[%s] %s\n", severity_str, msg);
218168777Srwatson	}
219168777Srwatson}
220168777Srwatson