Blame


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