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 0237feaa 2021-11-25 op #include <stdio.h>
18 0237feaa 2021-11-25 op #include <stdlib.h>
19 0237feaa 2021-11-25 op #include <stdarg.h>
20 0237feaa 2021-11-25 op #include <string.h>
21 0237feaa 2021-11-25 op #include <syslog.h>
22 0237feaa 2021-11-25 op #include <errno.h>
23 0237feaa 2021-11-25 op #include <time.h>
24 0237feaa 2021-11-25 op
25 0237feaa 2021-11-25 op #include "log.h"
26 0237feaa 2021-11-25 op
27 0237feaa 2021-11-25 op static int debug;
28 0237feaa 2021-11-25 op static int verbose;
29 0237feaa 2021-11-25 op static const char *log_procname;
30 0237feaa 2021-11-25 op
31 0237feaa 2021-11-25 op void
32 0237feaa 2021-11-25 op log_init(int n_debug, int facility)
33 0237feaa 2021-11-25 op {
34 0237feaa 2021-11-25 op debug = n_debug;
35 0237feaa 2021-11-25 op verbose = n_debug;
36 0237feaa 2021-11-25 op log_procinit(getprogname());
37 0237feaa 2021-11-25 op
38 0237feaa 2021-11-25 op if (!debug)
39 0237feaa 2021-11-25 op openlog(getprogname(), LOG_PID | LOG_NDELAY, facility);
40 0237feaa 2021-11-25 op
41 0237feaa 2021-11-25 op tzset();
42 0237feaa 2021-11-25 op }
43 0237feaa 2021-11-25 op
44 0237feaa 2021-11-25 op void
45 0237feaa 2021-11-25 op log_procinit(const char *procname)
46 0237feaa 2021-11-25 op {
47 0237feaa 2021-11-25 op if (procname != NULL)
48 0237feaa 2021-11-25 op log_procname = procname;
49 0237feaa 2021-11-25 op }
50 0237feaa 2021-11-25 op
51 0237feaa 2021-11-25 op void
52 0237feaa 2021-11-25 op log_setverbose(int v)
53 0237feaa 2021-11-25 op {
54 0237feaa 2021-11-25 op verbose = v;
55 0237feaa 2021-11-25 op }
56 0237feaa 2021-11-25 op
57 0237feaa 2021-11-25 op int
58 0237feaa 2021-11-25 op log_getverbose(void)
59 0237feaa 2021-11-25 op {
60 0237feaa 2021-11-25 op return (verbose);
61 0237feaa 2021-11-25 op }
62 0237feaa 2021-11-25 op
63 0237feaa 2021-11-25 op void
64 0237feaa 2021-11-25 op logit(int pri, const char *fmt, ...)
65 0237feaa 2021-11-25 op {
66 0237feaa 2021-11-25 op va_list ap;
67 0237feaa 2021-11-25 op
68 0237feaa 2021-11-25 op va_start(ap, fmt);
69 0237feaa 2021-11-25 op vlog(pri, fmt, ap);
70 0237feaa 2021-11-25 op va_end(ap);
71 0237feaa 2021-11-25 op }
72 0237feaa 2021-11-25 op
73 0237feaa 2021-11-25 op void
74 0237feaa 2021-11-25 op vlog(int pri, const char *fmt, va_list ap)
75 0237feaa 2021-11-25 op {
76 0237feaa 2021-11-25 op char *nfmt;
77 0237feaa 2021-11-25 op int saved_errno = errno;
78 0237feaa 2021-11-25 op
79 0237feaa 2021-11-25 op if (debug) {
80 0237feaa 2021-11-25 op /* best effort in out of mem situations */
81 0237feaa 2021-11-25 op if (asprintf(&nfmt, "%s: %s\n", log_procname, fmt) == -1) {
82 0237feaa 2021-11-25 op fprintf(stderr, "%s: ", log_procname);
83 0237feaa 2021-11-25 op vfprintf(stderr, fmt, ap);
84 0237feaa 2021-11-25 op fprintf(stderr, "\n");
85 0237feaa 2021-11-25 op } else {
86 0237feaa 2021-11-25 op vfprintf(stderr, nfmt, ap);
87 0237feaa 2021-11-25 op free(nfmt);
88 0237feaa 2021-11-25 op }
89 0237feaa 2021-11-25 op fflush(stderr);
90 0237feaa 2021-11-25 op } else
91 0237feaa 2021-11-25 op vsyslog(pri, fmt, ap);
92 0237feaa 2021-11-25 op
93 0237feaa 2021-11-25 op errno = saved_errno;
94 0237feaa 2021-11-25 op }
95 0237feaa 2021-11-25 op
96 0237feaa 2021-11-25 op void
97 0237feaa 2021-11-25 op log_warn(const char *emsg, ...)
98 0237feaa 2021-11-25 op {
99 0237feaa 2021-11-25 op char *nfmt;
100 0237feaa 2021-11-25 op va_list ap;
101 0237feaa 2021-11-25 op int saved_errno = errno;
102 0237feaa 2021-11-25 op
103 0237feaa 2021-11-25 op /* best effort to even work in out of memory situations */
104 0237feaa 2021-11-25 op if (emsg == NULL)
105 0237feaa 2021-11-25 op logit(LOG_ERR, "%s", strerror(saved_errno));
106 0237feaa 2021-11-25 op else {
107 0237feaa 2021-11-25 op va_start(ap, emsg);
108 0237feaa 2021-11-25 op
109 0237feaa 2021-11-25 op if (asprintf(&nfmt, "%s: %s", emsg,
110 0237feaa 2021-11-25 op strerror(saved_errno)) == -1) {
111 0237feaa 2021-11-25 op /* we tried it... */
112 0237feaa 2021-11-25 op vlog(LOG_ERR, emsg, ap);
113 0237feaa 2021-11-25 op logit(LOG_ERR, "%s", strerror(saved_errno));
114 0237feaa 2021-11-25 op } else {
115 0237feaa 2021-11-25 op vlog(LOG_ERR, nfmt, ap);
116 0237feaa 2021-11-25 op free(nfmt);
117 0237feaa 2021-11-25 op }
118 0237feaa 2021-11-25 op va_end(ap);
119 0237feaa 2021-11-25 op }
120 0237feaa 2021-11-25 op
121 0237feaa 2021-11-25 op errno = saved_errno;
122 0237feaa 2021-11-25 op }
123 0237feaa 2021-11-25 op
124 0237feaa 2021-11-25 op void
125 0237feaa 2021-11-25 op log_warnx(const char *emsg, ...)
126 0237feaa 2021-11-25 op {
127 0237feaa 2021-11-25 op va_list ap;
128 0237feaa 2021-11-25 op
129 0237feaa 2021-11-25 op va_start(ap, emsg);
130 0237feaa 2021-11-25 op vlog(LOG_ERR, emsg, ap);
131 0237feaa 2021-11-25 op va_end(ap);
132 0237feaa 2021-11-25 op }
133 0237feaa 2021-11-25 op
134 0237feaa 2021-11-25 op void
135 0237feaa 2021-11-25 op log_info(const char *emsg, ...)
136 0237feaa 2021-11-25 op {
137 0237feaa 2021-11-25 op va_list ap;
138 0237feaa 2021-11-25 op
139 0237feaa 2021-11-25 op va_start(ap, emsg);
140 0237feaa 2021-11-25 op vlog(LOG_INFO, emsg, ap);
141 0237feaa 2021-11-25 op va_end(ap);
142 0237feaa 2021-11-25 op }
143 0237feaa 2021-11-25 op
144 0237feaa 2021-11-25 op void
145 0237feaa 2021-11-25 op log_debug(const char *emsg, ...)
146 0237feaa 2021-11-25 op {
147 0237feaa 2021-11-25 op va_list ap;
148 0237feaa 2021-11-25 op
149 0237feaa 2021-11-25 op if (verbose) {
150 0237feaa 2021-11-25 op va_start(ap, emsg);
151 0237feaa 2021-11-25 op vlog(LOG_DEBUG, emsg, ap);
152 0237feaa 2021-11-25 op va_end(ap);
153 0237feaa 2021-11-25 op }
154 0237feaa 2021-11-25 op }
155 0237feaa 2021-11-25 op
156 0237feaa 2021-11-25 op static void
157 0237feaa 2021-11-25 op vfatalc(int code, const char *emsg, va_list ap)
158 0237feaa 2021-11-25 op {
159 0237feaa 2021-11-25 op static char s[BUFSIZ];
160 0237feaa 2021-11-25 op const char *sep;
161 0237feaa 2021-11-25 op
162 0237feaa 2021-11-25 op if (emsg != NULL) {
163 0237feaa 2021-11-25 op (void)vsnprintf(s, sizeof(s), emsg, ap);
164 0237feaa 2021-11-25 op sep = ": ";
165 0237feaa 2021-11-25 op } else {
166 0237feaa 2021-11-25 op s[0] = '\0';
167 0237feaa 2021-11-25 op sep = "";
168 0237feaa 2021-11-25 op }
169 0237feaa 2021-11-25 op if (code)
170 0237feaa 2021-11-25 op logit(LOG_CRIT, "fatal in %s: %s%s%s",
171 0237feaa 2021-11-25 op log_procname, s, sep, strerror(code));
172 0237feaa 2021-11-25 op else
173 0237feaa 2021-11-25 op logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
174 0237feaa 2021-11-25 op }
175 0237feaa 2021-11-25 op
176 0237feaa 2021-11-25 op void
177 0237feaa 2021-11-25 op fatal(const char *emsg, ...)
178 0237feaa 2021-11-25 op {
179 0237feaa 2021-11-25 op va_list ap;
180 0237feaa 2021-11-25 op
181 0237feaa 2021-11-25 op va_start(ap, emsg);
182 0237feaa 2021-11-25 op vfatalc(errno, emsg, ap);
183 0237feaa 2021-11-25 op va_end(ap);
184 0237feaa 2021-11-25 op exit(1);
185 0237feaa 2021-11-25 op }
186 0237feaa 2021-11-25 op
187 0237feaa 2021-11-25 op void
188 0237feaa 2021-11-25 op fatalx(const char *emsg, ...)
189 0237feaa 2021-11-25 op {
190 0237feaa 2021-11-25 op va_list ap;
191 0237feaa 2021-11-25 op
192 0237feaa 2021-11-25 op va_start(ap, emsg);
193 0237feaa 2021-11-25 op vfatalc(0, emsg, ap);
194 0237feaa 2021-11-25 op va_end(ap);
195 0237feaa 2021-11-25 op exit(1);
196 0237feaa 2021-11-25 op }