167ecd4f3SMax Laier /* $OpenBSD: err.c,v 1.2 2002/06/25 15:50:15 mickey Exp $ */
267ecd4f3SMax Laier
367ecd4f3SMax Laier /*
467ecd4f3SMax Laier * log.c
567ecd4f3SMax Laier *
667ecd4f3SMax Laier * Based on err.c, which was adapted from OpenBSD libc *err* *warn* code.
767ecd4f3SMax Laier *
867ecd4f3SMax Laier * Copyright (c) 2005 Nick Mathewson <nickm@freehaven.net>
967ecd4f3SMax Laier *
1067ecd4f3SMax Laier * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
1167ecd4f3SMax Laier *
1267ecd4f3SMax Laier * Copyright (c) 1993
1367ecd4f3SMax Laier * The Regents of the University of California. All rights reserved.
1467ecd4f3SMax Laier *
1567ecd4f3SMax Laier * Redistribution and use in source and binary forms, with or without
1667ecd4f3SMax Laier * modification, are permitted provided that the following conditions
1767ecd4f3SMax Laier * are met:
1867ecd4f3SMax Laier * 1. Redistributions of source code must retain the above copyright
1967ecd4f3SMax Laier * notice, this list of conditions and the following disclaimer.
2067ecd4f3SMax Laier * 2. Redistributions in binary form must reproduce the above copyright
2167ecd4f3SMax Laier * notice, this list of conditions and the following disclaimer in the
2267ecd4f3SMax Laier * documentation and/or other materials provided with the distribution.
2367ecd4f3SMax Laier * 3. Neither the name of the University nor the names of its contributors
2467ecd4f3SMax Laier * may be used to endorse or promote products derived from this software
2567ecd4f3SMax Laier * without specific prior written permission.
2667ecd4f3SMax Laier *
2767ecd4f3SMax Laier * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2867ecd4f3SMax Laier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2967ecd4f3SMax Laier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
3067ecd4f3SMax Laier * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
3167ecd4f3SMax Laier * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3267ecd4f3SMax Laier * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3367ecd4f3SMax Laier * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3467ecd4f3SMax Laier * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3567ecd4f3SMax Laier * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3667ecd4f3SMax Laier * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3767ecd4f3SMax Laier * SUCH DAMAGE.
3867ecd4f3SMax Laier */
3967ecd4f3SMax Laier
4067ecd4f3SMax Laier #ifdef HAVE_CONFIG_H
4167ecd4f3SMax Laier #include "config.h"
4267ecd4f3SMax Laier #endif
4367ecd4f3SMax Laier
4467ecd4f3SMax Laier #ifdef WIN32
4567ecd4f3SMax Laier #define WIN32_LEAN_AND_MEAN
4667ecd4f3SMax Laier #include <windows.h>
4767ecd4f3SMax Laier #undef WIN32_LEAN_AND_MEAN
4867ecd4f3SMax Laier #include "misc.h"
4967ecd4f3SMax Laier #endif
5067ecd4f3SMax Laier #include <sys/types.h>
5167ecd4f3SMax Laier #include <sys/tree.h>
5267ecd4f3SMax Laier #ifdef HAVE_SYS_TIME_H
5367ecd4f3SMax Laier #include <sys/time.h>
5467ecd4f3SMax Laier #else
5567ecd4f3SMax Laier #include <sys/_time.h>
5667ecd4f3SMax Laier #endif
5767ecd4f3SMax Laier #include <stdio.h>
5867ecd4f3SMax Laier #include <stdlib.h>
5967ecd4f3SMax Laier #include <stdarg.h>
6067ecd4f3SMax Laier #include <string.h>
6167ecd4f3SMax Laier #include <errno.h>
6267ecd4f3SMax Laier #include "event.h"
6367ecd4f3SMax Laier
6467ecd4f3SMax Laier #include "log.h"
6567ecd4f3SMax Laier
6667ecd4f3SMax Laier static void _warn_helper(int severity, int log_errno, const char *fmt,
6767ecd4f3SMax Laier va_list ap);
6867ecd4f3SMax Laier static void event_log(int severity, const char *msg);
6967ecd4f3SMax Laier
7067ecd4f3SMax Laier static int
event_vsnprintf(char * str,size_t size,const char * format,va_list args)7167ecd4f3SMax Laier event_vsnprintf(char *str, size_t size, const char *format, va_list args)
7267ecd4f3SMax Laier {
7367ecd4f3SMax Laier int r;
7467ecd4f3SMax Laier if (size == 0)
7567ecd4f3SMax Laier return -1;
7667ecd4f3SMax Laier #ifdef WIN32
7767ecd4f3SMax Laier r = _vsnprintf(str, size, format, args);
7867ecd4f3SMax Laier #else
7967ecd4f3SMax Laier r = vsnprintf(str, size, format, args);
8067ecd4f3SMax Laier #endif
8167ecd4f3SMax Laier str[size-1] = '\0';
8267ecd4f3SMax Laier if (r < 0 || ((size_t)r) >= size) {
8367ecd4f3SMax Laier /* different platforms behave differently on overflow;
8467ecd4f3SMax Laier * handle both kinds. */
8567ecd4f3SMax Laier return -1;
8667ecd4f3SMax Laier }
8767ecd4f3SMax Laier return r;
8867ecd4f3SMax Laier }
8967ecd4f3SMax Laier
9067ecd4f3SMax Laier static int
event_snprintf(char * str,size_t size,const char * format,...)9167ecd4f3SMax Laier event_snprintf(char *str, size_t size, const char *format, ...)
9267ecd4f3SMax Laier {
9367ecd4f3SMax Laier va_list ap;
9467ecd4f3SMax Laier int r;
9567ecd4f3SMax Laier va_start(ap, format);
9667ecd4f3SMax Laier r = event_vsnprintf(str, size, format, ap);
9767ecd4f3SMax Laier va_end(ap);
9867ecd4f3SMax Laier return r;
9967ecd4f3SMax Laier }
10067ecd4f3SMax Laier
10167ecd4f3SMax Laier void
event_err(int eval,const char * fmt,...)10267ecd4f3SMax Laier event_err(int eval, const char *fmt, ...)
10367ecd4f3SMax Laier {
10467ecd4f3SMax Laier va_list ap;
10567ecd4f3SMax Laier
10667ecd4f3SMax Laier va_start(ap, fmt);
10767ecd4f3SMax Laier _warn_helper(_EVENT_LOG_ERR, errno, fmt, ap);
10867ecd4f3SMax Laier va_end(ap);
10967ecd4f3SMax Laier exit(eval);
11067ecd4f3SMax Laier }
11167ecd4f3SMax Laier
11267ecd4f3SMax Laier void
event_warn(const char * fmt,...)11367ecd4f3SMax Laier event_warn(const char *fmt, ...)
11467ecd4f3SMax Laier {
11567ecd4f3SMax Laier va_list ap;
11667ecd4f3SMax Laier
11767ecd4f3SMax Laier va_start(ap, fmt);
11867ecd4f3SMax Laier _warn_helper(_EVENT_LOG_WARN, errno, fmt, ap);
11967ecd4f3SMax Laier va_end(ap);
12067ecd4f3SMax Laier }
12167ecd4f3SMax Laier
12267ecd4f3SMax Laier void
event_errx(int eval,const char * fmt,...)12367ecd4f3SMax Laier event_errx(int eval, const char *fmt, ...)
12467ecd4f3SMax Laier {
12567ecd4f3SMax Laier va_list ap;
12667ecd4f3SMax Laier
12767ecd4f3SMax Laier va_start(ap, fmt);
12867ecd4f3SMax Laier _warn_helper(_EVENT_LOG_ERR, -1, fmt, ap);
12967ecd4f3SMax Laier va_end(ap);
13067ecd4f3SMax Laier exit(eval);
13167ecd4f3SMax Laier }
13267ecd4f3SMax Laier
13367ecd4f3SMax Laier void
event_warnx(const char * fmt,...)13467ecd4f3SMax Laier event_warnx(const char *fmt, ...)
13567ecd4f3SMax Laier {
13667ecd4f3SMax Laier va_list ap;
13767ecd4f3SMax Laier
13867ecd4f3SMax Laier va_start(ap, fmt);
13967ecd4f3SMax Laier _warn_helper(_EVENT_LOG_WARN, -1, fmt, ap);
14067ecd4f3SMax Laier va_end(ap);
14167ecd4f3SMax Laier }
14267ecd4f3SMax Laier
14367ecd4f3SMax Laier void
event_msgx(const char * fmt,...)14467ecd4f3SMax Laier event_msgx(const char *fmt, ...)
14567ecd4f3SMax Laier {
14667ecd4f3SMax Laier va_list ap;
14767ecd4f3SMax Laier
14867ecd4f3SMax Laier va_start(ap, fmt);
14967ecd4f3SMax Laier _warn_helper(_EVENT_LOG_MSG, -1, fmt, ap);
15067ecd4f3SMax Laier va_end(ap);
15167ecd4f3SMax Laier }
15267ecd4f3SMax Laier
15367ecd4f3SMax Laier void
_event_debugx(const char * fmt,...)15467ecd4f3SMax Laier _event_debugx(const char *fmt, ...)
15567ecd4f3SMax Laier {
15667ecd4f3SMax Laier va_list ap;
15767ecd4f3SMax Laier
15867ecd4f3SMax Laier va_start(ap, fmt);
15967ecd4f3SMax Laier _warn_helper(_EVENT_LOG_DEBUG, -1, fmt, ap);
16067ecd4f3SMax Laier va_end(ap);
16167ecd4f3SMax Laier }
16267ecd4f3SMax Laier
16367ecd4f3SMax Laier static void
_warn_helper(int severity,int log_errno,const char * fmt,va_list ap)16467ecd4f3SMax Laier _warn_helper(int severity, int log_errno, const char *fmt, va_list ap)
16567ecd4f3SMax Laier {
16667ecd4f3SMax Laier char buf[1024];
16767ecd4f3SMax Laier size_t len;
16867ecd4f3SMax Laier
16967ecd4f3SMax Laier if (fmt != NULL)
17067ecd4f3SMax Laier event_vsnprintf(buf, sizeof(buf), fmt, ap);
17167ecd4f3SMax Laier else
17267ecd4f3SMax Laier buf[0] = '\0';
17367ecd4f3SMax Laier
17467ecd4f3SMax Laier if (log_errno >= 0) {
17567ecd4f3SMax Laier len = strlen(buf);
17667ecd4f3SMax Laier if (len < sizeof(buf) - 3) {
17767ecd4f3SMax Laier event_snprintf(buf + len, sizeof(buf) - len, ": %s",
17867ecd4f3SMax Laier strerror(log_errno));
17967ecd4f3SMax Laier }
18067ecd4f3SMax Laier }
18167ecd4f3SMax Laier
18267ecd4f3SMax Laier event_log(severity, buf);
18367ecd4f3SMax Laier }
18467ecd4f3SMax Laier
18567ecd4f3SMax Laier static event_log_cb log_fn = NULL;
18667ecd4f3SMax Laier
18767ecd4f3SMax Laier void
event_set_log_callback(event_log_cb cb)18867ecd4f3SMax Laier event_set_log_callback(event_log_cb cb)
18967ecd4f3SMax Laier {
19067ecd4f3SMax Laier log_fn = cb;
19167ecd4f3SMax Laier }
19267ecd4f3SMax Laier
19367ecd4f3SMax Laier static void
event_log(int severity,const char * msg)19467ecd4f3SMax Laier event_log(int severity, const char *msg)
19567ecd4f3SMax Laier {
19667ecd4f3SMax Laier if (log_fn)
19767ecd4f3SMax Laier log_fn(severity, msg);
19867ecd4f3SMax Laier else {
19967ecd4f3SMax Laier const char *severity_str;
20067ecd4f3SMax Laier switch (severity) {
20167ecd4f3SMax Laier case _EVENT_LOG_DEBUG:
20267ecd4f3SMax Laier severity_str = "debug";
20367ecd4f3SMax Laier break;
20467ecd4f3SMax Laier case _EVENT_LOG_MSG:
20567ecd4f3SMax Laier severity_str = "msg";
20667ecd4f3SMax Laier break;
20767ecd4f3SMax Laier case _EVENT_LOG_WARN:
20867ecd4f3SMax Laier severity_str = "warn";
20967ecd4f3SMax Laier break;
21067ecd4f3SMax Laier case _EVENT_LOG_ERR:
21167ecd4f3SMax Laier severity_str = "err";
21267ecd4f3SMax Laier break;
21367ecd4f3SMax Laier default:
21467ecd4f3SMax Laier severity_str = "???";
21567ecd4f3SMax Laier break;
21667ecd4f3SMax Laier }
21767ecd4f3SMax Laier (void)fprintf(stderr, "[%s] %s\n", severity_str, msg);
21867ecd4f3SMax Laier }
21967ecd4f3SMax Laier }
220