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