Blame


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