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>
26 #include <sys/socket.h>
28 #include "systemd/sd-messages.h"
31 #include "journald-server.h"
32 #include "journald-kmsg.h"
33 #include "journald-syslog.h"
34 #include "formats-util.h"
36 void server_forward_kmsg(
39 const char *identifier
,
41 const struct ucred
*ucred
) {
43 struct iovec iovec
[5];
44 char header_priority
[DECIMAL_STR_MAX(priority
) + 3],
45 header_pid
[sizeof("[]: ")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
47 char *ident_buf
= NULL
;
50 assert(priority
>= 0);
51 assert(priority
<= 999);
54 if (_unlikely_(LOG_PRI(priority
) > s
->max_level_kmsg
))
57 if (_unlikely_(s
->dev_kmsg_fd
< 0))
60 /* Never allow messages with kernel facility to be written to
61 * kmsg, regardless where the data comes from. */
62 priority
= syslog_fixup_facility(priority
);
64 /* First: priority field */
65 xsprintf(header_priority
, "<%i>", priority
);
66 IOVEC_SET_STRING(iovec
[n
++], header_priority
);
68 /* Second: identifier and PID */
71 get_process_comm(ucred
->pid
, &ident_buf
);
72 identifier
= ident_buf
;
75 xsprintf(header_pid
, "["PID_FMT
"]: ", ucred
->pid
);
78 IOVEC_SET_STRING(iovec
[n
++], identifier
);
80 IOVEC_SET_STRING(iovec
[n
++], header_pid
);
81 } else if (identifier
) {
82 IOVEC_SET_STRING(iovec
[n
++], identifier
);
83 IOVEC_SET_STRING(iovec
[n
++], ": ");
87 IOVEC_SET_STRING(iovec
[n
++], message
);
88 IOVEC_SET_STRING(iovec
[n
++], "\n");
90 if (writev(s
->dev_kmsg_fd
, iovec
, n
) < 0)
91 log_debug_errno(errno
, "Failed to write to /dev/kmsg for logging: %m");
96 static bool is_us(const char *pid
) {
101 if (parse_pid(pid
, &t
) < 0)
104 return t
== getpid();
107 static void dev_kmsg_record(Server
*s
, const char *p
, size_t l
) {
108 struct iovec iovec
[N_IOVEC_META_FIELDS
+ 7 + N_IOVEC_KERNEL_FIELDS
+ 2 + N_IOVEC_UDEV_FIELDS
];
109 char *message
= NULL
, *syslog_priority
= NULL
, *syslog_pid
= NULL
, *syslog_facility
= NULL
, *syslog_identifier
= NULL
, *source_time
= NULL
;
111 unsigned n
= 0, z
= 0, j
;
112 unsigned long long usec
;
113 char *identifier
= NULL
, *pid
= NULL
, *e
, *f
, *k
;
116 char *kernel_device
= NULL
;
124 e
= memchr(p
, ',', l
);
129 r
= safe_atoi(p
, &priority
);
130 if (r
< 0 || priority
< 0 || priority
> 999)
133 if (s
->forward_to_kmsg
&& (priority
& LOG_FACMASK
) != LOG_KERN
)
138 e
= memchr(p
, ',', l
);
143 r
= safe_atou64(p
, &serial
);
147 if (s
->kernel_seqnum
) {
148 /* We already read this one? */
149 if (serial
< *s
->kernel_seqnum
)
152 /* Did we lose any? */
153 if (serial
> *s
->kernel_seqnum
)
154 server_driver_message(s
, SD_MESSAGE_JOURNAL_MISSED
, "Missed %"PRIu64
" kernel messages",
155 serial
- *s
->kernel_seqnum
);
157 /* Make sure we never read this one again. Note that
158 * we always store the next message serial we expect
159 * here, simply because this makes handling the first
160 * message with serial 0 easy. */
161 *s
->kernel_seqnum
= serial
+ 1;
166 f
= memchr(p
, ';', l
);
169 /* Kernel 3.6 has the flags field, kernel 3.5 lacks that */
170 e
= memchr(p
, ',', l
);
175 r
= safe_atollu(p
, &usec
);
181 e
= memchr(p
, '\n', l
);
190 for (j
= 0; l
> 0 && j
< N_IOVEC_KERNEL_FIELDS
; j
++) {
192 /* Meta data fields attached */
199 e
= memchr(k
, '\n', l
);
205 if (cunescape_length_with_prefix(k
, e
- k
, "_KERNEL_", UNESCAPE_RELAX
, &m
) < 0)
208 if (startswith(m
, "_KERNEL_DEVICE="))
209 kernel_device
= m
+ 15;
211 IOVEC_SET_STRING(iovec
[n
++], m
);
219 struct udev_device
*ud
;
221 ud
= udev_device_new_from_device_id(s
->udev
, kernel_device
);
224 struct udev_list_entry
*ll
;
227 g
= udev_device_get_devnode(ud
);
229 b
= strappend("_UDEV_DEVNODE=", g
);
231 IOVEC_SET_STRING(iovec
[n
++], b
);
236 g
= udev_device_get_sysname(ud
);
238 b
= strappend("_UDEV_SYSNAME=", g
);
240 IOVEC_SET_STRING(iovec
[n
++], b
);
246 ll
= udev_device_get_devlinks_list_entry(ud
);
247 udev_list_entry_foreach(ll
, ll
) {
249 if (j
> N_IOVEC_UDEV_FIELDS
)
252 g
= udev_list_entry_get_name(ll
);
254 b
= strappend("_UDEV_DEVLINK=", g
);
256 IOVEC_SET_STRING(iovec
[n
++], b
);
264 udev_device_unref(ud
);
268 if (asprintf(&source_time
, "_SOURCE_MONOTONIC_TIMESTAMP=%llu", usec
) >= 0)
269 IOVEC_SET_STRING(iovec
[n
++], source_time
);
271 IOVEC_SET_STRING(iovec
[n
++], "_TRANSPORT=kernel");
273 if (asprintf(&syslog_priority
, "PRIORITY=%i", priority
& LOG_PRIMASK
) >= 0)
274 IOVEC_SET_STRING(iovec
[n
++], syslog_priority
);
276 if (asprintf(&syslog_facility
, "SYSLOG_FACILITY=%i", LOG_FAC(priority
)) >= 0)
277 IOVEC_SET_STRING(iovec
[n
++], syslog_facility
);
279 if ((priority
& LOG_FACMASK
) == LOG_KERN
)
280 IOVEC_SET_STRING(iovec
[n
++], "SYSLOG_IDENTIFIER=kernel");
282 pl
-= syslog_parse_identifier((const char**) &p
, &identifier
, &pid
);
284 /* Avoid any messages we generated ourselves via
285 * log_info() and friends. */
286 if (pid
&& is_us(pid
))
290 syslog_identifier
= strappend("SYSLOG_IDENTIFIER=", identifier
);
291 if (syslog_identifier
)
292 IOVEC_SET_STRING(iovec
[n
++], syslog_identifier
);
296 syslog_pid
= strappend("SYSLOG_PID=", pid
);
298 IOVEC_SET_STRING(iovec
[n
++], syslog_pid
);
302 if (cunescape_length_with_prefix(p
, pl
, "MESSAGE=", UNESCAPE_RELAX
, &message
) >= 0)
303 IOVEC_SET_STRING(iovec
[n
++], message
);
305 server_dispatch_message(s
, iovec
, n
, ELEMENTSOF(iovec
), NULL
, NULL
, NULL
, 0, NULL
, priority
, 0);
308 for (j
= 0; j
< z
; j
++)
309 free(iovec
[j
].iov_base
);
312 free(syslog_priority
);
313 free(syslog_identifier
);
315 free(syslog_facility
);
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 (errno
== EAGAIN
|| errno
== EINTR
|| errno
== EPIPE
)
343 log_error_errno(errno
, "Failed to read from kernel: %m");
347 dev_kmsg_record(s
, buffer
, l
);
351 int server_flush_dev_kmsg(Server
*s
) {
356 if (s
->dev_kmsg_fd
< 0)
359 if (!s
->dev_kmsg_readable
)
362 log_debug("Flushing /dev/kmsg...");
365 r
= server_read_dev_kmsg(s
);
376 static int dispatch_dev_kmsg(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
377 Server
*s
= userdata
;
380 assert(fd
== s
->dev_kmsg_fd
);
383 if (revents
& EPOLLERR
)
384 log_warning("/dev/kmsg buffer overrun, some messages lost.");
386 if (!(revents
& EPOLLIN
))
387 log_error("Got invalid event from epoll for /dev/kmsg: %"PRIx32
, revents
);
389 return server_read_dev_kmsg(s
);
392 int server_open_dev_kmsg(Server
*s
) {
397 s
->dev_kmsg_fd
= open("/dev/kmsg", O_RDWR
|O_CLOEXEC
|O_NONBLOCK
|O_NOCTTY
);
398 if (s
->dev_kmsg_fd
< 0) {
399 log_full(errno
== ENOENT
? LOG_DEBUG
: LOG_WARNING
,
400 "Failed to open /dev/kmsg, ignoring: %m");
404 r
= sd_event_add_io(s
->event
, &s
->dev_kmsg_event_source
, s
->dev_kmsg_fd
, EPOLLIN
, dispatch_dev_kmsg
, s
);
407 /* This will fail with EPERM on older kernels where
408 * /dev/kmsg is not readable. */
414 log_error_errno(r
, "Failed to add /dev/kmsg fd to event loop: %m");
418 r
= sd_event_source_set_priority(s
->dev_kmsg_event_source
, SD_EVENT_PRIORITY_IMPORTANT
+10);
420 log_error_errno(r
, "Failed to adjust priority of kmsg event source: %m");
424 s
->dev_kmsg_readable
= true;
429 s
->dev_kmsg_event_source
= sd_event_source_unref(s
->dev_kmsg_event_source
);
430 s
->dev_kmsg_fd
= safe_close(s
->dev_kmsg_fd
);
435 int server_open_kernel_seqnum(Server
*s
) {
436 _cleanup_close_
int fd
;
441 /* We store the seqnum we last read in an mmaped file. That
442 * way we can just use it like a variable, but it is
443 * persistent and automatically flushed at reboot. */
445 fd
= open("/run/systemd/journal/kernel-seqnum", O_RDWR
|O_CREAT
|O_CLOEXEC
|O_NOCTTY
|O_NOFOLLOW
, 0644);
447 log_error_errno(errno
, "Failed to open /run/systemd/journal/kernel-seqnum, ignoring: %m");
451 if (posix_fallocate(fd
, 0, sizeof(uint64_t)) < 0) {
452 log_error_errno(errno
, "Failed to allocate sequential number file, ignoring: %m");
456 p
= mmap(NULL
, sizeof(uint64_t), PROT_READ
|PROT_WRITE
, MAP_SHARED
, fd
, 0);
457 if (p
== MAP_FAILED
) {
458 log_error_errno(errno
, "Failed to map sequential number file, ignoring: %m");
462 s
->kernel_seqnum
= p
;