]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: add PreparingForShutdownWithMetadata property
authorLuca Boccassi <bluca@debian.org>
Sun, 4 Aug 2024 22:47:29 +0000 (23:47 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Mon, 5 Aug 2024 17:30:15 +0000 (19:30 +0200)
The PrepareForShutdownWithMetadata signal was added via
e4aab5cf1a00bbb73f325f4f785dd4171ccdae77 but a corresponding property
was not. A property has to be a single type, so the bool needs to be
one of the key/value pairs as 'ba{sv}' is not a valid property.

man/org.freedesktop.login1.xml
src/login/logind-dbus.c
test/units/TEST-82-SOFTREBOOT.sh

index bf00800cefc6c70bcad809fadaf316bfffb600d2..1008c59a32b96f5a41c4d2153ef96bd73e14db0d 100644 (file)
@@ -256,6 +256,8 @@ node /org/freedesktop/login1 {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly b PreparingForShutdown = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
+      readonly a{sv} PreparingForShutdownWithMetadata = [...];
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly b PreparingForSleep = ...;
       readonly (st) ScheduledShutdown = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
@@ -526,6 +528,8 @@ node /org/freedesktop/login1 {
 
     <variablelist class="dbus-property" generated="True" extra-ref="PreparingForShutdown"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="PreparingForShutdownWithMetadata"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="PreparingForSleep"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ScheduledShutdown"/>
@@ -815,8 +819,14 @@ node /org/freedesktop/login1 {
 
       <para>The <varname>PreparingForShutdown</varname> and <varname>PreparingForSleep</varname> boolean
       properties are true during the interval between the two <function>PrepareForShutdown()</function> and
-      <function>PrepareForSleep()</function> signals respectively. Note that these properties do not
-      send out <function>PropertyChanged</function> signals.</para>
+      <function>PrepareForSleep()</function> signals respectively. The
+      <varname>PreparingForShutdownWithMetadata</varname> property provides a list of key/value pair
+      metadata fields. Currently it lists a <varname>preparing</varname> boolean that corresponds to the
+      <varname>PreparingForShutdown</varname> property, and, if a shutdown is being prepared, it will also
+      contain a <varname>type</varname> string which defines the type of shutdown. The type can be one of
+      <literal>power-off</literal>, <literal>reboot</literal>, <literal>halt</literal>,
+      <literal>kexec</literal> or <literal>soft-reboot</literal>. Note that these properties do not send out
+      <function>PropertyChanged</function> signals.</para>
 
       <para>The <varname>RebootParameter</varname> property shows the value set with the
       <function>SetRebootParameter()</function> method described above.</para>
@@ -1609,7 +1619,8 @@ node /org/freedesktop/login1/session/1 {
       <varname>SleepOperation</varname>,
       <varname>DesignatedMaintenanceTime</varname>, and
       <function>ListSessionsEx()</function> were added in version 256.</para>
-      <para><varname>HandleSecureAttentionKey</varname>, and
+      <para><varname>HandleSecureAttentionKey</varname>,
+      <varname>PreparingForShutdownWithMetadata</varname>, and
       <function>SecureAttentionKey()</function> were added in version 257.</para>
     </refsect2>
     <refsect2>
index 98f14bd0b1958118c3eaa05fa6f21d0bdc2a1307..2f60f15131c178c2162cf0983ed329838683efa0 100644 (file)
@@ -341,6 +341,35 @@ static int property_get_preparing(
         return sd_bus_message_append(reply, "b", b);
 }
 
+static int property_get_preparing_shutdown_with_metadata(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        Manager *m = ASSERT_PTR(userdata);
+
+        assert(bus);
+        assert(reply);
+
+        if (!m->delayed_action || !(m->delayed_action->inhibit_what & INHIBIT_SHUTDOWN))
+                return sd_bus_message_append(reply, "a{sv}", 1, "preparing", "b", false);
+
+        return sd_bus_message_append(
+                        reply,
+                        "a{sv}",
+                        2,
+                        "preparing",
+                        "b",
+                        true,
+                        "type",
+                        "s",
+                        handle_action_to_string(m->delayed_action->handle));
+}
+
 static int property_get_sleep_operations(
                 sd_bus *bus,
                 const char *path,
@@ -3718,6 +3747,7 @@ static const sd_bus_vtable manager_vtable[] = {
         SD_BUS_PROPERTY("IdleAction", "s", property_get_handle_action, offsetof(Manager, idle_action), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("IdleActionUSec", "t", NULL, offsetof(Manager, idle_action_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PreparingForShutdown", "b", property_get_preparing, 0, 0),
+        SD_BUS_PROPERTY("PreparingForShutdownWithMetadata", "a{sv}", property_get_preparing_shutdown_with_metadata, 0, 0),
         SD_BUS_PROPERTY("PreparingForSleep", "b", property_get_preparing, 0, 0),
         SD_BUS_PROPERTY("ScheduledShutdown", "(st)", property_get_scheduled_shutdown, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("DesignatedMaintenanceTime", "s", property_get_maintenance_time, 0, 0),
index 9f3d4066c3aa7e08ce052c11d52195714c8f3fea..eb6fb375615878a62b43fcc0eeb7d596bc8a35ea 100755 (executable)
@@ -273,6 +273,10 @@ EOF
     touch /run/TEST-82-SOFTREBOOT.touch
     systemctl --no-block --check-inhibitors=yes soft-reboot
 
+    # Ensure the property works too
+    type="$(busctl --json=short get-property org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager PreparingForShutdownWithMetadata | jq -r '.data.type.data')"
+    test "$type" = "soft-reboot"
+
     # Now block until the soft-boot killing spree kills us
     exec sleep infinity
 fi