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?) * home.mount failing should not be able to cancel umount.target (IgnoreDependencyFailure=yes borked?)
* verify ssh disconnect now works
External: External:
* place /etc/inittab with explaining blurb. * place /etc/inittab with explaining blurb.

View File

@ -43,22 +43,20 @@ int main(int argc, char *argv[]) {
log_parse_environment(); log_parse_environment();
log_open(); 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))) { 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)); log_error("Failed to get D-Bus connection: %s", bus_error_message(&error));
goto finish; goto finish;
} }
if (bus_check_peercred(bus) < 0) { if (bus_check_peercred(bus) < 0) {
log_error("Bus owner not root."); log_error("Bus owner not root.");
goto finish; goto finish;
}
} }
if (!(m = dbus_message_new_signal("/org/freedesktop/systemd1/agent", "org.freedesktop.systemd1.Agent", "Released"))) { 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)) { 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; goto finish;
} }
@ -87,6 +85,7 @@ finish:
dbus_connection_unref(bus); dbus_connection_unref(bus);
} }
if (m) if (m)
dbus_message_unref(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."); log_debug("System D-Bus connection terminated.");
bus_done_system(m); 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; const char *cgroup;
if (!dbus_message_get_args(message, &error, 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")) if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected"))
shutdown_connection(m, connection); 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; const char *cgroup;
if (!dbus_message_get_args(message, &error, 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); log_error("Failed to parse Released message: %s", error.message);
else else
cgroup_notify_empty(m, cgroup); 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); dbus_error_free(&error);
@ -808,17 +818,19 @@ static int bus_init_system(Manager *m) {
goto fail; goto fail;
} }
dbus_bus_add_match(m->system_bus, if (m->running_as != MANAGER_SYSTEM) {
"type='signal'," dbus_bus_add_match(m->system_bus,
"interface='org.freedesktop.systemd1.Agent'," "type='signal',"
"member='Released'," "interface='org.freedesktop.systemd1.Agent',"
"path='/org/freedesktop/systemd1/agent'", "member='Released',"
&error); "path='/org/freedesktop/systemd1/agent'",
&error);
if (dbus_error_is_set(&error)) { if (dbus_error_is_set(&error)) {
log_error("Failed to register match: %s", error.message); log_error("Failed to register match: %s", error.message);
r = -EIO; r = -EIO;
goto fail; goto fail;
}
} }
if (m->api_bus != m->system_bus) { if (m->api_bus != m->system_bus) {