1*9244353dSbluhm /* $OpenBSD: log.c,v 1.4 2017/04/28 14:52:13 bluhm Exp $ */
2bafa06e1Sbluhm
3bafa06e1Sbluhm /*
4bafa06e1Sbluhm * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5bafa06e1Sbluhm * Copyright (c) 2017 Alexander Bluhm <bluhm@openbsd.org>
6bafa06e1Sbluhm *
7bafa06e1Sbluhm * Permission to use, copy, modify, and distribute this software for any
8bafa06e1Sbluhm * purpose with or without fee is hereby granted, provided that the above
9bafa06e1Sbluhm * copyright notice and this permission notice appear in all copies.
10bafa06e1Sbluhm *
11bafa06e1Sbluhm * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12bafa06e1Sbluhm * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13bafa06e1Sbluhm * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14bafa06e1Sbluhm * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15bafa06e1Sbluhm * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16bafa06e1Sbluhm * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17bafa06e1Sbluhm * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18bafa06e1Sbluhm */
19bafa06e1Sbluhm
20ed00ae78Sbluhm #include <err.h>
21bafa06e1Sbluhm #include <errno.h>
22bafa06e1Sbluhm #include <stdio.h>
23ed00ae78Sbluhm #include <stdlib.h>
24bafa06e1Sbluhm #include <string.h>
25bafa06e1Sbluhm #include <syslog.h>
26bafa06e1Sbluhm #include <time.h>
27bafa06e1Sbluhm
28bafa06e1Sbluhm #include "log.h"
29bafa06e1Sbluhm #include "syslogd.h"
30bafa06e1Sbluhm
31bafa06e1Sbluhm static int verbose;
32bafa06e1Sbluhm static int facility;
33bafa06e1Sbluhm static const char *log_procname;
34ed00ae78Sbluhm static char *debug_ebuf;
35ed00ae78Sbluhm static size_t debug_length;
36bafa06e1Sbluhm
37bafa06e1Sbluhm void
log_init(int n_debug,int fac)38bafa06e1Sbluhm log_init(int n_debug, int fac)
39bafa06e1Sbluhm {
40bafa06e1Sbluhm extern char *__progname;
41bafa06e1Sbluhm
42bafa06e1Sbluhm verbose = n_debug;
43bafa06e1Sbluhm facility = fac;
44bafa06e1Sbluhm log_procinit(__progname);
45bafa06e1Sbluhm
46ed00ae78Sbluhm if (debug_ebuf == NULL)
47ed00ae78Sbluhm if ((debug_ebuf = malloc(ERRBUFSIZE)) == NULL)
48ed00ae78Sbluhm err(1, "allocate debug buffer");
49ed00ae78Sbluhm debug_ebuf[0] = '\0';
50ed00ae78Sbluhm debug_length = 0;
51ed00ae78Sbluhm
52bafa06e1Sbluhm tzset();
53bafa06e1Sbluhm }
54bafa06e1Sbluhm
55bafa06e1Sbluhm void
log_procinit(const char * procname)56bafa06e1Sbluhm log_procinit(const char *procname)
57bafa06e1Sbluhm {
58bafa06e1Sbluhm if (procname != NULL)
59bafa06e1Sbluhm log_procname = procname;
60bafa06e1Sbluhm }
61bafa06e1Sbluhm
62bafa06e1Sbluhm void
log_setverbose(int v)63bafa06e1Sbluhm log_setverbose(int v)
64bafa06e1Sbluhm {
65bafa06e1Sbluhm verbose = v;
66bafa06e1Sbluhm }
67bafa06e1Sbluhm
68bafa06e1Sbluhm int
log_getverbose(void)69bafa06e1Sbluhm log_getverbose(void)
70bafa06e1Sbluhm {
71bafa06e1Sbluhm return (verbose);
72bafa06e1Sbluhm }
73bafa06e1Sbluhm
74bafa06e1Sbluhm void
logit(int pri,const char * fmt,...)75bafa06e1Sbluhm logit(int pri, const char *fmt, ...)
76bafa06e1Sbluhm {
77bafa06e1Sbluhm va_list ap;
78bafa06e1Sbluhm
79bafa06e1Sbluhm va_start(ap, fmt);
80bafa06e1Sbluhm vlog(pri, fmt, ap);
81bafa06e1Sbluhm va_end(ap);
82bafa06e1Sbluhm }
83bafa06e1Sbluhm
84bafa06e1Sbluhm void
vlog(int pri,const char * fmt,va_list ap)85bafa06e1Sbluhm vlog(int pri, const char *fmt, va_list ap)
86bafa06e1Sbluhm {
87bafa06e1Sbluhm int saved_errno = errno;
88bafa06e1Sbluhm
89be87e301Sbluhm vlogmsg(facility|pri, log_procname, fmt, ap);
90bafa06e1Sbluhm
91bafa06e1Sbluhm errno = saved_errno;
92bafa06e1Sbluhm }
93bafa06e1Sbluhm
94bafa06e1Sbluhm void
log_warn(const char * emsg,...)95bafa06e1Sbluhm log_warn(const char *emsg, ...)
96bafa06e1Sbluhm {
97bafa06e1Sbluhm char ebuf[ERRBUFSIZE];
98bafa06e1Sbluhm size_t l;
99bafa06e1Sbluhm va_list ap;
100bafa06e1Sbluhm int saved_errno = errno;
101bafa06e1Sbluhm
102bafa06e1Sbluhm /* best effort to even work in out of memory situations */
103bafa06e1Sbluhm if (emsg == NULL)
104bafa06e1Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
105bafa06e1Sbluhm else {
106bafa06e1Sbluhm va_start(ap, emsg);
107bafa06e1Sbluhm l = vsnprintf(ebuf, sizeof(ebuf), emsg, ap);
108bafa06e1Sbluhm if (l < sizeof(ebuf))
109bafa06e1Sbluhm snprintf(ebuf+l, sizeof(ebuf)-l, ": %s",
110bafa06e1Sbluhm strerror(saved_errno));
111bafa06e1Sbluhm logit(LOG_ERR, "%s", ebuf);
112bafa06e1Sbluhm va_end(ap);
113bafa06e1Sbluhm }
114bafa06e1Sbluhm errno = saved_errno;
115bafa06e1Sbluhm }
116bafa06e1Sbluhm
117bafa06e1Sbluhm void
log_warnx(const char * emsg,...)118bafa06e1Sbluhm log_warnx(const char *emsg, ...)
119bafa06e1Sbluhm {
120bafa06e1Sbluhm va_list ap;
121bafa06e1Sbluhm
122bafa06e1Sbluhm va_start(ap, emsg);
123bafa06e1Sbluhm vlog(LOG_ERR, emsg, ap);
124bafa06e1Sbluhm va_end(ap);
125bafa06e1Sbluhm }
126bafa06e1Sbluhm
127bafa06e1Sbluhm void
log_info(int pri,const char * emsg,...)128bafa06e1Sbluhm log_info(int pri, const char *emsg, ...)
129bafa06e1Sbluhm {
130bafa06e1Sbluhm va_list ap;
131bafa06e1Sbluhm
132bafa06e1Sbluhm va_start(ap, emsg);
133bafa06e1Sbluhm vlog(pri, emsg, ap);
134bafa06e1Sbluhm va_end(ap);
135bafa06e1Sbluhm }
136bafa06e1Sbluhm
137bafa06e1Sbluhm void
log_debug(const char * emsg,...)138bafa06e1Sbluhm log_debug(const char *emsg, ...)
139bafa06e1Sbluhm {
140bafa06e1Sbluhm va_list ap;
141bafa06e1Sbluhm int saved_errno;
142bafa06e1Sbluhm
143bafa06e1Sbluhm if (verbose) {
144bafa06e1Sbluhm saved_errno = errno;
145bafa06e1Sbluhm va_start(ap, emsg);
146ed00ae78Sbluhm if (debug_length < ERRBUFSIZE - 1)
147ed00ae78Sbluhm vsnprintf(debug_ebuf + debug_length,
148ed00ae78Sbluhm ERRBUFSIZE - debug_length, emsg, ap);
149ed00ae78Sbluhm fprintf(stderr, "%s\n", debug_ebuf);
150bafa06e1Sbluhm fflush(stderr);
151bafa06e1Sbluhm va_end(ap);
152bafa06e1Sbluhm errno = saved_errno;
153bafa06e1Sbluhm }
154ed00ae78Sbluhm debug_ebuf[0] = '\0';
155ed00ae78Sbluhm debug_length = 0;
156ed00ae78Sbluhm }
157ed00ae78Sbluhm
158ed00ae78Sbluhm void
log_debugadd(const char * emsg,...)159ed00ae78Sbluhm log_debugadd(const char *emsg, ...)
160ed00ae78Sbluhm {
161ed00ae78Sbluhm size_t l;
162ed00ae78Sbluhm va_list ap;
163ed00ae78Sbluhm int saved_errno;
164ed00ae78Sbluhm
165ed00ae78Sbluhm if (verbose) {
166ed00ae78Sbluhm saved_errno = errno;
167ed00ae78Sbluhm va_start(ap, emsg);
168ed00ae78Sbluhm if (debug_length < ERRBUFSIZE - 1) {
169ed00ae78Sbluhm l = vsnprintf(debug_ebuf + debug_length,
170ed00ae78Sbluhm ERRBUFSIZE - debug_length, emsg, ap);
171ed00ae78Sbluhm if (l < ERRBUFSIZE - debug_length)
172ed00ae78Sbluhm debug_length += l;
173ed00ae78Sbluhm else
174ed00ae78Sbluhm debug_length = ERRBUFSIZE - 1;
175ed00ae78Sbluhm }
176ed00ae78Sbluhm va_end(ap);
177ed00ae78Sbluhm errno = saved_errno;
178ed00ae78Sbluhm }
179bafa06e1Sbluhm }
180bafa06e1Sbluhm
181bafa06e1Sbluhm static void
vfatalc(int error,const char * emsg,va_list ap)182bafa06e1Sbluhm vfatalc(int error, const char *emsg, va_list ap)
183bafa06e1Sbluhm {
184bafa06e1Sbluhm char ebuf[ERRBUFSIZE];
185bafa06e1Sbluhm const char *sep;
186bafa06e1Sbluhm
187bafa06e1Sbluhm if (emsg != NULL) {
188bafa06e1Sbluhm (void)vsnprintf(ebuf, sizeof(ebuf), emsg, ap);
189bafa06e1Sbluhm sep = ": ";
190bafa06e1Sbluhm } else {
191bafa06e1Sbluhm ebuf[0] = '\0';
192bafa06e1Sbluhm sep = "";
193bafa06e1Sbluhm }
194bafa06e1Sbluhm if (error)
195bafa06e1Sbluhm logit(LOG_CRIT, "fatal in %s: %s%s%s",
196bafa06e1Sbluhm log_procname, ebuf, sep, strerror(error));
197bafa06e1Sbluhm else
198bafa06e1Sbluhm logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, ebuf);
199bafa06e1Sbluhm }
200bafa06e1Sbluhm
201bafa06e1Sbluhm void
fatal(const char * emsg,...)202bafa06e1Sbluhm fatal(const char *emsg, ...)
203bafa06e1Sbluhm {
204bafa06e1Sbluhm va_list ap;
205bafa06e1Sbluhm
206bafa06e1Sbluhm va_start(ap, emsg);
207bafa06e1Sbluhm vfatalc(errno, emsg, ap);
208bafa06e1Sbluhm va_end(ap);
209bafa06e1Sbluhm die(0);
210bafa06e1Sbluhm }
211bafa06e1Sbluhm
212bafa06e1Sbluhm void
fatalx(const char * emsg,...)213bafa06e1Sbluhm fatalx(const char *emsg, ...)
214bafa06e1Sbluhm {
215bafa06e1Sbluhm va_list ap;
216bafa06e1Sbluhm
217bafa06e1Sbluhm va_start(ap, emsg);
218bafa06e1Sbluhm vfatalc(0, emsg, ap);
219bafa06e1Sbluhm va_end(ap);
220bafa06e1Sbluhm die(0);
221bafa06e1Sbluhm }
222