Mercurial > hg > dhcpcd
annotate src/logerr.c @ 5526:b1a3d9055662 draft
privsep: Allow logfile reopening in a chroot
Now that only the privileged actioneer does the actual logging
we can safely reopen the file we are logging to.
This also closes and re-opens the syslog connection.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Fri, 30 Oct 2020 14:19:16 +0000 |
| parents | 26b5d9bc2985 |
| children | 071a9ea18363 |
| rev | line source |
|---|---|
|
4548
c7df03794de3
Add SPDX identifiers to all dhcpcd source files.
Yegor Yefremov <yegorslists@googlemail.com>
parents:
4333
diff
changeset
|
1 /* SPDX-License-Identifier: BSD-2-Clause */ |
| 4010 | 2 /* |
| 3 * logerr: errx with logging | |
| 4922 | 4 * Copyright (c) 2006-2020 Roy Marples <roy@marples.name> |
| 4010 | 5 * All rights reserved |
| 6 | |
| 7 * Redistribution and use in source and binary forms, with or without | |
| 8 * modification, are permitted provided that the following conditions | |
| 9 * are met: | |
| 10 * 1. Redistributions of source code must retain the above copyright | |
| 11 * notice, this list of conditions and the following disclaimer. | |
| 12 * 2. Redistributions in binary form must reproduce the above copyright | |
| 13 * notice, this list of conditions and the following disclaimer in the | |
| 14 * documentation and/or other materials provided with the distribution. | |
| 15 * | |
| 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |
| 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
| 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 26 * SUCH DAMAGE. | |
| 27 */ | |
| 28 | |
| 29 #include <sys/time.h> | |
| 30 #include <errno.h> | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
31 #include <stdbool.h> |
| 4010 | 32 #include <stdarg.h> |
| 33 #include <stdio.h> | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
34 #include <stdlib.h> |
| 4010 | 35 #include <string.h> |
| 36 #include <syslog.h> | |
| 4013 | 37 #include <time.h> |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
38 #include <unistd.h> |
| 4010 | 39 |
| 40 #include "logerr.h" | |
| 41 | |
|
4011
2c2f1a6a61d9
LOG_SYSLOG_OPTS and LOG_SYSLOG_FACILITY can set these syslog
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
42 #ifndef LOGERR_SYSLOG_FACILITY |
|
2c2f1a6a61d9
LOG_SYSLOG_OPTS and LOG_SYSLOG_FACILITY can set these syslog
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
43 #define LOGERR_SYSLOG_FACILITY LOG_DAEMON |
| 4010 | 44 #endif |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
45 |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
46 #ifdef SMALL |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
47 #undef LOGERR_TAG |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
48 #endif |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
49 |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
50 /* syslog protocol is 1k message max, RFC 3164 section 4.1 */ |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
51 #define LOGERR_SYSLOGBUF 1024 + sizeof(int) + sizeof(pid_t) |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
52 |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
53 #define UNUSED(a) (void)(a) |
| 4010 | 54 |
| 55 struct logctx { | |
|
5326
ce2922c1b6dc
logerr: buffer stderr as we now have many processes
Roy Marples <roy@marples.name>
parents:
5283
diff
changeset
|
56 char log_buf[BUFSIZ]; |
| 4010 | 57 unsigned int log_opts; |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
58 int log_fd; |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
59 pid_t log_pid; |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
60 #ifndef SMALL |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
61 FILE *log_file; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
62 #ifdef LOGERR_TAG |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
63 const char *log_tag; |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
64 #endif |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
65 #endif |
| 4010 | 66 }; |
| 67 | |
| 68 static struct logctx _logctx = { | |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
69 /* syslog style, but without the hostname or tag. */ |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
70 .log_opts = LOGERR_LOG | LOGERR_LOG_DATE | LOGERR_LOG_PID, |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
71 .log_fd = -1, |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
72 .log_pid = 0, |
| 4010 | 73 }; |
| 74 | |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
75 #if defined(__linux__) |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
76 /* Poor man's getprogname(3). */ |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
77 static char *_logprog; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
78 static const char * |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
79 getprogname(void) |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
80 { |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
81 const char *p; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
82 |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
83 /* Use PATH_MAX + 1 to avoid truncation. */ |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
84 if (_logprog == NULL) { |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
85 /* readlink(2) does not append a NULL byte, |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
86 * so zero the buffer. */ |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
87 if ((_logprog = calloc(1, PATH_MAX + 1)) == NULL) |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
88 return NULL; |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
89 if (readlink("/proc/self/exe", _logprog, PATH_MAX + 1) == -1) { |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
90 free(_logprog); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
91 _logprog = NULL; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
92 return NULL; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
93 } |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
94 } |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
95 if (_logprog[0] == '[') |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
96 return NULL; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
97 p = strrchr(_logprog, '/'); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
98 if (p == NULL) |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
99 return _logprog; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
100 return p + 1; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
101 } |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
102 #endif |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
103 |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
104 #ifndef SMALL |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
105 /* Write the time, syslog style. month day time - */ |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
106 static int |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
107 logprintdate(FILE *stream) |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
108 { |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
109 struct timeval tv; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
110 time_t now; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
111 struct tm tmnow; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
112 char buf[32]; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
113 |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
114 if (gettimeofday(&tv, NULL) == -1) |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
115 return -1; |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
116 |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
117 now = tv.tv_sec; |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
118 if (localtime_r(&now, &tmnow) == NULL) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
119 return -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
120 if (strftime(buf, sizeof(buf), "%b %d %T ", &tmnow) == 0) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
121 return -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
122 return fprintf(stream, "%s", buf); |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
123 } |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
124 #endif |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
125 |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
126 __printflike(3, 0) static int |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
127 vlogprintf_r(struct logctx *ctx, FILE *stream, const char *fmt, va_list args) |
| 4010 | 128 { |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
129 int len = 0, e; |
| 4010 | 130 va_list a; |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
131 #ifndef SMALL |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
132 bool log_pid; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
133 #ifdef LOGERR_TAG |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
134 bool log_tag; |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
135 #endif |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
136 |
|
5441
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
137 if ((stream == stderr && ctx->log_opts & LOGERR_ERR_DATE) || |
|
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
138 (stream != stderr && ctx->log_opts & LOGERR_LOG_DATE)) |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
139 { |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
140 if ((e = logprintdate(stream)) == -1) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
141 return -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
142 len += e; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
143 } |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
144 |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
145 #ifdef LOGERR_TAG |
|
5441
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
146 log_tag = ((stream == stderr && ctx->log_opts & LOGERR_ERR_TAG) || |
|
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
147 (stream != stderr && ctx->log_opts & LOGERR_LOG_TAG)); |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
148 if (log_tag) { |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
149 if (ctx->log_tag == NULL) |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
150 ctx->log_tag = getprogname(); |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
151 if ((e = fprintf(stream, "%s", ctx->log_tag)) == -1) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
152 return -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
153 len += e; |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
154 } |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
155 #endif |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
156 |
|
5441
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
157 log_pid = ((stream == stderr && ctx->log_opts & LOGERR_ERR_PID) || |
|
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
158 (stream != stderr && ctx->log_opts & LOGERR_LOG_PID)); |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
159 if (log_pid) { |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
160 pid_t pid; |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
161 |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
162 if (ctx->log_pid == 0) |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
163 pid = getpid(); |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
164 else |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
165 pid = ctx->log_pid; |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
166 if ((e = fprintf(stream, "[%d]", pid)) == -1) |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
167 return -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
168 len += e; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
169 } |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
170 |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
171 #ifdef LOGERR_TAG |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
172 if (log_tag || log_pid) |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
173 #else |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
174 if (log_pid) |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
175 #endif |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
176 { |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
177 if ((e = fprintf(stream, ": ")) == -1) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
178 return -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
179 len += e; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
180 } |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
181 #else |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
182 UNUSED(ctx); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
183 #endif |
| 4010 | 184 |
| 185 va_copy(a, args); | |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
186 e = vfprintf(stream, fmt, a); |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
187 if (fputc('\n', stream) == EOF) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
188 e = -1; |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
189 else if (e != -1) |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
190 e++; |
| 4010 | 191 va_end(a); |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
192 |
|
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
193 return e == -1 ? -1 : len + e; |
| 4010 | 194 } |
| 195 | |
| 196 /* | |
| 197 * NetBSD's gcc has been modified to check for the non standard %m in printf | |
| 198 * like functions and warn noisily about it that they should be marked as | |
| 199 * syslog like instead. | |
| 200 * This is all well and good, but our logger also goes via vfprintf and | |
| 201 * when marked as a sysloglike funcion, gcc will then warn us that the | |
| 202 * function should be printflike instead! | |
| 203 * This creates an infinte loop of gcc warnings. | |
| 204 * Until NetBSD solves this issue, we have to disable a gcc diagnostic | |
| 205 * for our fully standards compliant code in the logger function. | |
| 206 */ | |
| 207 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)) | |
| 208 #pragma GCC diagnostic push | |
| 209 #pragma GCC diagnostic ignored "-Wmissing-format-attribute" | |
| 210 #endif | |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
211 __printflike(2, 0) static int |
| 4010 | 212 vlogmessage(int pri, const char *fmt, va_list args) |
| 213 { | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
214 struct logctx *ctx = &_logctx; |
|
4566
defe875f1d89
logerr: Care about fprintf return codes
Roy Marples <roy@marples.name>
parents:
4548
diff
changeset
|
215 int len = 0; |
| 4010 | 216 |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
217 if (ctx->log_fd != -1) { |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
218 char buf[LOGERR_SYSLOGBUF]; |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
219 pid_t pid; |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
220 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
221 memcpy(buf, &pri, sizeof(pri)); |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
222 pid = getpid(); |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
223 memcpy(buf + sizeof(pri), &pid, sizeof(pid)); |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
224 len = vsnprintf(buf + sizeof(pri) + sizeof(pid), |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
225 sizeof(buf) - sizeof(pri) - sizeof(pid), |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
226 fmt, args); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
227 if (len != -1) |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
228 len = (int)write(ctx->log_fd, buf, |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
229 ((size_t)++len) + sizeof(pri) + sizeof(pid)); |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
230 return len; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
231 } |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
232 |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
233 if (ctx->log_opts & LOGERR_ERR && |
|
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
234 (pri <= LOG_ERR || |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
235 (!(ctx->log_opts & LOGERR_QUIET) && pri <= LOG_INFO) || |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
236 (ctx->log_opts & LOGERR_DEBUG && pri <= LOG_DEBUG))) |
|
5441
ff7c7b4799b3
dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor
Roy Marples <roy@marples.name>
parents:
5438
diff
changeset
|
237 len = vlogprintf_r(ctx, stderr, fmt, args); |
| 4010 | 238 |
|
4997
774f445ed677
logging: Always log to syslog(3).
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
239 #ifndef SMALL |
|
774f445ed677
logging: Always log to syslog(3).
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
240 if (ctx->log_file != NULL && |
|
774f445ed677
logging: Always log to syslog(3).
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
241 (pri != LOG_DEBUG || (ctx->log_opts & LOGERR_DEBUG))) |
|
774f445ed677
logging: Always log to syslog(3).
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
242 len = vlogprintf_r(ctx, ctx->log_file, fmt, args); |
|
774f445ed677
logging: Always log to syslog(3).
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
243 #endif |
|
774f445ed677
logging: Always log to syslog(3).
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
244 |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
245 if (ctx->log_opts & LOGERR_LOG) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
246 vsyslog(pri, fmt, args); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
247 |
| 4578 | 248 return len; |
| 4010 | 249 } |
| 250 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)) | |
| 251 #pragma GCC diagnostic pop | |
| 252 #endif | |
| 253 | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
254 __printflike(2, 3) void |
| 4010 | 255 logmessage(int pri, const char *fmt, ...) |
| 256 { | |
| 257 va_list args; | |
| 258 | |
| 259 va_start(args, fmt); | |
| 260 vlogmessage(pri, fmt, args); | |
| 261 va_end(args); | |
| 262 } | |
| 263 | |
| 264 __printflike(2, 0) static void | |
| 265 vlogerrmessage(int pri, const char *fmt, va_list args) | |
| 266 { | |
| 267 int _errno = errno; | |
| 268 char buf[1024]; | |
| 269 | |
| 270 vsnprintf(buf, sizeof(buf), fmt, args); | |
| 271 logmessage(pri, "%s: %s", buf, strerror(_errno)); | |
| 5283 | 272 errno = _errno; |
| 4010 | 273 } |
| 274 | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
275 __printflike(2, 3) void |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
276 logerrmessage(int pri, const char *fmt, ...) |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
277 { |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
278 va_list args; |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
279 |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
280 va_start(args, fmt); |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
281 vlogerrmessage(pri, fmt, args); |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
282 va_end(args); |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
283 } |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
284 |
| 4010 | 285 void |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
286 log_debug(const char *fmt, ...) |
| 4010 | 287 { |
| 288 va_list args; | |
| 289 | |
| 290 va_start(args, fmt); | |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
291 vlogerrmessage(LOG_DEBUG, fmt, args); |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
292 va_end(args); |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
293 } |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
294 |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
295 void |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
296 log_debugx(const char *fmt, ...) |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
297 { |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
298 va_list args; |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
299 |
|
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4022
diff
changeset
|
300 va_start(args, fmt); |
| 4010 | 301 vlogmessage(LOG_DEBUG, fmt, args); |
| 302 va_end(args); | |
| 303 } | |
| 304 | |
| 305 void | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
306 log_info(const char *fmt, ...) |
| 4010 | 307 { |
| 308 va_list args; | |
| 309 | |
| 310 va_start(args, fmt); | |
|
4024
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
311 vlogerrmessage(LOG_INFO, fmt, args); |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
312 va_end(args); |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
313 } |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
314 |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
315 void |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
316 log_infox(const char *fmt, ...) |
|
4024
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
317 { |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
318 va_list args; |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
319 |
|
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
320 va_start(args, fmt); |
| 4010 | 321 vlogmessage(LOG_INFO, fmt, args); |
| 322 va_end(args); | |
| 323 } | |
| 324 | |
| 325 void | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
326 log_warn(const char *fmt, ...) |
| 4010 | 327 { |
| 328 va_list args; | |
| 329 | |
| 330 va_start(args, fmt); | |
| 331 vlogerrmessage(LOG_WARNING, fmt, args); | |
| 332 va_end(args); | |
| 333 } | |
| 334 | |
| 335 void | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
336 log_warnx(const char *fmt, ...) |
| 4010 | 337 { |
| 338 va_list args; | |
| 339 | |
| 340 va_start(args, fmt); | |
| 341 vlogmessage(LOG_WARNING, fmt, args); | |
| 342 va_end(args); | |
| 343 } | |
| 344 | |
| 345 void | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
346 log_err(const char *fmt, ...) |
| 4010 | 347 { |
| 348 va_list args; | |
| 349 | |
| 350 va_start(args, fmt); | |
| 351 vlogerrmessage(LOG_ERR, fmt, args); | |
| 352 va_end(args); | |
| 353 } | |
| 354 | |
| 355 void | |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
4997
diff
changeset
|
356 log_errx(const char *fmt, ...) |
| 4010 | 357 { |
| 358 va_list args; | |
| 359 | |
| 360 va_start(args, fmt); | |
|
4022
b35c56dc40fe
Don't print strerror for logerrx.
Roy Marples <roy@marples.name>
parents:
4021
diff
changeset
|
361 vlogmessage(LOG_ERR, fmt, args); |
| 4010 | 362 va_end(args); |
| 363 } | |
| 364 | |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
365 int |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
366 loggetfd(void) |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
367 { |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
368 struct logctx *ctx = &_logctx; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
369 |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
370 return ctx->log_fd; |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
371 } |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
372 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
373 void |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
374 logsetfd(int fd) |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
375 { |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
376 struct logctx *ctx = &_logctx; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
377 |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
378 ctx->log_fd = fd; |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
379 #ifndef SMALL |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
380 if (fd != -1 && ctx->log_file != NULL) { |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
381 fclose(ctx->log_file); |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
382 ctx->log_file = NULL; |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
383 } |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
384 #endif |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
385 } |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
386 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
387 int |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
388 logreadfd(int fd) |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
389 { |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
390 struct logctx *ctx = &_logctx; |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
391 char buf[LOGERR_SYSLOGBUF]; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
392 int len, pri; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
393 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
394 len = (int)read(fd, buf, sizeof(buf)); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
395 if (len == -1) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
396 return -1; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
397 |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
398 /* Ensure we have pri, pid and a terminator */ |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
399 if (len < (int)(sizeof(pri) + sizeof(pid_t) + 1) || |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
400 buf[len - 1] != '\0') |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
401 { |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
402 errno = EINVAL; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
403 return -1; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
404 } |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
405 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
406 memcpy(&pri, buf, sizeof(pri)); |
|
5526
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
407 memcpy(&ctx->log_pid, buf + sizeof(pri), sizeof(ctx->log_pid)); |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
408 logmessage(pri, "%s", buf + sizeof(pri) + sizeof(ctx->log_pid)); |
|
b1a3d9055662
privsep: Allow logfile reopening in a chroot
Roy Marples <roy@marples.name>
parents:
5525
diff
changeset
|
409 ctx->log_pid = 0; |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
410 return len; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
411 } |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
412 |
|
5077
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
413 unsigned int |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
414 loggetopts(void) |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
415 { |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
416 struct logctx *ctx = &_logctx; |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
417 |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
418 return ctx->log_opts; |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
419 } |
|
16919a390f4d
dhcpcd: don't report forked to background in quiet mode
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
420 |
| 4010 | 421 void |
| 422 logsetopts(unsigned int opts) | |
| 423 { | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
424 struct logctx *ctx = &_logctx; |
| 4010 | 425 |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
426 ctx->log_opts = opts; |
| 4010 | 427 setlogmask(LOG_UPTO(opts & LOGERR_DEBUG ? LOG_DEBUG : LOG_INFO)); |
| 428 } | |
| 429 | |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
430 #ifdef LOGERR_TAG |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
431 void |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
432 logsettag(const char *tag) |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
433 { |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
434 #if !defined(SMALL) |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
435 struct logctx *ctx = &_logctx; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
436 |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
437 ctx->log_tag = tag; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
438 #else |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
439 UNUSED(tag); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
440 #endif |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
441 } |
|
4021
a0e367494ce8
Over engineer the logging some more.
Roy Marples <roy@marples.name>
parents:
4019
diff
changeset
|
442 #endif |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
443 |
| 4010 | 444 int |
| 445 logopen(const char *path) | |
| 446 { | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
447 struct logctx *ctx = &_logctx; |
|
5506
9c7bd8bd8729
privsep: Always try and open syslog
Roy Marples <roy@marples.name>
parents:
5453
diff
changeset
|
448 int opts = 0; |
| 4010 | 449 |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5077
diff
changeset
|
450 /* Cache timezone */ |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5077
diff
changeset
|
451 tzset(); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5077
diff
changeset
|
452 |
|
5347
fabb85fb8e37
logerr: Remove setvbuf diagnostic - it's not critical
Roy Marples <roy@marples.name>
parents:
5326
diff
changeset
|
453 (void)setvbuf(stderr, ctx->log_buf, _IOLBF, sizeof(ctx->log_buf)); |
|
5326
ce2922c1b6dc
logerr: buffer stderr as we now have many processes
Roy Marples <roy@marples.name>
parents:
5283
diff
changeset
|
454 |
|
5506
9c7bd8bd8729
privsep: Always try and open syslog
Roy Marples <roy@marples.name>
parents:
5453
diff
changeset
|
455 if (ctx->log_opts & LOGERR_LOG_PID) |
|
9c7bd8bd8729
privsep: Always try and open syslog
Roy Marples <roy@marples.name>
parents:
5453
diff
changeset
|
456 opts |= LOG_PID; |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
457 openlog(getprogname(), opts, LOGERR_SYSLOG_FACILITY); |
|
5506
9c7bd8bd8729
privsep: Always try and open syslog
Roy Marples <roy@marples.name>
parents:
5453
diff
changeset
|
458 if (path == NULL) |
| 4010 | 459 return 1; |
| 460 | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
461 #ifndef SMALL |
|
5453
fef58462dea6
logerr: Don't leak the logfile stream to scripts
Roy Marples <roy@marples.name>
parents:
5441
diff
changeset
|
462 if ((ctx->log_file = fopen(path, "ae")) == NULL) |
| 4010 | 463 return -1; |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
464 setlinebuf(ctx->log_file); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
465 return fileno(ctx->log_file); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
466 #else |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
467 errno = ENOTSUP; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
468 return -1; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
469 #endif |
| 4010 | 470 } |
| 471 | |
| 472 void | |
| 4017 | 473 logclose(void) |
| 4010 | 474 { |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
475 #ifndef SMALL |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
476 struct logctx *ctx = &_logctx; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
477 #endif |
| 4010 | 478 |
| 479 closelog(); | |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
480 #ifndef SMALL |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
481 if (ctx->log_file == NULL) |
| 4010 | 482 return; |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
483 fclose(ctx->log_file); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
484 ctx->log_file = NULL; |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
485 #endif |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5506
diff
changeset
|
486 #if defined(__linux__) |
|
4019
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
487 free(_logprog); |
|
fe2f1ad133a2
Write syslog entries in logfile:
Roy Marples <roy@marples.name>
parents:
4017
diff
changeset
|
488 #endif |
| 4010 | 489 } |
