]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bus: don't switch to kdbus if not requested
authorDavid Herrmann <dh.herrmann@gmail.com>
Wed, 6 May 2015 16:18:43 +0000 (18:18 +0200)
committerDavid Herrmann <dh.herrmann@gmail.com>
Wed, 6 May 2015 16:21:51 +0000 (18:21 +0200)
Whenever systemd is re-executed, it tries to create a system bus via
kdbus. If the system did not have kdbus loaded during bootup, but the
module is loaded later on manually, this will cause two system buses
running (kdbus and dbus-daemon in parallel).

This patch makes sure we never try to create kdbus buses if it wasn't
explicitly requested on the command-line.

src/core/busname.c
src/core/kmod-setup.c
src/core/manager.c
src/dbus1-generator/dbus1-generator.c
src/libsystemd/sd-bus/bus-util.c
src/libsystemd/sd-bus/bus-util.h

index 1278c966388dafa2806efd38d50004d9eca9d53f..3dc6e87e558061ee3f64f14870b26e77e527f138 100644 (file)
@@ -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;
 }
index c5117b47eef4ad3759c8ee4aac6cee497a81cfba..132c3e866c009a3f7d8d75b0ea81ad67249f7455 100644 (file)
@@ -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                },
index 8c8645b68dc764c41b7ab32f2f8ced2010d1ef1b..c918f191c9d801848331817ba793433b07b6fa14 100644 (file)
@@ -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();
index c909a4b1da5968179d34bafea60104bfa19637f7..4980fccc31b6a4c3f8e07291b63a18438b6c8770 100644 (file)
@@ -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;
index f0695bfde0ab4911ea2160ae0c6087a13100982e..7536a96b8dd761108122ce54487787e0bee6cb74 100644 (file)
@@ -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;
+}
index d3a18e2d941f6a6435a1c5edeeebd0d7846fc061..093b48b8f84d7ed6f21db74b7f7030f90f630085 100644 (file)
@@ -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);