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>
27 #include <systemd/sd-messages.h>
31 #include "journald-kmsg.h"
33 void server_forward_kmsg(
36 const char *identifier,
38 struct ucred *ucred) {
40 struct iovec iovec[5];
41 char header_priority[6], header_pid[16];
43 char *ident_buf = NULL;
46 assert(priority >= 0);
47 assert(priority <= 999);
50 if (_unlikely_(LOG_PRI(priority) > s->max_level_kmsg))
53 if (_unlikely_(s->dev_kmsg_fd < 0))
56 /* Never allow messages with kernel facility to be written to
57 * kmsg, regardless where the data comes from. */
58 priority = syslog_fixup_facility(priority);
60 /* First: priority field */
61 snprintf(header_priority, sizeof(header_priority), "<%i>", priority);
62 char_array_0(header_priority);
63 IOVEC_SET_STRING(iovec[n++], header_priority);
65 /* Second: identifier and PID */
68 get_process_comm(ucred->pid, &ident_buf);
69 identifier = ident_buf;
72 snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid);
73 char_array_0(header_pid);
76 IOVEC_SET_STRING(iovec[n++], identifier);
78 IOVEC_SET_STRING(iovec[n++], header_pid);
79 } else if (identifier) {
80 IOVEC_SET_STRING(iovec[n++], identifier);
81 IOVEC_SET_STRING(iovec[n++], ": ");
85 IOVEC_SET_STRING(iovec[n++], message);
86 IOVEC_SET_STRING(iovec[n++], "\n");
88 if (writev(s->dev_kmsg_fd, iovec, n) < 0)
89 log_debug("Failed to write to /dev/kmsg for logging: %s", strerror(errno));
94 static bool is_us(const char *pid) {
99 if (parse_pid(pid, &t) < 0)
102 return t == getpid();
105 static void dev_kmsg_record(Server *s, char *p, size_t l) {
106 struct iovec iovec[N_IOVEC_META_FIELDS + 7 + N_IOVEC_KERNEL_FIELDS + 2 + N_IOVEC_UDEV_FIELDS];
107 char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL;
109 unsigned n = 0, z = 0, j;
111 char *identifier = NULL, *pid = NULL, *e, *f, *k;
114 char *kernel_device = NULL;
122 e = memchr(p, ',', l);
127 r = safe_atoi(p, &priority);
128 if (r < 0 || priority < 0 || priority > 999)
131 if (s->forward_to_kmsg && (priority & LOG_FACMASK) != LOG_KERN)
136 e = memchr(p, ',', l);
141 r = safe_atou64(p, &serial);
145 if (s->kernel_seqnum) {
146 /* We already read this one? */
147 if (serial < *s->kernel_seqnum)
150 /* Did we lose any? */
151 if (serial > *s->kernel_seqnum)
152 server_driver_message(s, SD_MESSAGE_JOURNAL_MISSED, "Missed %llu kernel messages", (unsigned long long) serial - *s->kernel_seqnum - 1);
154 /* Make sure we never read this one again. Note that
155 * we always store the next message serial we expect
156 * here, simply because this makes handling the first
157 * message with serial 0 easy. */
158 *s->kernel_seqnum = serial + 1;
163 f = memchr(p, ';', l);
166 /* Kernel 3.6 has the flags field, kernel 3.5 lacks that */
167 e = memchr(p, ',', l);
172 r = parse_usec(p, &usec);
178 e = memchr(p, '\n', l);
187 for (j = 0; l > 0 && j < N_IOVEC_KERNEL_FIELDS; j++) {
189 /* Meta data fields attached */
196 e = memchr(k, '\n', l);
202 m = cunescape_length_with_prefix(k, e - k, "_KERNEL_");
206 if (startswith(m, "_KERNEL_DEVICE="))
207 kernel_device = m + 15;
209 IOVEC_SET_STRING(iovec[n++], m);
217 struct udev_device *ud;
219 ud = udev_device_new_from_device_id(s->udev, kernel_device);
222 struct udev_list_entry *ll;
225 g = udev_device_get_devnode(ud);
227 b = strappend("_UDEV_DEVNODE=", g);
229 IOVEC_SET_STRING(iovec[n++], b);
234 g = udev_device_get_sysname(ud);
236 b = strappend("_UDEV_SYSNAME=", g);
238 IOVEC_SET_STRING(iovec[n++], b);
244 ll = udev_device_get_devlinks_list_entry(ud);
245 udev_list_entry_foreach(ll, ll) {
247 if (j > N_IOVEC_UDEV_FIELDS)
250 g = udev_list_entry_get_name(ll);
251 b = strappend("_UDEV_DEVLINK=", g);
253 IOVEC_SET_STRING(iovec[n++], b);
260 udev_device_unref(ud);
264 if (asprintf(&source_time, "_SOURCE_MONOTONIC_TIMESTAMP=%llu",
265 (unsigned long long) usec) >= 0)
266 IOVEC_SET_STRING(iovec[n++], source_time);
268 IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=kernel");
270 if (asprintf(&syslog_priority, "PRIORITY=%i", priority & LOG_PRIMASK) >= 0)
271 IOVEC_SET_STRING(iovec[n++], syslog_priority);
273 if ((priority & LOG_FACMASK) == LOG_KERN)
274 IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=kernel");
276 syslog_read_identifier((const char**) &p, &identifier, &pid);
278 /* Avoid any messages we generated ourselves via
279 * log_info() and friends. */
280 if (pid && is_us(pid))
284 syslog_identifier = strappend("SYSLOG_IDENTIFIER=", identifier);
285 if (syslog_identifier)
286 IOVEC_SET_STRING(iovec[n++], syslog_identifier);
290 syslog_pid = strappend("SYSLOG_PID=", pid);
292 IOVEC_SET_STRING(iovec[n++], syslog_pid);
295 if (asprintf(&syslog_facility, "SYSLOG_FACILITY=%i", LOG_FAC(priority)) >= 0)
296 IOVEC_SET_STRING(iovec[n++], syslog_facility);
299 message = cunescape_length_with_prefix(p, pl, "MESSAGE=");
301 IOVEC_SET_STRING(iovec[n++], message);
303 server_dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, NULL, priority);
306 for (j = 0; j < z; j++)
307 free(iovec[j].iov_base);
310 free(syslog_priority);
311 free(syslog_identifier);
313 free(syslog_facility);
319 int server_read_dev_kmsg(Server *s) {
320 char buffer[8192+1]; /* the kernel-side limit per record is 8K currently */
324 assert(s->dev_kmsg_fd >= 0);
326 l = read(s->dev_kmsg_fd, buffer, sizeof(buffer) - 1);
330 /* Old kernels who don't allow reading from /dev/kmsg
331 * return EINVAL when we try. So handle this cleanly,
332 * but don' try to ever read from it again. */
333 if (errno == EINVAL) {
334 epoll_ctl(s->epoll_fd, EPOLL_CTL_DEL, s->dev_kmsg_fd, NULL);
338 if (errno == EAGAIN || errno == EINTR || errno == EPIPE)
341 log_error("Failed to read from kernel: %m");
345 dev_kmsg_record(s, buffer, l);
349 int server_flush_dev_kmsg(Server *s) {
354 if (s->dev_kmsg_fd < 0)
357 if (!s->dev_kmsg_readable)
360 log_info("Flushing /dev/kmsg...");
363 r = server_read_dev_kmsg(s);
374 int server_open_dev_kmsg(Server *s) {
375 struct epoll_event ev;
379 s->dev_kmsg_fd = open("/dev/kmsg", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
380 if (s->dev_kmsg_fd < 0) {
381 log_warning("Failed to open /dev/kmsg, ignoring: %m");
387 ev.data.fd = s->dev_kmsg_fd;
388 if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->dev_kmsg_fd, &ev) < 0) {
390 /* This will fail with EPERM on older kernels where
391 * /dev/kmsg is not readable. */
395 log_error("Failed to add /dev/kmsg fd to epoll object: %m");
399 s->dev_kmsg_readable = true;
404 int server_open_kernel_seqnum(Server *s) {
410 /* We store the seqnum we last read in an mmaped file. That
411 * way we can just use it like a variable, but it is
412 * persistant and automatically flushed at reboot. */
414 fd = open("/run/systemd/journal/kernel-seqnum", O_RDWR|O_CREAT|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0644);
416 log_error("Failed to open /run/systemd/journal/kernel-seqnum, ignoring: %m");
420 if (posix_fallocate(fd, 0, sizeof(uint64_t)) < 0) {
421 log_error("Failed to allocate sequential number file, ignoring: %m");
422 close_nointr_nofail(fd);
426 p = mmap(NULL, sizeof(uint64_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
427 if (p == MAP_FAILED) {
428 log_error("Failed to map sequential number file, ignoring: %m");
429 close_nointr_nofail(fd);
433 close_nointr_nofail(fd);
434 s->kernel_seqnum = p;