summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/busname.c2
-rw-r--r--src/core/kmod-setup.c7
-rw-r--r--src/core/manager.c2
-rw-r--r--src/dbus1-generator/dbus1-generator.c4
-rw-r--r--src/libsystemd/sd-bus/bus-util.c27
-rw-r--r--src/libsystemd/sd-bus/bus-util.h3
6 files changed, 37 insertions, 8 deletions
diff --git a/src/core/busname.c b/src/core/busname.c
index 1278c96638..3dc6e87e55 100644
--- a/src/core/busname.c
+++ b/src/core/busname.c
@@ -988,7 +988,7 @@ static bool busname_supported(void) {
static int supported = -1;
if (supported < 0)
- supported = access("/sys/fs/kdbus", F_OK) >= 0;
+ supported = is_kdbus_available();
return supported;
}
diff --git a/src/core/kmod-setup.c b/src/core/kmod-setup.c
index c5117b47ee..132c3e866c 100644
--- a/src/core/kmod-setup.c
+++ b/src/core/kmod-setup.c
@@ -28,6 +28,7 @@
#include "macro.h"
#include "capability.h"
+#include "bus-util.h"
#include "kmod-setup.h"
#ifdef HAVE_KMOD
@@ -44,10 +45,6 @@ static void systemd_kmod_log(
log_internalv(LOG_DEBUG, 0, file, line, fn, format, args);
REENABLE_WARNING;
}
-
-static bool cmdline_check_kdbus(void) {
- return get_proc_cmdline_key("kdbus", NULL) > 0;
-}
#endif
int kmod_setup(void) {
@@ -69,7 +66,7 @@ int kmod_setup(void) {
{ "unix", "/proc/net/unix", true, NULL },
/* IPC is needed before we bring up any other services */
- { "kdbus", "/sys/fs/kdbus", false, cmdline_check_kdbus },
+ { "kdbus", "/sys/fs/kdbus", false, is_kdbus_wanted },
/* netfilter is needed by networkd, nspawn among others, and cannot be autoloaded */
{ "ip_tables", "/proc/net/ip_tables_names", false, NULL },
diff --git a/src/core/manager.c b/src/core/manager.c
index 8c8645b68d..c918f191c9 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -721,6 +721,8 @@ static int manager_setup_kdbus(Manager *m) {
if (m->test_run || m->kdbus_fd >= 0)
return 0;
+ if (!is_kdbus_available())
+ return -ESOCKTNOSUPPORT;
if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0)
bus_kernel_fix_attach_mask();
diff --git a/src/dbus1-generator/dbus1-generator.c b/src/dbus1-generator/dbus1-generator.c
index c909a4b1da..4980fccc31 100644
--- a/src/dbus1-generator/dbus1-generator.c
+++ b/src/dbus1-generator/dbus1-generator.c
@@ -302,7 +302,7 @@ int main(int argc, char *argv[]) {
umask(0022);
- if (access("/sys/fs/kdbus/control", F_OK) < 0)
+ if (!is_kdbus_available())
return 0;
r = cg_pid_get_owner_uid(0, NULL);
@@ -310,7 +310,7 @@ int main(int argc, char *argv[]) {
path = "/usr/share/dbus-1/services";
type = "session";
units = USER_DATA_UNIT_PATH;
- } else if (r == -ENOENT) {
+ } else if (r == -ENXIO) {
path = "/usr/share/dbus-1/system-services";
type = "system";
units = SYSTEM_DATA_UNIT_PATH;
diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c
index f0695bfde0..7536a96b8d 100644
--- a/src/libsystemd/sd-bus/bus-util.c
+++ b/src/libsystemd/sd-bus/bus-util.c
@@ -2051,3 +2051,30 @@ int bus_path_decode_unique(const char *path, const char *prefix, char **ret_send
*ret_external = external;
return 1;
}
+
+bool is_kdbus_wanted(void) {
+ _cleanup_free_ char *value = NULL;
+ int r;
+
+ if (get_proc_cmdline_key("kdbus", NULL) <= 0) {
+ r = get_proc_cmdline_key("kdbus=", &value);
+ if (r <= 0 || parse_boolean(value) != 1)
+ return false;
+ }
+
+ return true;
+}
+
+bool is_kdbus_available(void) {
+ _cleanup_close_ int fd = -1;
+ struct kdbus_cmd cmd = { .size = sizeof(cmd), .flags = KDBUS_FLAG_NEGOTIATE };
+
+ if (!is_kdbus_wanted())
+ return false;
+
+ fd = open("/sys/fs/kdbus/control", O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY);
+ if (fd < 0)
+ return false;
+
+ return ioctl(fd, KDBUS_CMD_BUS_MAKE, &cmd) >= 0;
+}
diff --git a/src/libsystemd/sd-bus/bus-util.h b/src/libsystemd/sd-bus/bus-util.h
index d3a18e2d94..093b48b8f8 100644
--- a/src/libsystemd/sd-bus/bus-util.h
+++ b/src/libsystemd/sd-bus/bus-util.h
@@ -205,3 +205,6 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet);
int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);
int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
+
+bool is_kdbus_wanted(void);
+bool is_kdbus_available(void);