dbus: don't send cgroup agent messages directly to system bus to avoid dbus activation loop
This commit is contained in:
parent
b401e1fb9d
commit
53c6a358a8
2
fixme
2
fixme
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
36
src/dbus.c
36
src/dbus.c
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue