From: Lennart Poettering Date: Thu, 27 Feb 2025 10:21:26 +0000 (+0100) Subject: udev: add builtin that reports current factory reset state X-Git-Tag: v258-rc1~1176^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9f0c830b5fb2624120706989211656ae0c75536e;p=thirdparty%2Fsystemd.git udev: add builtin that reports current factory reset state --- diff --git a/src/udev/meson.build b/src/udev/meson.build index b3f27e0df2e..b24234bba28 100644 --- a/src/udev/meson.build +++ b/src/udev/meson.build @@ -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 index 00000000000..ffa06747720 --- /dev/null +++ b/src/udev/udev-builtin-factory_reset.c @@ -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, +}; diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c index 749589463d5..fd4b23c1cc6 100644 --- a/src/udev/udev-builtin.c +++ b/src/udev/udev-builtin.c @@ -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, diff --git a/src/udev/udev-builtin.h b/src/udev/udev-builtin.h index 826308c9708..f38f8bd93ed 100644 --- a/src/udev/udev-builtin.h +++ b/src/udev/udev-builtin.h @@ -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; diff --git a/src/udev/udev-def.h b/src/udev/udev-def.h index c157c487cf2..4064b25f57a 100644 --- a/src/udev/udev-def.h +++ b/src/udev/udev-def.h @@ -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,