diff options
-rw-r--r-- | src/core/busname.c | 2 | ||||
-rw-r--r-- | src/core/kmod-setup.c | 7 | ||||
-rw-r--r-- | src/core/manager.c | 2 | ||||
-rw-r--r-- | src/dbus1-generator/dbus1-generator.c | 4 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-util.c | 27 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-util.h | 3 |
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); |