From 1a29929959fd8f59e19ce60c25d1a1f7d910fac0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 27 Nov 2014 21:28:13 +0100 Subject: kdbus: set kernel attach mask before creating the first bus --- src/libsystemd/sd-bus/bus-kernel.c | 35 ++++++++++++++++++++++++++++++++- src/libsystemd/sd-bus/bus-kernel.h | 2 ++ src/libsystemd/sd-bus/test-bus-kernel.c | 2 ++ 3 files changed, 38 insertions(+), 1 deletion(-) (limited to 'src/libsystemd/sd-bus') diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index 3bf7b074ef..759d566eb3 100644 --- a/src/libsystemd/sd-bus/bus-kernel.c +++ b/src/libsystemd/sd-bus/bus-kernel.c @@ -32,6 +32,8 @@ #include "util.h" #include "strv.h" #include "memfd-util.h" +#include "cgroup-util.h" +#include "fileio.h" #include "bus-internal.h" #include "bus-message.h" @@ -39,7 +41,6 @@ #include "bus-bloom.h" #include "bus-util.h" #include "bus-label.h" -#include "cgroup-util.h" #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t)) @@ -1796,3 +1797,35 @@ int bus_kernel_realize_attach_flags(sd_bus *bus) { return 0; } + +int bus_kernel_fix_attach_mask(void) { + _cleanup_free_ char *mask = NULL; + uint64_t m = (uint32_t) -1; + char buf[2+16+2]; + int r; + + r = get_proc_cmdline_key("systemd.kdbus_attach_flags_mask=", &mask); + if (r < 0) { + log_warning_errno(-r, "Failed to read kernel command line: %m"); + return r; + } + + if (mask) { + const char *p = mask; + + if (startswith(p, "0x")) + p += 2; + + if (sscanf(p, "%" PRIx64, &m) != 1) + log_warning("Couldn't parse systemd.kdbus_attach_flags_mask= kernel command line parameter."); + } + + sprintf(buf, "0x%" PRIx64 "\n", m); + r = write_string_file("/sys/module/kdbus/parameters/attach_flags_mask", buf); + if (r < 0) { + log_warning_errno(-r, "Failed to write kdbus attach mask: %m"); + return r; + } + + return 0; +} diff --git a/src/libsystemd/sd-bus/bus-kernel.h b/src/libsystemd/sd-bus/bus-kernel.h index 8994b35f52..0db8fd35a7 100644 --- a/src/libsystemd/sd-bus/bus-kernel.h +++ b/src/libsystemd/sd-bus/bus-kernel.h @@ -89,3 +89,5 @@ int bus_kernel_try_close(sd_bus *bus); int bus_kernel_drop_one(int fd); int bus_kernel_realize_attach_flags(sd_bus *bus); + +int bus_kernel_fix_attach_mask(void); diff --git a/src/libsystemd/sd-bus/test-bus-kernel.c b/src/libsystemd/sd-bus/test-bus-kernel.c index 0e6c2ac402..485c396bdb 100644 --- a/src/libsystemd/sd-bus/test-bus-kernel.c +++ b/src/libsystemd/sd-bus/test-bus-kernel.c @@ -45,6 +45,8 @@ int main(int argc, char *argv[]) { assert_se(asprintf(&name, "deine-mutter-%u", (unsigned) getpid()) >= 0); + bus_kernel_fix_attach_mask(); + bus_ref = bus_kernel_create_bus(name, false, &bus_name); if (bus_ref == -ENOENT) return EXIT_TEST_SKIP; -- cgit v1.2.3-54-g00ecf