We noticed some failures because we have code that connects to user
managers by setting DBUS_SESSION_BUS_ADDRESS without setting XDG_RUNTIME_DIR.
If that's the case, connect to the user session bus instead of the
private manager bus as we can't connect to the latter if XDG_RUNTIME_DIR
is not set.
RuntimeScope runtime_scope,
sd_bus **ret_bus) {
+ int r;
+
assert(transport >= 0);
assert(transport < _BUS_TRANSPORT_MAX);
assert(ret_bus);
switch (runtime_scope) {
case RUNTIME_SCOPE_USER:
- return bus_connect_user_systemd(ret_bus);
+ r = bus_connect_user_systemd(ret_bus);
+ /* We used to always fall back to the user session bus if we couldn't connect to the
+ * private manager bus. To keep compat with existing code that was setting
+ * DBUS_SESSION_BUS_ADDRESS without setting XDG_RUNTIME_DIR, connect to the user
+ * session bus if DBUS_SESSION_BUS_ADDRESS is set and XDG_RUNTIME_DIR isn't. */
+ if (r == -ENOMEDIUM && secure_getenv("DBUS_SESSION_BUS_ADDRESS"))
+ r = sd_bus_default_user(ret_bus);
+
+ return r;
case RUNTIME_SCOPE_SYSTEM:
if (sd_booted() <= 0)