Blame


1 014c66b6 2023-06-25 op /*
2 0db0ef59 2023-10-16 op * This is free and unencumbered software released into the public domain.
3 014c66b6 2023-06-25 op *
4 0db0ef59 2023-10-16 op * Anyone is free to copy, modify, publish, use, compile, sell, or
5 0db0ef59 2023-10-16 op * distribute this software, either in source code form or as a compiled
6 0db0ef59 2023-10-16 op * binary, for any purpose, commercial or non-commercial, and by any
7 0db0ef59 2023-10-16 op * means.
8 014c66b6 2023-06-25 op */
9 014c66b6 2023-06-25 op
10 0db0ef59 2023-10-16 op #include <err.h>
11 0db0ef59 2023-10-16 op #include <errno.h>
12 0db0ef59 2023-10-16 op #include <stdarg.h>
13 014c66b6 2023-06-25 op #include <stdio.h>
14 014c66b6 2023-06-25 op #include <stdlib.h>
15 014c66b6 2023-06-25 op #include <string.h>
16 014c66b6 2023-06-25 op #include <syslog.h>
17 014c66b6 2023-06-25 op
18 014c66b6 2023-06-25 op #include "log.h"
19 014c66b6 2023-06-25 op
20 0db0ef59 2023-10-16 op __dead void log_syslog_fatal(int, const char *, ...);
21 0db0ef59 2023-10-16 op __dead void log_syslog_fatalx(int, const char *, ...);
22 0db0ef59 2023-10-16 op void log_syslog_warn(const char *, ...);
23 0db0ef59 2023-10-16 op void log_syslog_warnx(const char *, ...);
24 0db0ef59 2023-10-16 op void log_syslog_info(const char *, ...);
25 0db0ef59 2023-10-16 op void log_syslog_debug(const char *, ...);
26 014c66b6 2023-06-25 op
27 0db0ef59 2023-10-16 op const struct logger syslogger = {
28 0db0ef59 2023-10-16 op .fatal = &log_syslog_fatal,
29 0db0ef59 2023-10-16 op .fatalx = &log_syslog_fatalx,
30 0db0ef59 2023-10-16 op .warn = &log_syslog_warn,
31 0db0ef59 2023-10-16 op .warnx = &log_syslog_warnx,
32 0db0ef59 2023-10-16 op .info = &log_syslog_info,
33 0db0ef59 2023-10-16 op .debug = &log_syslog_debug,
34 0db0ef59 2023-10-16 op };
35 0db0ef59 2023-10-16 op
36 0db0ef59 2023-10-16 op const struct logger dbglogger = {
37 0db0ef59 2023-10-16 op .fatal = &err,
38 0db0ef59 2023-10-16 op .fatalx = &errx,
39 0db0ef59 2023-10-16 op .warn = &warn,
40 0db0ef59 2023-10-16 op .warnx = &warnx,
41 0db0ef59 2023-10-16 op .info = &warnx,
42 0db0ef59 2023-10-16 op .debug = &warnx,
43 0db0ef59 2023-10-16 op };
44 0db0ef59 2023-10-16 op
45 0db0ef59 2023-10-16 op const struct logger *logger = &dbglogger;
46 0db0ef59 2023-10-16 op
47 0db0ef59 2023-10-16 op static char logbuf[4096];
48 0db0ef59 2023-10-16 op static int debug;
49 0db0ef59 2023-10-16 op static int verbose;
50 0db0ef59 2023-10-16 op
51 014c66b6 2023-06-25 op void
52 014c66b6 2023-06-25 op log_init(int n_debug, int facility)
53 014c66b6 2023-06-25 op {
54 014c66b6 2023-06-25 op debug = n_debug;
55 014c66b6 2023-06-25 op verbose = n_debug;
56 014c66b6 2023-06-25 op
57 014c66b6 2023-06-25 op tzset();
58 0db0ef59 2023-10-16 op if (debug)
59 0db0ef59 2023-10-16 op setvbuf(stderr, logbuf, _IOLBF, sizeof(logbuf));
60 0db0ef59 2023-10-16 op else {
61 0db0ef59 2023-10-16 op openlog(getprogname(), LOG_PID | LOG_NDELAY, facility);
62 0db0ef59 2023-10-16 op logger = &syslogger;
63 0db0ef59 2023-10-16 op }
64 014c66b6 2023-06-25 op }
65 014c66b6 2023-06-25 op
66 014c66b6 2023-06-25 op void
67 014c66b6 2023-06-25 op log_setverbose(int v)
68 014c66b6 2023-06-25 op {
69 014c66b6 2023-06-25 op verbose = v;
70 014c66b6 2023-06-25 op }
71 014c66b6 2023-06-25 op
72 0db0ef59 2023-10-16 op __dead void
73 0db0ef59 2023-10-16 op log_syslog_fatal(int eval, const char *fmt, ...)
74 014c66b6 2023-06-25 op {
75 0db0ef59 2023-10-16 op static char s[BUFSIZ];
76 0db0ef59 2023-10-16 op va_list ap;
77 0db0ef59 2023-10-16 op int r, save_errno;
78 014c66b6 2023-06-25 op
79 0db0ef59 2023-10-16 op save_errno = errno;
80 014c66b6 2023-06-25 op
81 014c66b6 2023-06-25 op va_start(ap, fmt);
82 0db0ef59 2023-10-16 op r = vsnprintf(s, sizeof(s), fmt, ap);
83 014c66b6 2023-06-25 op va_end(ap);
84 014c66b6 2023-06-25 op
85 0db0ef59 2023-10-16 op errno = save_errno;
86 014c66b6 2023-06-25 op
87 0db0ef59 2023-10-16 op if (r > 0 && (size_t)r <= sizeof(s))
88 0db0ef59 2023-10-16 op syslog(LOG_DAEMON|LOG_CRIT, "%s: %s", s, strerror(errno));
89 014c66b6 2023-06-25 op
90 0db0ef59 2023-10-16 op exit(eval);
91 014c66b6 2023-06-25 op }
92 014c66b6 2023-06-25 op
93 0db0ef59 2023-10-16 op __dead void
94 0db0ef59 2023-10-16 op log_syslog_fatalx(int eval, const char *fmt, ...)
95 014c66b6 2023-06-25 op {
96 014c66b6 2023-06-25 op va_list ap;
97 014c66b6 2023-06-25 op
98 0db0ef59 2023-10-16 op va_start(ap, fmt);
99 0db0ef59 2023-10-16 op vsyslog(LOG_DAEMON|LOG_CRIT, fmt, ap);
100 0db0ef59 2023-10-16 op va_end(ap);
101 014c66b6 2023-06-25 op
102 0db0ef59 2023-10-16 op exit(eval);
103 014c66b6 2023-06-25 op }
104 014c66b6 2023-06-25 op
105 014c66b6 2023-06-25 op void
106 0db0ef59 2023-10-16 op log_syslog_warn(const char *fmt, ...)
107 014c66b6 2023-06-25 op {
108 0db0ef59 2023-10-16 op static char s[BUFSIZ];
109 0db0ef59 2023-10-16 op va_list ap;
110 0db0ef59 2023-10-16 op int r, save_errno;
111 014c66b6 2023-06-25 op
112 0db0ef59 2023-10-16 op save_errno = errno;
113 0db0ef59 2023-10-16 op
114 0db0ef59 2023-10-16 op va_start(ap, fmt);
115 0db0ef59 2023-10-16 op r = vsnprintf(s, sizeof(s), fmt, ap);
116 014c66b6 2023-06-25 op va_end(ap);
117 014c66b6 2023-06-25 op
118 0db0ef59 2023-10-16 op errno = save_errno;
119 014c66b6 2023-06-25 op
120 0db0ef59 2023-10-16 op if (r > 0 && (size_t)r < sizeof(s))
121 0db0ef59 2023-10-16 op syslog(LOG_DAEMON|LOG_ERR, "%s: %s", s, strerror(errno));
122 0db0ef59 2023-10-16 op
123 0db0ef59 2023-10-16 op errno = save_errno;
124 014c66b6 2023-06-25 op }
125 014c66b6 2023-06-25 op
126 014c66b6 2023-06-25 op void
127 0db0ef59 2023-10-16 op log_syslog_warnx(const char *fmt, ...)
128 014c66b6 2023-06-25 op {
129 0db0ef59 2023-10-16 op va_list ap;
130 0db0ef59 2023-10-16 op int save_errno;
131 014c66b6 2023-06-25 op
132 0db0ef59 2023-10-16 op save_errno = errno;
133 0db0ef59 2023-10-16 op va_start(ap, fmt);
134 0db0ef59 2023-10-16 op vsyslog(LOG_DAEMON|LOG_ERR, fmt, ap);
135 0db0ef59 2023-10-16 op va_end(ap);
136 0db0ef59 2023-10-16 op errno = save_errno;
137 014c66b6 2023-06-25 op }
138 014c66b6 2023-06-25 op
139 014c66b6 2023-06-25 op void
140 0db0ef59 2023-10-16 op log_syslog_info(const char *fmt, ...)
141 014c66b6 2023-06-25 op {
142 0db0ef59 2023-10-16 op va_list ap;
143 0db0ef59 2023-10-16 op int save_errno;
144 014c66b6 2023-06-25 op
145 0db0ef59 2023-10-16 op if (verbose < 1)
146 0db0ef59 2023-10-16 op return;
147 0db0ef59 2023-10-16 op
148 0db0ef59 2023-10-16 op save_errno = errno;
149 0db0ef59 2023-10-16 op va_start(ap, fmt);
150 0db0ef59 2023-10-16 op vsyslog(LOG_DAEMON|LOG_INFO, fmt, ap);
151 014c66b6 2023-06-25 op va_end(ap);
152 0db0ef59 2023-10-16 op errno = save_errno;
153 014c66b6 2023-06-25 op }
154 014c66b6 2023-06-25 op
155 014c66b6 2023-06-25 op void
156 0db0ef59 2023-10-16 op log_syslog_debug(const char *fmt, ...)
157 014c66b6 2023-06-25 op {
158 0db0ef59 2023-10-16 op va_list ap;
159 0db0ef59 2023-10-16 op int save_errno;
160 014c66b6 2023-06-25 op
161 0db0ef59 2023-10-16 op if (verbose < 2)
162 0db0ef59 2023-10-16 op return;
163 0db0ef59 2023-10-16 op
164 0db0ef59 2023-10-16 op save_errno = errno;
165 0db0ef59 2023-10-16 op va_start(ap, fmt);
166 0db0ef59 2023-10-16 op vsyslog(LOG_DAEMON|LOG_DEBUG, fmt, ap);
167 014c66b6 2023-06-25 op va_end(ap);
168 0db0ef59 2023-10-16 op errno = save_errno;
169 014c66b6 2023-06-25 op }