1 6b5c4000 2026-03-02 rsadowski /* $OpenBSD: log.c,v 1.36 2026/03/02 19:28:01 rsadowski Exp $ */
4 41042ecc 2006-12-16 reyk * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
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.
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.
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>
27 6b5c4000 2026-03-02 rsadowski #include "log.h"
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;
34 9787a4f4 2015-11-22 reyk log_init(int n_debug, int facility)
36 41042ecc 2006-12-16 reyk extern char *__progname;
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);
43 9787a4f4 2015-11-22 reyk openlog(__progname, LOG_PID | LOG_NDELAY, facility);
49 9787a4f4 2015-11-22 reyk log_procinit(const char *procname)
51 9787a4f4 2015-11-22 reyk if (procname != NULL)
52 9787a4f4 2015-11-22 reyk log_procname = procname;
56 afbe8d84 2017-01-09 reyk log_setverbose(int v)
62 afbe8d84 2017-01-09 reyk log_getverbose(void)
64 afbe8d84 2017-01-09 reyk return (verbose);
68 41042ecc 2006-12-16 reyk logit(int pri, const char *fmt, ...)
72 41042ecc 2006-12-16 reyk va_start(ap, fmt);
73 41042ecc 2006-12-16 reyk vlog(pri, fmt, ap);
78 41042ecc 2006-12-16 reyk vlog(int pri, const char *fmt, va_list ap)
81 a907e013 2017-01-08 reyk int saved_errno = errno;
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");
89 41042ecc 2006-12-16 reyk vfprintf(stderr, nfmt, ap);
92 41042ecc 2006-12-16 reyk fflush(stderr);
94 41042ecc 2006-12-16 reyk vsyslog(pri, fmt, ap);
96 a907e013 2017-01-08 reyk errno = saved_errno;
100 41042ecc 2006-12-16 reyk log_warn(const char *emsg, ...)
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;
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));
110 41042ecc 2006-12-16 reyk va_start(ap, emsg);
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));
118 5efe1a62 2017-03-21 bluhm vlog(LOG_ERR, nfmt, ap);
119 41042ecc 2006-12-16 reyk free(nfmt);
121 41042ecc 2006-12-16 reyk va_end(ap);
124 a907e013 2017-01-08 reyk errno = saved_errno;
128 41042ecc 2006-12-16 reyk log_warnx(const char *emsg, ...)
130 41042ecc 2006-12-16 reyk va_list ap;
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);
138 41042ecc 2006-12-16 reyk log_info(const char *emsg, ...)
140 41042ecc 2006-12-16 reyk va_list ap;
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);
148 41042ecc 2006-12-16 reyk log_debug(const char *emsg, ...)
150 41042ecc 2006-12-16 reyk va_list ap;
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);
159 9787a4f4 2015-11-22 reyk static void
160 a907e013 2017-01-08 reyk vfatalc(int code, const char *emsg, va_list ap)
162 9787a4f4 2015-11-22 reyk static char s[BUFSIZ];
163 9787a4f4 2015-11-22 reyk const char *sep;
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 = ": ";
169 9787a4f4 2015-11-22 reyk s[0] = '\0';
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));
176 6b5c4000 2026-03-02 rsadowski logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
180 9787a4f4 2015-11-22 reyk fatal(const char *emsg, ...)
182 9787a4f4 2015-11-22 reyk va_list ap;
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);
191 9787a4f4 2015-11-22 reyk fatalx(const char *emsg, ...)
193 9787a4f4 2015-11-22 reyk va_list ap;
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);