Blame


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