Blame


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