Blame


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