2 3efd8e31 2022-10-23 thomas * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
4 3efd8e31 2022-10-23 thomas * Permission to use, copy, modify, and distribute this software for any
5 3efd8e31 2022-10-23 thomas * purpose with or without fee is hereby granted, provided that the above
6 3efd8e31 2022-10-23 thomas * copyright notice and this permission notice appear in all copies.
8 3efd8e31 2022-10-23 thomas * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 3efd8e31 2022-10-23 thomas * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 3efd8e31 2022-10-23 thomas * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 3efd8e31 2022-10-23 thomas * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 3efd8e31 2022-10-23 thomas * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 3efd8e31 2022-10-23 thomas * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 3efd8e31 2022-10-23 thomas * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 4efc8dcb 2023-08-29 thomas #include "got_compat.h"
19 3efd8e31 2022-10-23 thomas #include <stdio.h>
20 3efd8e31 2022-10-23 thomas #include <stdlib.h>
21 3efd8e31 2022-10-23 thomas #include <stdarg.h>
22 3efd8e31 2022-10-23 thomas #include <string.h>
23 3efd8e31 2022-10-23 thomas #include <syslog.h>
24 3efd8e31 2022-10-23 thomas #include <errno.h>
25 3efd8e31 2022-10-23 thomas #include <time.h>
27 3efd8e31 2022-10-23 thomas #include "log.h"
29 3efd8e31 2022-10-23 thomas static int debug;
30 3efd8e31 2022-10-23 thomas static int verbose;
31 3efd8e31 2022-10-23 thomas const char *log_procname;
34 3efd8e31 2022-10-23 thomas log_init(int n_debug, int facility)
36 3efd8e31 2022-10-23 thomas debug = n_debug;
37 3efd8e31 2022-10-23 thomas verbose = n_debug;
38 3efd8e31 2022-10-23 thomas log_procinit(getprogname());
40 3efd8e31 2022-10-23 thomas if (!debug)
41 3efd8e31 2022-10-23 thomas openlog(getprogname(), LOG_PID | LOG_NDELAY, facility);
47 3efd8e31 2022-10-23 thomas log_procinit(const char *procname)
49 3efd8e31 2022-10-23 thomas if (procname != NULL)
50 3efd8e31 2022-10-23 thomas log_procname = procname;
54 3efd8e31 2022-10-23 thomas log_setverbose(int v)
56 3efd8e31 2022-10-23 thomas verbose = v;
60 3efd8e31 2022-10-23 thomas log_getverbose(void)
62 3efd8e31 2022-10-23 thomas return (verbose);
66 3efd8e31 2022-10-23 thomas logit(int pri, const char *fmt, ...)
68 3efd8e31 2022-10-23 thomas va_list ap;
70 3efd8e31 2022-10-23 thomas va_start(ap, fmt);
71 3efd8e31 2022-10-23 thomas vlog(pri, fmt, ap);
72 3efd8e31 2022-10-23 thomas va_end(ap);
76 3efd8e31 2022-10-23 thomas vlog(int pri, const char *fmt, va_list ap)
78 3efd8e31 2022-10-23 thomas char *nfmt;
79 3efd8e31 2022-10-23 thomas int saved_errno = errno;
81 3efd8e31 2022-10-23 thomas if (debug) {
82 3efd8e31 2022-10-23 thomas /* best effort in out of mem situations */
83 e1560d23 2023-01-08 thomas if (asprintf(&nfmt, "%s: %s\n", log_procname, fmt) == -1) {
84 3efd8e31 2022-10-23 thomas vfprintf(stderr, fmt, ap);
85 3efd8e31 2022-10-23 thomas fprintf(stderr, "\n");
87 3efd8e31 2022-10-23 thomas vfprintf(stderr, nfmt, ap);
88 3efd8e31 2022-10-23 thomas free(nfmt);
90 3efd8e31 2022-10-23 thomas fflush(stderr);
92 3efd8e31 2022-10-23 thomas vsyslog(pri, fmt, ap);
94 3efd8e31 2022-10-23 thomas errno = saved_errno;
98 3efd8e31 2022-10-23 thomas log_warn(const char *emsg, ...)
100 3efd8e31 2022-10-23 thomas char *nfmt;
101 3efd8e31 2022-10-23 thomas va_list ap;
102 3efd8e31 2022-10-23 thomas int saved_errno = errno;
104 3efd8e31 2022-10-23 thomas /* best effort to even work in out of memory situations */
105 3efd8e31 2022-10-23 thomas if (emsg == NULL)
106 3efd8e31 2022-10-23 thomas logit(LOG_CRIT, "%s", strerror(saved_errno));
108 3efd8e31 2022-10-23 thomas va_start(ap, emsg);
110 3efd8e31 2022-10-23 thomas if (asprintf(&nfmt, "%s: %s", emsg,
111 3efd8e31 2022-10-23 thomas strerror(saved_errno)) == -1) {
112 3efd8e31 2022-10-23 thomas /* we tried it... */
113 3efd8e31 2022-10-23 thomas vlog(LOG_CRIT, emsg, ap);
114 3efd8e31 2022-10-23 thomas logit(LOG_CRIT, "%s", strerror(saved_errno));
116 3efd8e31 2022-10-23 thomas vlog(LOG_CRIT, nfmt, ap);
117 3efd8e31 2022-10-23 thomas free(nfmt);
119 3efd8e31 2022-10-23 thomas va_end(ap);
122 3efd8e31 2022-10-23 thomas errno = saved_errno;
126 3efd8e31 2022-10-23 thomas log_warnx(const char *emsg, ...)
128 3efd8e31 2022-10-23 thomas va_list ap;
130 3efd8e31 2022-10-23 thomas va_start(ap, emsg);
131 3efd8e31 2022-10-23 thomas vlog(LOG_CRIT, emsg, ap);
132 3efd8e31 2022-10-23 thomas va_end(ap);
136 3efd8e31 2022-10-23 thomas log_info(const char *emsg, ...)
138 3efd8e31 2022-10-23 thomas va_list ap;
140 3efd8e31 2022-10-23 thomas va_start(ap, emsg);
141 3efd8e31 2022-10-23 thomas vlog(LOG_INFO, emsg, ap);
142 3efd8e31 2022-10-23 thomas va_end(ap);
146 3efd8e31 2022-10-23 thomas log_debug(const char *emsg, ...)
148 3efd8e31 2022-10-23 thomas va_list ap;
150 3efd8e31 2022-10-23 thomas if (verbose) {
151 3efd8e31 2022-10-23 thomas va_start(ap, emsg);
152 3efd8e31 2022-10-23 thomas vlog(LOG_DEBUG, emsg, ap);
153 3efd8e31 2022-10-23 thomas va_end(ap);
157 3efd8e31 2022-10-23 thomas static void
158 3efd8e31 2022-10-23 thomas vfatalc(int code, const char *emsg, va_list ap)
160 3efd8e31 2022-10-23 thomas static char s[BUFSIZ];
161 3efd8e31 2022-10-23 thomas const char *sep;
163 3efd8e31 2022-10-23 thomas if (emsg != NULL) {
164 3efd8e31 2022-10-23 thomas (void)vsnprintf(s, sizeof(s), emsg, ap);
165 3efd8e31 2022-10-23 thomas sep = ": ";
167 3efd8e31 2022-10-23 thomas s[0] = '\0';
168 3efd8e31 2022-10-23 thomas sep = "";
170 3efd8e31 2022-10-23 thomas if (code)
171 a6d87ea2 2023-02-07 thomas logit(LOG_CRIT, "%s%s%s", s, sep, strerror(code));
173 a6d87ea2 2023-02-07 thomas logit(LOG_CRIT, "%s", s);
177 3efd8e31 2022-10-23 thomas fatal(const char *emsg, ...)
179 3efd8e31 2022-10-23 thomas va_list ap;
181 3efd8e31 2022-10-23 thomas va_start(ap, emsg);
182 3efd8e31 2022-10-23 thomas vfatalc(errno, emsg, ap);
183 3efd8e31 2022-10-23 thomas va_end(ap);
188 3efd8e31 2022-10-23 thomas fatalx(const char *emsg, ...)
190 3efd8e31 2022-10-23 thomas va_list ap;
192 3efd8e31 2022-10-23 thomas va_start(ap, emsg);
193 3efd8e31 2022-10-23 thomas vfatalc(0, emsg, ap);
194 3efd8e31 2022-10-23 thomas va_end(ap);