Blame


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