Blame


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