summaryrefslogtreecommitdiff
path: root/src/libsystemd
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-11-27 21:28:13 +0100
committerLennart Poettering <lennart@poettering.net>2014-11-27 22:05:24 +0100
commit1a29929959fd8f59e19ce60c25d1a1f7d910fac0 (patch)
tree6026f2f6d2a3cabc39f348844825ea3c244ad790 /src/libsystemd
parent12f1caf40c8bbc8302c8458a364515628e621fa5 (diff)
kdbus: set kernel attach mask before creating the first bus
Diffstat (limited to 'src/libsystemd')
-rw-r--r--src/libsystemd/sd-bus/bus-kernel.c35
-rw-r--r--src/libsystemd/sd-bus/bus-kernel.h2
-rw-r--r--src/libsystemd/sd-bus/test-bus-kernel.c2
3 files changed, 38 insertions, 1 deletions
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;