mirror of
https://github.com/systemd/systemd.git
synced 2024-12-28 19:43:30 +08:00
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?)
|
||||
|
||||
* verify ssh disconnect now works
|
||||
|
||||
External:
|
||||
|
||||
* place /etc/inittab with explaining blurb.
|
||||
|
@ -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);
|
||||
|
||||
|
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.");
|
||||
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) {
|
||||
|
Loading…
Reference in New Issue
Block a user