1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2011 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/epoll.h>
24 #include <sys/socket.h>
28 #include "sd-messages.h"
30 #include "alloc-util.h"
33 #include "format-util.h"
35 #include "journald-kmsg.h"
36 #include "journald-server.h"
37 #include "journald-syslog.h"
38 #include "parse-util.h"
39 #include "process-util.h"
40 #include "stdio-util.h"
41 #include "string-util.h"
43 void server_forward_kmsg(
46 const char *identifier
,
48 const struct ucred
*ucred
) {
50 _cleanup_free_
char *ident_buf
= NULL
;
51 struct iovec iovec
[5];
52 char header_priority
[DECIMAL_STR_MAX(priority
) + 3],
53 header_pid
[sizeof("[]: ")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
57 assert(priority
>= 0);
58 assert(priority
<= 999);
61 if (_unlikely_(LOG_PRI(priority
) > s
->max_level_kmsg
))
64 if (_unlikely_(s
->dev_kmsg_fd
< 0))
67 /* Never allow messages with kernel facility to be written to
68 * kmsg, regardless where the data comes from. */
69 priority
= syslog_fixup_facility(priority
);
71 /* First: priority field */
72 xsprintf(header_priority
, "<%i>", priority
);
73 iovec
[n
++] = IOVEC_MAKE_STRING(header_priority
);
75 /* Second: identifier and PID */
78 get_process_comm(ucred
->pid
, &ident_buf
);
79 identifier
= ident_buf
;
82 xsprintf(header_pid
, "["PID_FMT
"]: ", ucred
->pid
);
85 iovec
[n
++] = IOVEC_MAKE_STRING(identifier
);
87 iovec
[n
++] = IOVEC_MAKE_STRING(header_pid
);
88 } else if (identifier
) {
89 iovec
[n
++] = IOVEC_MAKE_STRING(identifier
);
90 iovec
[n
++] = IOVEC_MAKE_STRING(": ");
94 iovec
[n
++] = IOVEC_MAKE_STRING(message
);
95 iovec
[n
++] = IOVEC_MAKE_STRING("\n");
97 if (writev(s
->dev_kmsg_fd
, iovec
, n
) < 0)
98 log_debug_errno(errno
, "Failed to write to /dev/kmsg for logging: %m");
101 static bool is_us(const char *pid
) {
106 if (parse_pid(pid
, &t
) < 0)
109 return t
== getpid_cached();
112 static void dev_kmsg_record(Server
*s
, const char *p
, size_t l
) {
114 _cleanup_free_
char *message
= NULL
, *syslog_priority
= NULL
, *syslog_pid
= NULL
, *syslog_facility
= NULL
, *syslog_identifier
= NULL
, *source_time
= NULL
, *identifier
= NULL
, *pid
= NULL
;
115 struct iovec iovec
[N_IOVEC_META_FIELDS
+ 7 + N_IOVEC_KERNEL_FIELDS
+ 2 + N_IOVEC_UDEV_FIELDS
];
116 char *kernel_device
= NULL
;
117 unsigned long long usec
;
118 size_t n
= 0, z
= 0, j
;
130 e
= memchr(p
, ',', l
);
135 r
= safe_atoi(p
, &priority
);
136 if (r
< 0 || priority
< 0 || priority
> 999)
139 if (s
->forward_to_kmsg
&& (priority
& LOG_FACMASK
) != LOG_KERN
)
144 e
= memchr(p
, ',', l
);
149 r
= safe_atou64(p
, &serial
);
153 if (s
->kernel_seqnum
) {
154 /* We already read this one? */
155 if (serial
< *s
->kernel_seqnum
)
158 /* Did we lose any? */
159 if (serial
> *s
->kernel_seqnum
)
160 server_driver_message(s
, 0,
161 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_MISSED_STR
,
162 LOG_MESSAGE("Missed %"PRIu64
" kernel messages",
163 serial
- *s
->kernel_seqnum
),
166 /* Make sure we never read this one again. Note that
167 * we always store the next message serial we expect
168 * here, simply because this makes handling the first
169 * message with serial 0 easy. */
170 *s
->kernel_seqnum
= serial
+ 1;
175 f
= memchr(p
, ';', l
);
178 /* Kernel 3.6 has the flags field, kernel 3.5 lacks that */
179 e
= memchr(p
, ',', l
);
184 r
= safe_atollu(p
, &usec
);
190 e
= memchr(p
, '\n', l
);
199 for (j
= 0; l
> 0 && j
< N_IOVEC_KERNEL_FIELDS
; j
++) {
201 /* Metadata fields attached */
208 e
= memchr(k
, '\n', l
);
214 if (cunescape_length_with_prefix(k
, e
- k
, "_KERNEL_", UNESCAPE_RELAX
, &m
) < 0)
217 if (startswith(m
, "_KERNEL_DEVICE="))
218 kernel_device
= m
+ 15;
220 iovec
[n
++] = IOVEC_MAKE_STRING(m
);
228 struct udev_device
*ud
;
230 ud
= udev_device_new_from_device_id(s
->udev
, kernel_device
);
233 struct udev_list_entry
*ll
;
236 g
= udev_device_get_devnode(ud
);
238 b
= strappend("_UDEV_DEVNODE=", g
);
240 iovec
[n
++] = IOVEC_MAKE_STRING(b
);
245 g
= udev_device_get_sysname(ud
);
247 b
= strappend("_UDEV_SYSNAME=", g
);
249 iovec
[n
++] = IOVEC_MAKE_STRING(b
);
255 ll
= udev_device_get_devlinks_list_entry(ud
);
256 udev_list_entry_foreach(ll
, ll
) {
258 if (j
> N_IOVEC_UDEV_FIELDS
)
261 g
= udev_list_entry_get_name(ll
);
263 b
= strappend("_UDEV_DEVLINK=", g
);
265 iovec
[n
++] = IOVEC_MAKE_STRING(b
);
273 udev_device_unref(ud
);
277 if (asprintf(&source_time
, "_SOURCE_MONOTONIC_TIMESTAMP=%llu", usec
) >= 0)
278 iovec
[n
++] = IOVEC_MAKE_STRING(source_time
);
280 iovec
[n
++] = IOVEC_MAKE_STRING("_TRANSPORT=kernel");
282 if (asprintf(&syslog_priority
, "PRIORITY=%i", priority
& LOG_PRIMASK
) >= 0)
283 iovec
[n
++] = IOVEC_MAKE_STRING(syslog_priority
);
285 if (asprintf(&syslog_facility
, "SYSLOG_FACILITY=%i", LOG_FAC(priority
)) >= 0)
286 iovec
[n
++] = IOVEC_MAKE_STRING(syslog_facility
);
288 if ((priority
& LOG_FACMASK
) == LOG_KERN
)
289 iovec
[n
++] = IOVEC_MAKE_STRING("SYSLOG_IDENTIFIER=kernel");
291 pl
-= syslog_parse_identifier((const char**) &p
, &identifier
, &pid
);
293 /* Avoid any messages we generated ourselves via
294 * log_info() and friends. */
295 if (pid
&& is_us(pid
))
299 syslog_identifier
= strappend("SYSLOG_IDENTIFIER=", identifier
);
300 if (syslog_identifier
)
301 iovec
[n
++] = IOVEC_MAKE_STRING(syslog_identifier
);
305 syslog_pid
= strappend("SYSLOG_PID=", pid
);
307 iovec
[n
++] = IOVEC_MAKE_STRING(syslog_pid
);
311 if (cunescape_length_with_prefix(p
, pl
, "MESSAGE=", UNESCAPE_RELAX
, &message
) >= 0)
312 iovec
[n
++] = IOVEC_MAKE_STRING(message
);
314 server_dispatch_message(s
, iovec
, n
, ELEMENTSOF(iovec
), NULL
, NULL
, priority
, 0);
317 for (j
= 0; j
< z
; j
++)
318 free(iovec
[j
].iov_base
);
321 static int server_read_dev_kmsg(Server
*s
) {
322 char buffer
[8192+1]; /* the kernel-side limit per record is 8K currently */
326 assert(s
->dev_kmsg_fd
>= 0);
328 l
= read(s
->dev_kmsg_fd
, buffer
, sizeof(buffer
) - 1);
332 /* Old kernels who don't allow reading from /dev/kmsg
333 * return EINVAL when we try. So handle this cleanly,
334 * but don' try to ever read from it again. */
335 if (errno
== EINVAL
) {
336 s
->dev_kmsg_event_source
= sd_event_source_unref(s
->dev_kmsg_event_source
);
340 if (IN_SET(errno
, EAGAIN
, EINTR
, EPIPE
))
343 return log_error_errno(errno
, "Failed to read from kernel: %m");
346 dev_kmsg_record(s
, buffer
, l
);
350 int server_flush_dev_kmsg(Server
*s
) {
355 if (s
->dev_kmsg_fd
< 0)
358 if (!s
->dev_kmsg_readable
)
361 log_debug("Flushing /dev/kmsg...");
364 r
= server_read_dev_kmsg(s
);
375 static int dispatch_dev_kmsg(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
376 Server
*s
= userdata
;
379 assert(fd
== s
->dev_kmsg_fd
);
382 if (revents
& EPOLLERR
)
383 log_warning("/dev/kmsg buffer overrun, some messages lost.");
385 if (!(revents
& EPOLLIN
))
386 log_error("Got invalid event from epoll for /dev/kmsg: %"PRIx32
, revents
);
388 return server_read_dev_kmsg(s
);
391 int server_open_dev_kmsg(Server
*s
) {
398 mode
= O_RDWR
|O_CLOEXEC
|O_NONBLOCK
|O_NOCTTY
;
400 mode
= O_WRONLY
|O_CLOEXEC
|O_NONBLOCK
|O_NOCTTY
;
402 s
->dev_kmsg_fd
= open("/dev/kmsg", mode
);
403 if (s
->dev_kmsg_fd
< 0) {
404 log_full(errno
== ENOENT
? LOG_DEBUG
: LOG_WARNING
,
405 "Failed to open /dev/kmsg, ignoring: %m");
412 r
= sd_event_add_io(s
->event
, &s
->dev_kmsg_event_source
, s
->dev_kmsg_fd
, EPOLLIN
, dispatch_dev_kmsg
, s
);
415 /* This will fail with EPERM on older kernels where
416 * /dev/kmsg is not readable. */
422 log_error_errno(r
, "Failed to add /dev/kmsg fd to event loop: %m");
426 r
= sd_event_source_set_priority(s
->dev_kmsg_event_source
, SD_EVENT_PRIORITY_IMPORTANT
+10);
428 log_error_errno(r
, "Failed to adjust priority of kmsg event source: %m");
432 s
->dev_kmsg_readable
= true;
437 s
->dev_kmsg_event_source
= sd_event_source_unref(s
->dev_kmsg_event_source
);
438 s
->dev_kmsg_fd
= safe_close(s
->dev_kmsg_fd
);
443 int server_open_kernel_seqnum(Server
*s
) {
444 _cleanup_close_
int fd
;
450 /* We store the seqnum we last read in an mmaped file. That
451 * way we can just use it like a variable, but it is
452 * persistent and automatically flushed at reboot. */
454 fd
= open("/run/systemd/journal/kernel-seqnum", O_RDWR
|O_CREAT
|O_CLOEXEC
|O_NOCTTY
|O_NOFOLLOW
, 0644);
456 log_error_errno(errno
, "Failed to open /run/systemd/journal/kernel-seqnum, ignoring: %m");
460 r
= posix_fallocate(fd
, 0, sizeof(uint64_t));
462 log_error_errno(r
, "Failed to allocate sequential number file, ignoring: %m");
466 p
= mmap(NULL
, sizeof(uint64_t), PROT_READ
|PROT_WRITE
, MAP_SHARED
, fd
, 0);
467 if (p
== MAP_FAILED
) {
468 log_error_errno(errno
, "Failed to map sequential number file, ignoring: %m");
472 s
->kernel_seqnum
= p
;