From 53c6a358a8bb9e722ac6b8ba750acf576a61bf27 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 3 Sep 2010 01:45:14 +0200 Subject: [PATCH] dbus: don't send cgroup agent messages directly to system bus to avoid dbus activation loop --- fixme | 2 ++ src/cgroups-agent.c | 27 +++++++++++++-------------- src/dbus.c | 36 ++++++++++++++++++++++++------------ 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/fixme b/fixme index 312e062121..1e4efc56d7 100644 --- a/fixme +++ b/fixme @@ -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. diff --git a/src/cgroups-agent.c b/src/cgroups-agent.c index 30aeede943..3fd0de698f 100644 --- a/src/cgroups-agent.c +++ b/src/cgroups-agent.c @@ -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); diff --git a/src/dbus.c b/src/dbus.c index 8c969eab63..85284324b3 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -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) {