dbus: don't try to run AddMatch when connected to a private bus

This commit is contained in:
Lennart Poettering 2010-07-07 03:43:39 +02:00
parent ad678a066b
commit f4579ce704
4 changed files with 50 additions and 36 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;
}

View File

@ -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) {