From: Jelle van der Waa Date: Wed, 8 Oct 2025 10:29:04 +0000 (+0200) Subject: logind: emit PropertiesChanged when lingering is enabled/disabled X-Git-Tag: v259-rc1~353 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c6ebb98e3c5702b60449b85b333ff3a8982ad412;p=thirdparty%2Fsystemd.git logind: emit PropertiesChanged when lingering is enabled/disabled Cockpit's podman plugin needs to know the lingering status so the UI can advertise enabling `podman-restart` (which depends on lingering to work). Currently it relies on watching `/var/lib/systemd/linger/${user}` but that isn't a public API. Related: #22244 --- diff --git a/man/org.freedesktop.login1.xml b/man/org.freedesktop.login1.xml index 5561c98606e..b447ae70f64 100644 --- a/man/org.freedesktop.login1.xml +++ b/man/org.freedesktop.login1.xml @@ -1067,7 +1067,6 @@ node /org/freedesktop/login1/user/_1000 { readonly b IdleHint = ...; readonly t IdleSinceHint = ...; readonly t IdleSinceHintMonotonic = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly b Linger = ...; }; interface org.freedesktop.DBus.Peer { ... }; diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 4e4ed92b204..7211dad9baa 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -1668,6 +1668,7 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu return r; if (manager_add_user_by_uid(m, uid, &u) >= 0) { + (void) user_send_changed(u, "Linger"); r = user_start(u); if (r < 0) { user_add_to_gc_queue(u); @@ -1685,6 +1686,7 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu /* Make sure that disabling lingering will terminate the user tracking if no sessions pin it. */ u->gc_mode = USER_GC_BY_PIN; user_add_to_gc_queue(u); + (void) user_send_changed(u, "Linger"); } } diff --git a/src/login/logind-user-dbus.c b/src/login/logind-user-dbus.c index 600890230bb..b23891767ee 100644 --- a/src/login/logind-user-dbus.c +++ b/src/login/logind-user-dbus.c @@ -367,7 +367,7 @@ static const sd_bus_vtable user_vtable[] = { SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), - SD_BUS_PROPERTY("Linger", "b", property_get_linger, 0, 0), + SD_BUS_PROPERTY("Linger", "b", property_get_linger, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_METHOD("Terminate", NULL, NULL, bus_user_method_terminate, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD_WITH_ARGS("Kill", diff --git a/test/units/TEST-35-LOGIN.sh b/test/units/TEST-35-LOGIN.sh index b714fce67aa..56059ee5e49 100755 --- a/test/units/TEST-35-LOGIN.sh +++ b/test/units/TEST-35-LOGIN.sh @@ -590,7 +590,10 @@ testcase_list_users_sessions_seats() { assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $3 }')" no assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $4 }')" active - loginctl enable-linger logind-test-user + systemd-run --quiet --service-type=notify --unit=test-linger-signal-wait --pty \ + -p Environment=SYSTEMD_LOG_LEVEL=debug \ + -p ExecStartPost="loginctl enable-linger logind-test-user" \ + busctl --timeout=30 wait "/org/freedesktop/login1/user/_$(id -ru logind-test-user)" org.freedesktop.DBus.Properties PropertiesChanged | grep -qF '"Linger" b true' assert_eq "$(loginctl list-users --no-legend | awk '$2 == "logind-test-user" { print $3 }')" yes for s in $(loginctl list-sessions --no-legend | grep tty | awk '$3 == "logind-test-user" { print $1 }'); do