]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: add BlockWeakInhibited property
authorLuca Boccassi <luca.boccassi@gmail.com>
Wed, 30 Oct 2024 13:44:00 +0000 (13:44 +0000)
committerLennart Poettering <lennart@poettering.net>
Wed, 30 Oct 2024 16:41:52 +0000 (17:41 +0100)
Fixes https://github.com/systemd/systemd/issues/34091
Follow-up for 804874d26ac73e0af07c4c5d7165c95372f03f6d

man/org.freedesktop.login1.xml
src/login/logind-dbus.c
src/login/logind-inhibit.c
src/login/logind-inhibit.h

index 91e7364b40e40d9c251f252ab144b9da597422ec..00ca82487a83a82c5ce999f25764c20ae855edca 100644 (file)
@@ -216,6 +216,7 @@ node /org/freedesktop/login1 {
       readonly t IdleSinceHint = ...;
       readonly t IdleSinceHintMonotonic = ...;
       readonly s BlockInhibited = '...';
+      readonly s BlockWeakInhibited = '...';
       readonly s DelayInhibited = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly t InhibitDelayMaxUSec = ...;
@@ -488,6 +489,8 @@ node /org/freedesktop/login1 {
 
     <variablelist class="dbus-property" generated="True" extra-ref="BlockInhibited"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="BlockWeakInhibited"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="DelayInhibited"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="InhibitDelayMaxUSec"/>
@@ -805,9 +808,10 @@ node /org/freedesktop/login1 {
       timestamps of the last change of the idle hint boolean, in <constant>CLOCK_REALTIME</constant> and
       <constant>CLOCK_MONOTONIC</constant> timestamps, respectively, in microseconds since the epoch.</para>
 
-      <para>The <varname>BlockInhibited</varname> and <varname>DelayInhibited</varname> properties encode
-      the currently active locks of the respective modes. They are colon separated lists of
-      <literal>shutdown</literal>, <literal>sleep</literal>, and <literal>idle</literal> (see above).</para>
+      <para>The <varname>BlockInhibited</varname>, <varname>BlockWeakInhibited</varname>, and
+      <varname>DelayInhibited</varname> properties encode the currently active locks of the respective
+      modes. They are colon separated lists of <literal>shutdown</literal>, <literal>sleep</literal>, and
+      <literal>idle</literal> (see above).</para>
 
       <para><varname>NCurrentSessions</varname> and <varname>NCurrentInhibitors</varname> contain the number
       of currently registered sessions and inhibitors.</para>
@@ -1634,7 +1638,8 @@ node /org/freedesktop/login1/session/1 {
       <function>ListSessionsEx()</function> were added in version 256.</para>
       <para><varname>HandleSecureAttentionKey</varname>, <function>SecureAttentionKey()</function>,
       <varname>PreparingForShutdownWithMetadata</varname>, <varname>DesignatedMaintenanceTime</varname>,
-      <varname>CanIdle</varname>, and <varname>CanLock</varname> were added in version 257.</para>
+      <varname>CanIdle</varname>, <varname>CanLock</varname>,
+      and <varname>BlockWeakInhibited</varname> were added in version 257.</para>
     </refsect2>
     <refsect2>
       <title>Session Objects</title>
index 3cec6109d8cd4b74ad7080a1e85c0f4308e6229a..094f9a64bd46dd5ca3524d833d3aa9f9fea7aeb4 100644 (file)
@@ -310,7 +310,14 @@ static int property_get_inhibited(
         assert(bus);
         assert(reply);
 
-        w = manager_inhibit_what(m, /* block= */ streq(property, "BlockInhibited"));
+        if (streq(property, "BlockInhibited"))
+                w = manager_inhibit_what(m, INHIBIT_BLOCK);
+        else if (streq(property, "BlockWeakInhibited"))
+                w = manager_inhibit_what(m, INHIBIT_BLOCK_WEAK);
+        else if (streq(property, "DelayInhibited"))
+                w = manager_inhibit_what(m, INHIBIT_DELAY);
+        else
+                assert_not_reached();
 
         return sd_bus_message_append(reply, "s", inhibit_what_to_string(w));
 }
@@ -3745,6 +3752,7 @@ static const sd_bus_vtable manager_vtable[] = {
         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("BlockInhibited", "s", property_get_inhibited, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("BlockWeakInhibited", "s", property_get_inhibited, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("DelayInhibited", "s", property_get_inhibited, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("InhibitDelayMaxUSec", "t", NULL, offsetof(Manager, inhibit_delay_max), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("UserStopDelayUSec", "t", NULL, offsetof(Manager, user_stop_delay), SD_BUS_VTABLE_PROPERTY_CONST),
index 70905c92b398ab1363d8dc0060e3bd669f8806f5..27ad8f16526bf7673a54e49d9d3770bd903e2b05 100644 (file)
@@ -363,16 +363,14 @@ bool inhibitor_is_orphan(Inhibitor *i) {
         return false;
 }
 
-InhibitWhat manager_inhibit_what(Manager *m, bool block) {
+InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mode) {
         Inhibitor *i;
         InhibitWhat what = 0;
 
         assert(m);
 
         HASHMAP_FOREACH(i, m->inhibitors)
-                if (i->started &&
-                    ((!block && i->mode == INHIBIT_DELAY) ||
-                     (block && IN_SET(i->mode, INHIBIT_BLOCK, INHIBIT_BLOCK_WEAK))))
+                if (i->started && i->mode == mode)
                         what |= i->what;
 
         return what;
index 8712fb1900cc616990fd6598961cb0ffd616ab57..16abd6958cc7da24a76180919d0aa5f767785365 100644 (file)
@@ -66,7 +66,7 @@ int inhibitor_create_fifo(Inhibitor *i);
 
 bool inhibitor_is_orphan(Inhibitor *i);
 
-InhibitWhat manager_inhibit_what(Manager *m, bool block);
+InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mode);
 bool manager_is_inhibited(Manager *m, InhibitWhat w, bool block, dual_timestamp *since, bool ignore_inactive, bool ignore_uid, uid_t uid, Inhibitor **offending);
 
 static inline bool inhibit_what_is_valid(InhibitWhat w) {