From f4579ce704b9db0358b90c282da9536410a4df5a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 7 Jul 2010 03:43:39 +0200 Subject: [PATCH] dbus: don't try to run AddMatch when connected to a private bus --- src/dbus-common.c | 9 +++++- src/dbus-common.h | 2 +- src/install.c | 2 +- src/systemctl.c | 73 ++++++++++++++++++++++++++--------------------- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/dbus-common.c b/src/dbus-common.c index 504eefbbb..11d989d7c 100644 --- a/src/dbus-common.c +++ b/src/dbus-common.c @@ -54,7 +54,7 @@ int bus_check_peercred(DBusConnection *c) { return 1; } -int bus_connect(DBusBusType t, DBusConnection **_bus, DBusError *error) { +int bus_connect(DBusBusType t, DBusConnection **_bus, bool *private, DBusError *error) { DBusConnection *bus; assert(_bus); @@ -71,9 +71,16 @@ int bus_connect(DBusBusType t, DBusConnection **_bus, DBusError *error) { dbus_set_error_const(error, DBUS_ERROR_ACCESS_DENIED, "Failed to verify owner of bus."); return -EACCES; } + + if (private) + *private = true; + } else { if (!(bus = dbus_bus_get(t, error))) return -EIO; + + if (private) + *private = false; } dbus_connection_set_exit_on_disconnect(bus, FALSE); diff --git a/src/dbus-common.h b/src/dbus-common.h index f355de14f..b28755fc7 100644 --- a/src/dbus-common.h +++ b/src/dbus-common.h @@ -26,6 +26,6 @@ int bus_check_peercred(DBusConnection *c); -int bus_connect(DBusBusType t, DBusConnection **_bus, DBusError *error); +int bus_connect(DBusBusType t, DBusConnection **_bus, bool *private_bus, DBusError *error); #endif diff --git a/src/install.c b/src/install.c index 3bf5761b3..3b70bd1d3 100644 --- a/src/install.c +++ b/src/install.c @@ -791,7 +791,7 @@ static int do_run(void) { return 0; } - if ((r = bus_connect(arg_where == WHERE_SESSION ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &bus, &error)) < 0) { + if ((r = bus_connect(arg_where == WHERE_SESSION ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &bus, NULL, &error)) < 0) { log_error("Failed to get D-Bus connection: %s", error.message); goto finish; } diff --git a/src/systemctl.c b/src/systemctl.c index 5c91c325c..081f34bcf 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -75,6 +75,8 @@ enum action { _ACTION_MAX } arg_action = ACTION_SYSTEMCTL; +static bool private_bus = false; + static bool error_is_no_service(DBusError *error) { assert(error); @@ -561,6 +563,9 @@ static int enable_wait_for_jobs(DBusConnection *bus) { assert(bus); + if (private_bus) + return 0; + dbus_error_init(&error); dbus_bus_add_match(bus, "type='signal'," @@ -1849,43 +1854,45 @@ static int monitor(DBusConnection *bus, char **args, unsigned n) { dbus_error_init(&error); - dbus_bus_add_match(bus, - "type='signal'," - "sender='org.freedesktop.systemd1'," - "interface='org.freedesktop.systemd1.Manager'," - "path='/org/freedesktop/systemd1'", - &error); + if (!private_bus) { + dbus_bus_add_match(bus, + "type='signal'," + "sender='org.freedesktop.systemd1'," + "interface='org.freedesktop.systemd1.Manager'," + "path='/org/freedesktop/systemd1'", + &error); - if (dbus_error_is_set(&error)) { - log_error("Failed to add match: %s", error.message); - r = -EIO; - goto finish; - } + if (dbus_error_is_set(&error)) { + log_error("Failed to add match: %s", error.message); + r = -EIO; + goto finish; + } - dbus_bus_add_match(bus, - "type='signal'," - "sender='org.freedesktop.systemd1'," - "interface='org.freedesktop.systemd1.Unit'," - "member='Changed'", - &error); + dbus_bus_add_match(bus, + "type='signal'," + "sender='org.freedesktop.systemd1'," + "interface='org.freedesktop.systemd1.Unit'," + "member='Changed'", + &error); - if (dbus_error_is_set(&error)) { - log_error("Failed to add match: %s", error.message); - r = -EIO; - goto finish; - } + if (dbus_error_is_set(&error)) { + log_error("Failed to add match: %s", error.message); + r = -EIO; + goto finish; + } - dbus_bus_add_match(bus, - "type='signal'," - "sender='org.freedesktop.systemd1'," - "interface='org.freedesktop.systemd1.Job'," - "member='Changed'", - &error); + dbus_bus_add_match(bus, + "type='signal'," + "sender='org.freedesktop.systemd1'," + "interface='org.freedesktop.systemd1.Job'," + "member='Changed'", + &error); - if (dbus_error_is_set(&error)) { - log_error("Failed to add match: %s", error.message); - r = -EIO; - goto finish; + if (dbus_error_is_set(&error)) { + log_error("Failed to add match: %s", error.message); + r = -EIO; + goto finish; + } } if (!dbus_connection_add_filter(bus, monitor_filter, NULL, NULL)) { @@ -3286,7 +3293,7 @@ int main(int argc, char*argv[]) { goto finish; } - bus_connect(arg_session ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &bus, &error); + bus_connect(arg_session ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &bus, &private_bus, &error); switch (arg_action) { -- 2.30.2