Blame


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