Blame


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