Blame


1 50794f47 2023-04-04 op /*
2 50794f47 2023-04-04 op * This file is in the public domain.
3 50794f47 2023-04-04 op */
4 50794f47 2023-04-04 op
5 50794f47 2023-04-04 op #include <sys/socket.h>
6 50794f47 2023-04-04 op #include <sys/stat.h>
7 50794f47 2023-04-04 op #include <sys/tree.h>
8 50794f47 2023-04-04 op #include <sys/types.h>
9 50794f47 2023-04-04 op #include <sys/un.h>
10 50794f47 2023-04-04 op #include <sys/wait.h>
11 50794f47 2023-04-04 op
12 50794f47 2023-04-04 op #include <err.h>
13 50794f47 2023-04-04 op #include <errno.h>
14 50794f47 2023-04-04 op #include <event.h>
15 50794f47 2023-04-04 op #include <fcntl.h>
16 50794f47 2023-04-04 op #include <limits.h>
17 50794f47 2023-04-04 op #include <pwd.h>
18 50794f47 2023-04-04 op #include <signal.h>
19 50794f47 2023-04-04 op #include <stdarg.h>
20 50794f47 2023-04-04 op #include <stdio.h>
21 50794f47 2023-04-04 op #include <stdlib.h>
22 50794f47 2023-04-04 op #include <string.h>
23 50794f47 2023-04-04 op #include <syslog.h>
24 50794f47 2023-04-04 op #include <unistd.h>
25 50794f47 2023-04-04 op
26 50794f47 2023-04-04 op #include "msearchd.h"
27 50794f47 2023-04-04 op
28 50794f47 2023-04-04 op #ifndef MSEARCHD_DB
29 50794f47 2023-04-04 op #define MSEARCHD_DB "/msearchd/mails.sqlite3"
30 50794f47 2023-04-04 op #endif
31 50794f47 2023-04-04 op
32 50794f47 2023-04-04 op #ifndef MSEARCHD_SOCK
33 50794f47 2023-04-04 op #define MSEARCHD_SOCK "/run/msearchd.sock"
34 50794f47 2023-04-04 op #endif
35 50794f47 2023-04-04 op
36 50794f47 2023-04-04 op #ifndef MSEARCHD_USER
37 50794f47 2023-04-04 op #define MSEARCHD_USER "www"
38 50794f47 2023-04-04 op #endif
39 50794f47 2023-04-04 op
40 50794f47 2023-04-04 op #define MAX_CHILDREN 32
41 50794f47 2023-04-04 op
42 50794f47 2023-04-04 op int debug;
43 50794f47 2023-04-04 op int verbose;
44 50794f47 2023-04-04 op int children = 3;
45 50794f47 2023-04-04 op pid_t pids[MAX_CHILDREN];
46 50794f47 2023-04-04 op
47 50794f47 2023-04-04 op __dead void srch_syslog_fatal(int, const char *, ...);
48 50794f47 2023-04-04 op __dead void srch_syslog_fatalx(int, const char *, ...);
49 50794f47 2023-04-04 op void srch_syslog_warn(const char *, ...);
50 50794f47 2023-04-04 op void srch_syslog_warnx(const char *, ...);
51 50794f47 2023-04-04 op void srch_syslog_info(const char *, ...);
52 50794f47 2023-04-04 op void srch_syslog_debug(const char *, ...);
53 50794f47 2023-04-04 op
54 50794f47 2023-04-04 op const struct logger syslogger = {
55 50794f47 2023-04-04 op .fatal = &srch_syslog_fatal,
56 50794f47 2023-04-04 op .fatalx = &srch_syslog_fatalx,
57 50794f47 2023-04-04 op .warn = &srch_syslog_warn,
58 50794f47 2023-04-04 op .warnx = &srch_syslog_warnx,
59 50794f47 2023-04-04 op .info = &srch_syslog_info,
60 50794f47 2023-04-04 op .debug = &srch_syslog_debug,
61 50794f47 2023-04-04 op };
62 50794f47 2023-04-04 op
63 50794f47 2023-04-04 op const struct logger dbglogger = {
64 50794f47 2023-04-04 op .fatal = &err,
65 50794f47 2023-04-04 op .fatalx = &errx,
66 50794f47 2023-04-04 op .warn = &warn,
67 50794f47 2023-04-04 op .warnx = &warnx,
68 50794f47 2023-04-04 op .info = &warnx,
69 50794f47 2023-04-04 op .debug = &warnx,
70 50794f47 2023-04-04 op };
71 50794f47 2023-04-04 op
72 50794f47 2023-04-04 op const struct logger *logger = &dbglogger;
73 50794f47 2023-04-04 op
74 50794f47 2023-04-04 op static void
75 28c73ba9 2023-04-04 op sighdlr(int sig)
76 50794f47 2023-04-04 op {
77 28c73ba9 2023-04-04 op static volatile sig_atomic_t got_sig;
78 50794f47 2023-04-04 op int i, save_errno;
79 50794f47 2023-04-04 op
80 28c73ba9 2023-04-04 op if (got_sig)
81 50794f47 2023-04-04 op return;
82 28c73ba9 2023-04-04 op got_sig = -1;
83 50794f47 2023-04-04 op
84 50794f47 2023-04-04 op save_errno = errno;
85 50794f47 2023-04-04 op for (i = 0; i < children; ++i)
86 50794f47 2023-04-04 op (void)kill(pids[i], SIGTERM);
87 50794f47 2023-04-04 op errno = save_errno;
88 50794f47 2023-04-04 op }
89 50794f47 2023-04-04 op
90 50794f47 2023-04-04 op static int
91 50794f47 2023-04-04 op bind_socket(const char *path, struct passwd *pw)
92 50794f47 2023-04-04 op {
93 50794f47 2023-04-04 op struct sockaddr_un sun;
94 50794f47 2023-04-04 op int fd, old_umask;
95 50794f47 2023-04-04 op
96 50794f47 2023-04-04 op if ((fd = socket(AF_UNIX, SOCK_STREAM|SOCK_NONBLOCK, 0)) == -1) {
97 50794f47 2023-04-04 op log_warn("%s: socket", __func__);
98 50794f47 2023-04-04 op return (-1);
99 50794f47 2023-04-04 op }
100 50794f47 2023-04-04 op
101 50794f47 2023-04-04 op memset(&sun, 0, sizeof(sun));
102 50794f47 2023-04-04 op sun.sun_family = AF_UNIX;
103 50794f47 2023-04-04 op
104 50794f47 2023-04-04 op if (strlcpy(sun.sun_path, path, sizeof(sun.sun_path)) >=
105 50794f47 2023-04-04 op sizeof(sun.sun_path)) {
106 50794f47 2023-04-04 op log_warnx("%s: path too long: %s", __func__, path);
107 50794f47 2023-04-04 op close(fd);
108 50794f47 2023-04-04 op return (-1);
109 50794f47 2023-04-04 op }
110 50794f47 2023-04-04 op
111 50794f47 2023-04-04 op if (unlink(path) == -1 && errno != ENOENT) {
112 50794f47 2023-04-04 op log_warn("%s: unlink %s", __func__, path);
113 50794f47 2023-04-04 op close(fd);
114 50794f47 2023-04-04 op return (-1);
115 50794f47 2023-04-04 op }
116 50794f47 2023-04-04 op
117 50794f47 2023-04-04 op old_umask = umask(0117);
118 50794f47 2023-04-04 op if (bind(fd, (struct sockaddr *)&sun, sizeof(sun)) == -1) {
119 50794f47 2023-04-04 op log_warn("%s: bind: %s (%d)", __func__, path, geteuid());
120 50794f47 2023-04-04 op close(fd);
121 50794f47 2023-04-04 op umask(old_umask);
122 50794f47 2023-04-04 op return (-1);
123 50794f47 2023-04-04 op }
124 50794f47 2023-04-04 op umask(old_umask);
125 50794f47 2023-04-04 op
126 50794f47 2023-04-04 op if (chmod(path, 0660) == -1) {
127 50794f47 2023-04-04 op log_warn("%s: chmod 0660 %s", __func__, path);
128 50794f47 2023-04-04 op close(fd);
129 50794f47 2023-04-04 op (void)unlink(path);
130 50794f47 2023-04-04 op return (-1);
131 50794f47 2023-04-04 op }
132 50794f47 2023-04-04 op
133 50794f47 2023-04-04 op if (chown(path, pw->pw_uid, pw->pw_gid) == -1) {
134 50794f47 2023-04-04 op log_warn("%s: chown %s %s", __func__, pw->pw_name, path);
135 50794f47 2023-04-04 op close(fd);
136 50794f47 2023-04-04 op (void)unlink(path);
137 50794f47 2023-04-04 op return (-1);
138 50794f47 2023-04-04 op }
139 50794f47 2023-04-04 op
140 50794f47 2023-04-04 op if (listen(fd, 5) == -1) {
141 50794f47 2023-04-04 op log_warn("%s: listen", __func__);
142 50794f47 2023-04-04 op close(fd);
143 50794f47 2023-04-04 op (void)unlink(path);
144 50794f47 2023-04-04 op return (-1);
145 50794f47 2023-04-04 op }
146 50794f47 2023-04-04 op
147 50794f47 2023-04-04 op return (fd);
148 50794f47 2023-04-04 op }
149 50794f47 2023-04-04 op
150 50794f47 2023-04-04 op static pid_t
151 50794f47 2023-04-04 op start_child(const char *argv0, const char *root, const char *user,
152 ffb578a0 2023-04-04 op const char *db, int debug, int verbose, int fd)
153 50794f47 2023-04-04 op {
154 50794f47 2023-04-04 op const char *argv[11];
155 50794f47 2023-04-04 op int argc = 0;
156 50794f47 2023-04-04 op pid_t pid;
157 50794f47 2023-04-04 op
158 50794f47 2023-04-04 op switch (pid = fork()) {
159 50794f47 2023-04-04 op case -1:
160 50794f47 2023-04-04 op fatal("cannot fork");
161 50794f47 2023-04-04 op case 0:
162 50794f47 2023-04-04 op break;
163 50794f47 2023-04-04 op default:
164 50794f47 2023-04-04 op close(fd);
165 50794f47 2023-04-04 op return (pid);
166 50794f47 2023-04-04 op }
167 50794f47 2023-04-04 op
168 50794f47 2023-04-04 op if (fd != 3) {
169 50794f47 2023-04-04 op if (dup2(fd, 3) == -1)
170 50794f47 2023-04-04 op fatal("cannot setup socket fd");
171 50794f47 2023-04-04 op } else if (fcntl(fd, F_SETFD, 0) == -1)
172 50794f47 2023-04-04 op fatal("cannot setup socket fd");
173 50794f47 2023-04-04 op
174 50794f47 2023-04-04 op argv[argc++] = argv0;
175 50794f47 2023-04-04 op argv[argc++] = "-S";
176 50794f47 2023-04-04 op argv[argc++] = "-p"; argv[argc++] = root;
177 50794f47 2023-04-04 op argv[argc++] = "-u"; argv[argc++] = user;
178 50794f47 2023-04-04 op if (debug)
179 50794f47 2023-04-04 op argv[argc++] = "-d";
180 50794f47 2023-04-04 op if (verbose--)
181 50794f47 2023-04-04 op argv[argc++] = "-v";
182 50794f47 2023-04-04 op if (verbose--)
183 50794f47 2023-04-04 op argv[argc++] = "-v";
184 50794f47 2023-04-04 op argv[argc++] = db;
185 50794f47 2023-04-04 op argv[argc++] = NULL;
186 50794f47 2023-04-04 op
187 50794f47 2023-04-04 op /* obnoxious cast */
188 50794f47 2023-04-04 op execvp(argv0, (char * const *) argv);
189 50794f47 2023-04-04 op fatal("execvp %s", argv0);
190 50794f47 2023-04-04 op }
191 50794f47 2023-04-04 op
192 50794f47 2023-04-04 op static void __dead
193 50794f47 2023-04-04 op usage(void)
194 50794f47 2023-04-04 op {
195 50794f47 2023-04-04 op fprintf(stderr,
196 50794f47 2023-04-04 op "usage: %s [-dv] [-j n] [-p path] [-s socket] [-u user] [db]\n",
197 50794f47 2023-04-04 op getprogname());
198 50794f47 2023-04-04 op exit(1);
199 50794f47 2023-04-04 op }
200 50794f47 2023-04-04 op
201 50794f47 2023-04-04 op int
202 50794f47 2023-04-04 op main(int argc, char **argv)
203 50794f47 2023-04-04 op {
204 50794f47 2023-04-04 op struct stat sb;
205 50794f47 2023-04-04 op struct passwd *pw;
206 50794f47 2023-04-04 op char sockp[PATH_MAX];
207 50794f47 2023-04-04 op const char *sock = MSEARCHD_SOCK;
208 50794f47 2023-04-04 op const char *user = MSEARCHD_USER;
209 50794f47 2023-04-04 op const char *root = NULL;
210 50794f47 2023-04-04 op const char *db = MSEARCHD_DB;
211 50794f47 2023-04-04 op const char *errstr, *cause, *argv0;
212 50794f47 2023-04-04 op pid_t pid;
213 50794f47 2023-04-04 op int ch, i, fd, ret, status, server = 0;
214 50794f47 2023-04-04 op
215 50794f47 2023-04-04 op /*
216 50794f47 2023-04-04 op * Ensure we have fds 0-2 open so that we have no issue with
217 50794f47 2023-04-04 op * calling bind_socket before daemon(3).
218 50794f47 2023-04-04 op */
219 50794f47 2023-04-04 op for (i = 0; i < 3; ++i) {
220 50794f47 2023-04-04 op if (fstat(i, &sb) == -1) {
221 50794f47 2023-04-04 op if ((fd = open("/dev/null", O_RDWR)) != -1) {
222 50794f47 2023-04-04 op if (dup2(fd, i) == -1)
223 50794f47 2023-04-04 op exit(1);
224 50794f47 2023-04-04 op if (fd > i)
225 50794f47 2023-04-04 op close(fd);
226 50794f47 2023-04-04 op } else
227 50794f47 2023-04-04 op exit(1);
228 50794f47 2023-04-04 op }
229 50794f47 2023-04-04 op }
230 50794f47 2023-04-04 op
231 50794f47 2023-04-04 op if ((argv0 = argv[0]) == NULL)
232 50794f47 2023-04-04 op argv0 = "msearchd";
233 50794f47 2023-04-04 op
234 50794f47 2023-04-04 op while ((ch = getopt(argc, argv, "dj:p:Ss:u:v")) != -1) {
235 50794f47 2023-04-04 op switch (ch) {
236 50794f47 2023-04-04 op case 'd':
237 50794f47 2023-04-04 op debug = 1;
238 50794f47 2023-04-04 op break;
239 50794f47 2023-04-04 op case 'j':
240 50794f47 2023-04-04 op children = strtonum(optarg, 1, MAX_CHILDREN, &errstr);
241 50794f47 2023-04-04 op if (errstr)
242 50794f47 2023-04-04 op fatalx("number of children is %s: %s",
243 50794f47 2023-04-04 op errstr, optarg);
244 50794f47 2023-04-04 op break;
245 50794f47 2023-04-04 op case 'p':
246 50794f47 2023-04-04 op root = optarg;
247 50794f47 2023-04-04 op break;
248 50794f47 2023-04-04 op case 'S':
249 50794f47 2023-04-04 op server = 1;
250 50794f47 2023-04-04 op break;
251 50794f47 2023-04-04 op case 's':
252 50794f47 2023-04-04 op sock = optarg;
253 50794f47 2023-04-04 op break;
254 50794f47 2023-04-04 op case 'u':
255 50794f47 2023-04-04 op user = optarg;
256 50794f47 2023-04-04 op break;
257 50794f47 2023-04-04 op case 'v':
258 50794f47 2023-04-04 op verbose++;
259 50794f47 2023-04-04 op break;
260 50794f47 2023-04-04 op default:
261 50794f47 2023-04-04 op usage();
262 50794f47 2023-04-04 op }
263 50794f47 2023-04-04 op }
264 50794f47 2023-04-04 op argc -= optind;
265 50794f47 2023-04-04 op argv += optind;
266 50794f47 2023-04-04 op
267 50794f47 2023-04-04 op if (argc > 0) {
268 50794f47 2023-04-04 op db = argv[0];
269 50794f47 2023-04-04 op argv++;
270 50794f47 2023-04-04 op argc--;
271 50794f47 2023-04-04 op }
272 50794f47 2023-04-04 op if (argc != 0)
273 50794f47 2023-04-04 op usage();
274 50794f47 2023-04-04 op
275 50794f47 2023-04-04 op if (geteuid())
276 50794f47 2023-04-04 op fatalx("need root privileges");
277 50794f47 2023-04-04 op
278 50794f47 2023-04-04 op pw = getpwnam(user);
279 50794f47 2023-04-04 op if (pw == NULL)
280 50794f47 2023-04-04 op fatalx("user %s not found", user);
281 50794f47 2023-04-04 op if (pw->pw_uid == 0)
282 50794f47 2023-04-04 op fatalx("cannot run as %s: must not be the superuser", user);
283 50794f47 2023-04-04 op
284 50794f47 2023-04-04 op if (root == NULL)
285 50794f47 2023-04-04 op root = pw->pw_dir;
286 2901dc0e 2023-04-04 op
287 2901dc0e 2023-04-04 op if (!debug)
288 2901dc0e 2023-04-04 op logger = &syslogger;
289 2901dc0e 2023-04-04 op
290 2901dc0e 2023-04-04 op if (!debug && !server && daemon(1, 0) == -1)
291 2901dc0e 2023-04-04 op fatal("daemon");
292 50794f47 2023-04-04 op
293 50794f47 2023-04-04 op if (!server) {
294 50794f47 2023-04-04 op sigset_t set;
295 50794f47 2023-04-04 op
296 50794f47 2023-04-04 op sigemptyset(&set);
297 50794f47 2023-04-04 op sigaddset(&set, SIGCHLD);
298 28c73ba9 2023-04-04 op sigaddset(&set, SIGINT);
299 28c73ba9 2023-04-04 op sigaddset(&set, SIGTERM);
300 50794f47 2023-04-04 op sigprocmask(SIG_BLOCK, &set, NULL);
301 50794f47 2023-04-04 op
302 50794f47 2023-04-04 op ret = snprintf(sockp, sizeof(sockp), "%s/%s", root, sock);
303 50794f47 2023-04-04 op if (ret < 0 || (size_t)ret >= sizeof(sockp))
304 50794f47 2023-04-04 op fatalx("socket path too long");
305 50794f47 2023-04-04 op if ((fd = bind_socket(sockp, pw)) == -1)
306 50794f47 2023-04-04 op fatalx("failed to open socket %s", sock);
307 50794f47 2023-04-04 op for (i = 0; i < children; ++i) {
308 50794f47 2023-04-04 op int d;
309 50794f47 2023-04-04 op
310 50794f47 2023-04-04 op if ((d = dup(fd)) == -1)
311 50794f47 2023-04-04 op fatalx("dup");
312 50794f47 2023-04-04 op pids[i] = start_child(argv0, root, user, db, debug,
313 50794f47 2023-04-04 op verbose, d);
314 50794f47 2023-04-04 op log_debug("forking child %d (pid %lld)", i,
315 50794f47 2023-04-04 op (long long)pids[i]);
316 50794f47 2023-04-04 op }
317 50794f47 2023-04-04 op
318 28c73ba9 2023-04-04 op signal(SIGINT, sighdlr);
319 28c73ba9 2023-04-04 op signal(SIGTERM, sighdlr);
320 28c73ba9 2023-04-04 op signal(SIGCHLD, sighdlr);
321 50794f47 2023-04-04 op signal(SIGHUP, SIG_IGN);
322 50794f47 2023-04-04 op
323 50794f47 2023-04-04 op sigprocmask(SIG_UNBLOCK, &set, NULL);
324 50794f47 2023-04-04 op }
325 50794f47 2023-04-04 op
326 50794f47 2023-04-04 op if (chroot(root) == -1)
327 50794f47 2023-04-04 op fatal("chroot %s", root);
328 50794f47 2023-04-04 op if (chdir("/") == -1)
329 50794f47 2023-04-04 op fatal("chdir /");
330 50794f47 2023-04-04 op
331 50794f47 2023-04-04 op if (setgroups(1, &pw->pw_gid) == -1 ||
332 50794f47 2023-04-04 op setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1 ||
333 50794f47 2023-04-04 op setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1)
334 50794f47 2023-04-04 op fatal("failed to drop privileges");
335 50794f47 2023-04-04 op
336 50794f47 2023-04-04 op if (server)
337 50794f47 2023-04-04 op return (server_main(db));
338 50794f47 2023-04-04 op
339 50794f47 2023-04-04 op if (pledge("stdio proc", NULL) == -1)
340 50794f47 2023-04-04 op fatal("pledge");
341 50794f47 2023-04-04 op
342 50794f47 2023-04-04 op for (;;) {
343 50794f47 2023-04-04 op do {
344 50794f47 2023-04-04 op pid = waitpid(WAIT_ANY, &status, 0);
345 50794f47 2023-04-04 op } while (pid != -1 || errno == EINTR);
346 50794f47 2023-04-04 op
347 50794f47 2023-04-04 op if (pid == -1) {
348 50794f47 2023-04-04 op if (errno == ECHILD)
349 50794f47 2023-04-04 op break;
350 50794f47 2023-04-04 op fatal("waitpid");
351 50794f47 2023-04-04 op }
352 50794f47 2023-04-04 op
353 50794f47 2023-04-04 op if (WIFSIGNALED(status))
354 50794f47 2023-04-04 op cause = "was terminated";
355 50794f47 2023-04-04 op else if (WIFEXITED(status)) {
356 50794f47 2023-04-04 op if (WEXITSTATUS(status) != 0)
357 50794f47 2023-04-04 op cause = "exited abnormally";
358 50794f47 2023-04-04 op else
359 50794f47 2023-04-04 op cause = "exited successfully";
360 50794f47 2023-04-04 op } else
361 50794f47 2023-04-04 op cause = "died";
362 50794f47 2023-04-04 op
363 50794f47 2023-04-04 op log_warnx("child process %lld %s", (long long)pid, cause);
364 50794f47 2023-04-04 op }
365 50794f47 2023-04-04 op
366 50794f47 2023-04-04 op return (1);
367 50794f47 2023-04-04 op }
368 50794f47 2023-04-04 op
369 50794f47 2023-04-04 op __dead void
370 50794f47 2023-04-04 op srch_syslog_fatal(int eval, const char *fmt, ...)
371 50794f47 2023-04-04 op {
372 50794f47 2023-04-04 op static char s[BUFSIZ];
373 50794f47 2023-04-04 op va_list ap;
374 50794f47 2023-04-04 op int r, save_errno;
375 50794f47 2023-04-04 op
376 50794f47 2023-04-04 op save_errno = errno;
377 50794f47 2023-04-04 op
378 50794f47 2023-04-04 op va_start(ap, fmt);
379 50794f47 2023-04-04 op r = vsnprintf(s, sizeof(s), fmt, ap);
380 50794f47 2023-04-04 op va_end(ap);
381 50794f47 2023-04-04 op
382 50794f47 2023-04-04 op errno = save_errno;
383 50794f47 2023-04-04 op
384 50794f47 2023-04-04 op if (r > 0 && (size_t)r <= sizeof(s))
385 50794f47 2023-04-04 op syslog(LOG_DAEMON|LOG_CRIT, "%s: %s", s, strerror(errno));
386 50794f47 2023-04-04 op
387 50794f47 2023-04-04 op exit(eval);
388 50794f47 2023-04-04 op }
389 50794f47 2023-04-04 op
390 50794f47 2023-04-04 op __dead void
391 50794f47 2023-04-04 op srch_syslog_fatalx(int eval, const char *fmt, ...)
392 50794f47 2023-04-04 op {
393 50794f47 2023-04-04 op va_list ap;
394 50794f47 2023-04-04 op
395 50794f47 2023-04-04 op va_start(ap, fmt);
396 50794f47 2023-04-04 op vsyslog(LOG_DAEMON|LOG_CRIT, fmt, ap);
397 50794f47 2023-04-04 op va_end(ap);
398 50794f47 2023-04-04 op
399 50794f47 2023-04-04 op exit(eval);
400 50794f47 2023-04-04 op }
401 50794f47 2023-04-04 op
402 50794f47 2023-04-04 op void
403 50794f47 2023-04-04 op srch_syslog_warn(const char *fmt, ...)
404 50794f47 2023-04-04 op {
405 50794f47 2023-04-04 op static char s[BUFSIZ];
406 50794f47 2023-04-04 op va_list ap;
407 50794f47 2023-04-04 op int r, save_errno;
408 50794f47 2023-04-04 op
409 50794f47 2023-04-04 op save_errno = errno;
410 50794f47 2023-04-04 op
411 50794f47 2023-04-04 op va_start(ap, fmt);
412 50794f47 2023-04-04 op r = vsnprintf(s, sizeof(s), fmt, ap);
413 50794f47 2023-04-04 op va_end(ap);
414 50794f47 2023-04-04 op
415 50794f47 2023-04-04 op errno = save_errno;
416 50794f47 2023-04-04 op
417 cae98100 2023-04-04 op if (r > 0 && (size_t)r < sizeof(s))
418 50794f47 2023-04-04 op syslog(LOG_DAEMON|LOG_ERR, "%s: %s", s, strerror(errno));
419 50794f47 2023-04-04 op
420 50794f47 2023-04-04 op errno = save_errno;
421 50794f47 2023-04-04 op }
422 50794f47 2023-04-04 op
423 50794f47 2023-04-04 op void
424 50794f47 2023-04-04 op srch_syslog_warnx(const char *fmt, ...)
425 50794f47 2023-04-04 op {
426 50794f47 2023-04-04 op va_list ap;
427 50794f47 2023-04-04 op int save_errno;
428 50794f47 2023-04-04 op
429 50794f47 2023-04-04 op save_errno = errno;
430 50794f47 2023-04-04 op va_start(ap, fmt);
431 50794f47 2023-04-04 op vsyslog(LOG_DAEMON|LOG_ERR, fmt, ap);
432 50794f47 2023-04-04 op va_end(ap);
433 50794f47 2023-04-04 op errno = save_errno;
434 50794f47 2023-04-04 op }
435 50794f47 2023-04-04 op
436 50794f47 2023-04-04 op void
437 50794f47 2023-04-04 op srch_syslog_info(const char *fmt, ...)
438 50794f47 2023-04-04 op {
439 50794f47 2023-04-04 op va_list ap;
440 50794f47 2023-04-04 op int save_errno;
441 50794f47 2023-04-04 op
442 50794f47 2023-04-04 op if (verbose < 1)
443 50794f47 2023-04-04 op return;
444 50794f47 2023-04-04 op
445 50794f47 2023-04-04 op save_errno = errno;
446 50794f47 2023-04-04 op va_start(ap, fmt);
447 50794f47 2023-04-04 op vsyslog(LOG_DAEMON|LOG_INFO, fmt, ap);
448 50794f47 2023-04-04 op va_end(ap);
449 50794f47 2023-04-04 op errno = save_errno;
450 50794f47 2023-04-04 op }
451 50794f47 2023-04-04 op
452 50794f47 2023-04-04 op void
453 50794f47 2023-04-04 op srch_syslog_debug(const char *fmt, ...)
454 50794f47 2023-04-04 op {
455 50794f47 2023-04-04 op va_list ap;
456 50794f47 2023-04-04 op int save_errno;
457 50794f47 2023-04-04 op
458 50794f47 2023-04-04 op if (verbose < 2)
459 50794f47 2023-04-04 op return;
460 50794f47 2023-04-04 op
461 50794f47 2023-04-04 op save_errno = errno;
462 50794f47 2023-04-04 op va_start(ap, fmt);
463 50794f47 2023-04-04 op vsyslog(LOG_DAEMON|LOG_DEBUG, fmt, ap);
464 50794f47 2023-04-04 op va_end(ap);
465 50794f47 2023-04-04 op errno = save_errno;
466 50794f47 2023-04-04 op }