1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2011 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include <sys/epoll.h>
25 #include <sys/socket.h>
29 #include "sd-messages.h"
33 #include "formats-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 struct iovec iovec
[5];
51 char header_priority
[DECIMAL_STR_MAX(priority
) + 3],
52 header_pid
[sizeof("[]: ")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
54 char *ident_buf
= NULL
;
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_SET_STRING(iovec
[n
++], 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_SET_STRING(iovec
[n
++], identifier
);
87 IOVEC_SET_STRING(iovec
[n
++], header_pid
);
88 } else if (identifier
) {
89 IOVEC_SET_STRING(iovec
[n
++], identifier
);
90 IOVEC_SET_STRING(iovec
[n
++], ": ");
94 IOVEC_SET_STRING(iovec
[n
++], message
);
95 IOVEC_SET_STRING(iovec
[n
++], "\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");
103 static bool is_us(const char *pid
) {
108 if (parse_pid(pid
, &t
) < 0)
111 return t
== getpid();
114 static void dev_kmsg_record(Server
*s
, const char *p
, size_t l
) {
115 struct iovec iovec
[N_IOVEC_META_FIELDS
+ 7 + N_IOVEC_KERNEL_FIELDS
+ 2 + N_IOVEC_UDEV_FIELDS
];
116 char *message
= NULL
, *syslog_priority
= NULL
, *syslog_pid
= NULL
, *syslog_facility
= NULL
, *syslog_identifier
= NULL
, *source_time
= NULL
;
118 unsigned n
= 0, z
= 0, j
;
119 unsigned long long usec
;
120 char *identifier
= NULL
, *pid
= NULL
, *e
, *f
, *k
;
123 char *kernel_device
= NULL
;
131 e
= memchr(p
, ',', l
);
136 r
= safe_atoi(p
, &priority
);
137 if (r
< 0 || priority
< 0 || priority
> 999)
140 if (s
->forward_to_kmsg
&& (priority
& LOG_FACMASK
) != LOG_KERN
)
145 e
= memchr(p
, ',', l
);
150 r
= safe_atou64(p
, &serial
);
154 if (s
->kernel_seqnum
) {
155 /* We already read this one? */
156 if (serial
< *s
->kernel_seqnum
)
159 /* Did we lose any? */
160 if (serial
> *s
->kernel_seqnum
)
161 server_driver_message(s
, SD_MESSAGE_JOURNAL_MISSED
, "Missed %"PRIu64
" kernel messages",
162 serial
- *s
->kernel_seqnum
);
164 /* Make sure we never read this one again. Note that
165 * we always store the next message serial we expect
166 * here, simply because this makes handling the first
167 * message with serial 0 easy. */
168 *s
->kernel_seqnum
= serial
+ 1;
173 f
= memchr(p
, ';', l
);
176 /* Kernel 3.6 has the flags field, kernel 3.5 lacks that */
177 e
= memchr(p
, ',', l
);
182 r
= safe_atollu(p
, &usec
);
188 e
= memchr(p
, '\n', l
);
197 for (j
= 0; l
> 0 && j
< N_IOVEC_KERNEL_FIELDS
; j
++) {
199 /* Metadata fields attached */
206 e
= memchr(k
, '\n', l
);
212 if (cunescape_length_with_prefix(k
, e
- k
, "_KERNEL_", UNESCAPE_RELAX
, &m
) < 0)
215 if (startswith(m
, "_KERNEL_DEVICE="))
216 kernel_device
= m
+ 15;
218 IOVEC_SET_STRING(iovec
[n
++], m
);
226 struct udev_device
*ud
;
228 ud
= udev_device_new_from_device_id(s
->udev
, kernel_device
);
231 struct udev_list_entry
*ll
;
234 g
= udev_device_get_devnode(ud
);
236 b
= strappend("_UDEV_DEVNODE=", g
);
238 IOVEC_SET_STRING(iovec
[n
++], b
);
243 g
= udev_device_get_sysname(ud
);
245 b
= strappend("_UDEV_SYSNAME=", g
);
247 IOVEC_SET_STRING(iovec
[n
++], b
);
253 ll
= udev_device_get_devlinks_list_entry(ud
);
254 udev_list_entry_foreach(ll
, ll
) {
256 if (j
> N_IOVEC_UDEV_FIELDS
)
259 g
= udev_list_entry_get_name(ll
);
261 b
= strappend("_UDEV_DEVLINK=", g
);
263 IOVEC_SET_STRING(iovec
[n
++], b
);
271 udev_device_unref(ud
);
275 if (asprintf(&source_time
, "_SOURCE_MONOTONIC_TIMESTAMP=%llu", usec
) >= 0)
276 IOVEC_SET_STRING(iovec
[n
++], source_time
);
278 IOVEC_SET_STRING(iovec
[n
++], "_TRANSPORT=kernel");
280 if (asprintf(&syslog_priority
, "PRIORITY=%i", priority
& LOG_PRIMASK
) >= 0)
281 IOVEC_SET_STRING(iovec
[n
++], syslog_priority
);
283 if (asprintf(&syslog_facility
, "SYSLOG_FACILITY=%i", LOG_FAC(priority
)) >= 0)
284 IOVEC_SET_STRING(iovec
[n
++], syslog_facility
);
286 if ((priority
& LOG_FACMASK
) == LOG_KERN
)
287 IOVEC_SET_STRING(iovec
[n
++], "SYSLOG_IDENTIFIER=kernel");
289 pl
-= syslog_parse_identifier((const char**) &p
, &identifier
, &pid
);
291 /* Avoid any messages we generated ourselves via
292 * log_info() and friends. */
293 if (pid
&& is_us(pid
))
297 syslog_identifier
= strappend("SYSLOG_IDENTIFIER=", identifier
);
298 if (syslog_identifier
)
299 IOVEC_SET_STRING(iovec
[n
++], syslog_identifier
);
303 syslog_pid
= strappend("SYSLOG_PID=", pid
);
305 IOVEC_SET_STRING(iovec
[n
++], syslog_pid
);
309 if (cunescape_length_with_prefix(p
, pl
, "MESSAGE=", UNESCAPE_RELAX
, &message
) >= 0)
310 IOVEC_SET_STRING(iovec
[n
++], message
);
312 server_dispatch_message(s
, iovec
, n
, ELEMENTSOF(iovec
), NULL
, NULL
, NULL
, 0, NULL
, priority
, 0);
315 for (j
= 0; j
< z
; j
++)
316 free(iovec
[j
].iov_base
);
319 free(syslog_priority
);
320 free(syslog_identifier
);
322 free(syslog_facility
);
328 static int server_read_dev_kmsg(Server
*s
) {
329 char buffer
[8192+1]; /* the kernel-side limit per record is 8K currently */
333 assert(s
->dev_kmsg_fd
>= 0);
335 l
= read(s
->dev_kmsg_fd
, buffer
, sizeof(buffer
) - 1);
339 /* Old kernels who don't allow reading from /dev/kmsg
340 * return EINVAL when we try. So handle this cleanly,
341 * but don' try to ever read from it again. */
342 if (errno
== EINVAL
) {
343 s
->dev_kmsg_event_source
= sd_event_source_unref(s
->dev_kmsg_event_source
);
347 if (errno
== EAGAIN
|| errno
== EINTR
|| errno
== EPIPE
)
350 log_error_errno(errno
, "Failed to read from kernel: %m");
354 dev_kmsg_record(s
, buffer
, l
);
358 int server_flush_dev_kmsg(Server
*s
) {
363 if (s
->dev_kmsg_fd
< 0)
366 if (!s
->dev_kmsg_readable
)
369 log_debug("Flushing /dev/kmsg...");
372 r
= server_read_dev_kmsg(s
);
383 static int dispatch_dev_kmsg(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
384 Server
*s
= userdata
;
387 assert(fd
== s
->dev_kmsg_fd
);
390 if (revents
& EPOLLERR
)
391 log_warning("/dev/kmsg buffer overrun, some messages lost.");
393 if (!(revents
& EPOLLIN
))
394 log_error("Got invalid event from epoll for /dev/kmsg: %"PRIx32
, revents
);
396 return server_read_dev_kmsg(s
);
399 int server_open_dev_kmsg(Server
*s
) {
404 s
->dev_kmsg_fd
= open("/dev/kmsg", O_RDWR
|O_CLOEXEC
|O_NONBLOCK
|O_NOCTTY
);
405 if (s
->dev_kmsg_fd
< 0) {
406 log_full(errno
== ENOENT
? LOG_DEBUG
: LOG_WARNING
,
407 "Failed to open /dev/kmsg, ignoring: %m");
411 r
= sd_event_add_io(s
->event
, &s
->dev_kmsg_event_source
, s
->dev_kmsg_fd
, EPOLLIN
, dispatch_dev_kmsg
, s
);
414 /* This will fail with EPERM on older kernels where
415 * /dev/kmsg is not readable. */
421 log_error_errno(r
, "Failed to add /dev/kmsg fd to event loop: %m");
425 r
= sd_event_source_set_priority(s
->dev_kmsg_event_source
, SD_EVENT_PRIORITY_IMPORTANT
+10);
427 log_error_errno(r
, "Failed to adjust priority of kmsg event source: %m");
431 s
->dev_kmsg_readable
= true;
436 s
->dev_kmsg_event_source
= sd_event_source_unref(s
->dev_kmsg_event_source
);
437 s
->dev_kmsg_fd
= safe_close(s
->dev_kmsg_fd
);
442 int server_open_kernel_seqnum(Server
*s
) {
443 _cleanup_close_
int fd
;
448 /* We store the seqnum we last read in an mmaped file. That
449 * way we can just use it like a variable, but it is
450 * persistent and automatically flushed at reboot. */
452 fd
= open("/run/systemd/journal/kernel-seqnum", O_RDWR
|O_CREAT
|O_CLOEXEC
|O_NOCTTY
|O_NOFOLLOW
, 0644);
454 log_error_errno(errno
, "Failed to open /run/systemd/journal/kernel-seqnum, ignoring: %m");
458 if (posix_fallocate(fd
, 0, sizeof(uint64_t)) < 0) {
459 log_error_errno(errno
, "Failed to allocate sequential number file, ignoring: %m");
463 p
= mmap(NULL
, sizeof(uint64_t), PROT_READ
|PROT_WRITE
, MAP_SHARED
, fd
, 0);
464 if (p
== MAP_FAILED
) {
465 log_error_errno(errno
, "Failed to map sequential number file, ignoring: %m");
469 s
->kernel_seqnum
= p
;