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