Blame


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