that is the systemd-journald may ignore /dec/kmsg which are not a valid device but a lint to /dev/null as done in LinuX Containers (LXC). This change adds straight forward a check for /dev/kmsg.
Signed-off-by: Werner Fink <[email protected]> --- src/journal/journald-kmsg.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git src/journal/journald-kmsg.c src/journal/journald-kmsg.c index af49d85..03d8f90 100644 --- src/journal/journald-kmsg.c +++ src/journal/journald-kmsg.c @@ -23,7 +23,9 @@ #include <sys/epoll.h> #include <fcntl.h> #include <sys/mman.h> +#include <sys/stat.h> #include <sys/socket.h> +#include <sys/types.h> #include <systemd/sd-messages.h> #include <libudev.h> @@ -377,12 +379,32 @@ int server_flush_dev_kmsg(Server *s) { int server_open_dev_kmsg(Server *s) { struct epoll_event ev; + struct stat st; assert(s); s->dev_kmsg_fd = open("/dev/kmsg", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (s->dev_kmsg_fd < 0) { - log_warning("Failed to open /dev/kmsg, ignoring: %m"); + /* Do not warn as it may not exists in LXC environments */ + if (errno != ENOENT) + log_warning("Failed to open /dev/kmsg, ignoring: %m"); + return 0; + } + + if (fstat(s->dev_kmsg_fd, &st) < 0) { + log_error("Failed to stat /dev/kmsg fd, ignoring: %m"); + close_nointr_nofail(s->dev_kmsg_fd); + s->dev_kmsg_fd = -1; + return 0; + } + + if (!S_ISCHR(st.st_mode) || major(st.st_rdev) != 1 || minor(st.st_rdev) != 11) { + int old_errno = errno; + errno = ENODEV; + log_warning("Irregular device /dev/kmsg, ignoring: %m"); + errno = old_errno; + close_nointr_nofail(s->dev_kmsg_fd); + s->dev_kmsg_fd = -1; return 0; } @@ -391,6 +413,9 @@ int server_open_dev_kmsg(Server *s) { ev.data.fd = s->dev_kmsg_fd; if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->dev_kmsg_fd, &ev) < 0) { + close_nointr_nofail(s->dev_kmsg_fd); + s->dev_kmsg_fd = -1; + /* This will fail with EPERM on older kernels where * /dev/kmsg is not readable. */ if (errno == EPERM) -- 1.7.9.2 _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
