dbus: don't send cgroup agent messages directly to system bus to avoid dbus activation loop

This commit is contained in:
Lennart Poettering 2010-09-03 01:45:14 +02:00
parent b401e1fb9d
commit 53c6a358a8
3 changed files with 39 additions and 26 deletions

2
fixme
View File

@ -82,6 +82,8 @@ v9:
* home.mount failing should not be able to cancel umount.target (IgnoreDependencyFailure=yes borked?)
* verify ssh disconnect now works
External:
* place /etc/inittab with explaining blurb.

View File

@ -43,22 +43,20 @@ int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
/* If possible we go via the system bus, to make sure that
* session instances get the messages. If not possible we talk
* to the system instance directly. */
if (!(bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error))) {
dbus_error_free(&error);
/* We send this event to the private D-Bus socket and then the
* system instance will forward this to the system bus. We do
* this to avoid an actviation loop when we start dbus when we
* are called when the dbus service is shut down. */
if (!(bus = dbus_connection_open_private("unix:abstract=/org/freedesktop/systemd1/private", &error))) {
log_error("Failed to get D-Bus connection: %s", bus_error_message(&error));
goto finish;
}
if (!(bus = dbus_connection_open_private("unix:abstract=/org/freedesktop/systemd1/private", &error))) {
log_error("Failed to get D-Bus connection: %s", bus_error_message(&error));
goto finish;
}
if (bus_check_peercred(bus) < 0) {
log_error("Bus owner not root.");
goto finish;
}
if (bus_check_peercred(bus) < 0) {
log_error("Bus owner not root.");
goto finish;
}
if (!(m = dbus_message_new_signal("/org/freedesktop/systemd1/agent", "org.freedesktop.systemd1.Agent", "Released"))) {
@ -74,7 +72,7 @@ int main(int argc, char *argv[]) {
}
if (!dbus_connection_send(bus, m, NULL)) {
log_error("Failed to send signal message.");
log_error("Failed to send signal message on private connection.");
goto finish;
}
@ -87,6 +85,7 @@ finish:
dbus_connection_unref(bus);
}
if (m)
dbus_message_unref(m);

View File

@ -464,7 +464,9 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection *connection, D
log_debug("System D-Bus connection terminated.");
bus_done_system(m);
} else if (dbus_message_is_signal(message, "org.freedesktop.systemd1.Agent", "Released")) {
} else if (m->running_as != MANAGER_SYSTEM &&
dbus_message_is_signal(message, "org.freedesktop.systemd1.Agent", "Released")) {
const char *cgroup;
if (!dbus_message_get_args(message, &error,
@ -498,7 +500,9 @@ static DBusHandlerResult private_bus_message_filter(DBusConnection *connection,
if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected"))
shutdown_connection(m, connection);
else if (dbus_message_is_signal(message, "org.freedesktop.systemd1.Agent", "Released")) {
else if (m->running_as == MANAGER_SYSTEM &&
dbus_message_is_signal(message, "org.freedesktop.systemd1.Agent", "Released")) {
const char *cgroup;
if (!dbus_message_get_args(message, &error,
@ -507,6 +511,12 @@ static DBusHandlerResult private_bus_message_filter(DBusConnection *connection,
log_error("Failed to parse Released message: %s", error.message);
else
cgroup_notify_empty(m, cgroup);
/* Forward the message to the system bus, so that user
* instances are notified as well */
if (m->system_bus)
dbus_connection_send(m->system_bus, message, NULL);
}
dbus_error_free(&error);
@ -808,17 +818,19 @@ static int bus_init_system(Manager *m) {
goto fail;
}
dbus_bus_add_match(m->system_bus,
"type='signal',"
"interface='org.freedesktop.systemd1.Agent',"
"member='Released',"
"path='/org/freedesktop/systemd1/agent'",
&error);
if (m->running_as != MANAGER_SYSTEM) {
dbus_bus_add_match(m->system_bus,
"type='signal',"
"interface='org.freedesktop.systemd1.Agent',"
"member='Released',"
"path='/org/freedesktop/systemd1/agent'",
&error);
if (dbus_error_is_set(&error)) {
log_error("Failed to register match: %s", error.message);
r = -EIO;
goto fail;
if (dbus_error_is_set(&error)) {
log_error("Failed to register match: %s", error.message);
r = -EIO;
goto fail;
}
}
if (m->api_bus != m->system_bus) {