]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: add builtin that reports current factory reset state
authorLennart Poettering <lennart@poettering.net>
Thu, 27 Feb 2025 10:21:26 +0000 (11:21 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 5 Mar 2025 11:38:13 +0000 (12:38 +0100)
src/udev/meson.build
src/udev/udev-builtin-factory_reset.c [new file with mode: 0644]
src/udev/udev-builtin.c
src/udev/udev-builtin.h
src/udev/udev-def.h

index b3f27e0df2e7024917991d441c2f634d9956cb96..b24234bba280f20ce5d16243ea82b22d69acd6cf 100644 (file)
@@ -20,7 +20,9 @@ udevadm_sources = files(
 
 libudevd_core_sources = files(
         'net/link-config.c',
+        'udev-builtin.c',
         'udev-builtin-btrfs.c',
+        'udev-builtin-factory_reset.c',
         'udev-builtin-hwdb.c',
         'udev-builtin-input_id.c',
         'udev-builtin-keyboard.c',
@@ -29,7 +31,6 @@ libudevd_core_sources = files(
         'udev-builtin-net_setup_link.c',
         'udev-builtin-path_id.c',
         'udev-builtin-usb_id.c',
-        'udev-builtin.c',
         'udev-config.c',
         'udev-ctrl.c',
         'udev-dump.c',
diff --git a/src/udev/udev-builtin-factory_reset.c b/src/udev/udev-builtin-factory_reset.c
new file mode 100644 (file)
index 0000000..ffa0674
--- /dev/null
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include "device-util.h"
+#include "factory-reset.h"
+#include "udev-builtin.h"
+
+/* Sometimes it is relevant in udev rules to know whether factory reset is currently in effect or not. Report
+ * the current state at moment of probing as a udev property. This can be used to create certain device node
+ * symlinks only once factory reset is complete, or even mark whole devices as SYSTEMD_READY=0 as long as
+ * factory reset is still ongoing. */
+
+static int builtin_factory_reset(UdevEvent *event, int argc, char *argv[]) {
+        sd_device *dev = ASSERT_PTR(ASSERT_PTR(event)->dev);
+
+        if (argc != 2 || !streq(argv[1], "status"))
+                return log_device_warning_errno(
+                                dev, SYNTHETIC_ERRNO(EINVAL), "%s: expected: status", argv[0]);
+
+        /* Report factory reset mode at the moment of probing a device. */
+        FactoryResetMode f = factory_reset_mode();
+        if (f < 0) {
+                log_device_debug_errno(dev, f, "Unable to detect factory reset mode, ignoring: %m");
+                return 0;
+        }
+
+        return udev_builtin_add_property(event, "ID_FACTORY_RESET", factory_reset_mode_to_string(f));
+}
+
+const UdevBuiltin udev_builtin_factory_reset = {
+        .name = "factory_reset",
+        .cmd = builtin_factory_reset,
+        .help = "Factory Reset Mode",
+        .run_once = true,
+};
index 749589463d5fc1b0512dc667e12cc3d32d49e72c..fd4b23c1cc6a3c24a7cc8410c119df5fd764cb47 100644 (file)
@@ -15,6 +15,7 @@ static const UdevBuiltin *const builtins[_UDEV_BUILTIN_MAX] = {
         [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
 #endif
         [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
+        [UDEV_BUILTIN_FACTORY_RESET] = &udev_builtin_factory_reset,
         [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
         [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
         [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
index 826308c9708136fa52ddfb0ee48d9a6f630eca04..f38f8bd93ede1b7624bbdb008a1ad82ef0d773b1 100644 (file)
@@ -37,6 +37,7 @@ typedef struct UdevBuiltin {
 extern const UdevBuiltin udev_builtin_blkid;
 #endif
 extern const UdevBuiltin udev_builtin_btrfs;
+extern const UdevBuiltin udev_builtin_factory_reset;
 extern const UdevBuiltin udev_builtin_hwdb;
 extern const UdevBuiltin udev_builtin_input_id;
 extern const UdevBuiltin udev_builtin_keyboard;
index c157c487cf261c197992db4351313c8280f53c6c..4064b25f57a6a1d1ea483ffb70fd8ace466e9084 100644 (file)
@@ -40,6 +40,7 @@ typedef enum UdevBuiltinCommand {
         UDEV_BUILTIN_BLKID,
 #endif
         UDEV_BUILTIN_BTRFS,
+        UDEV_BUILTIN_FACTORY_RESET,
         UDEV_BUILTIN_HWDB,
         UDEV_BUILTIN_INPUT_ID,
         UDEV_BUILTIN_KEYBOARD,