udev: add builtin that reports current factory reset state

This commit is contained in:
Lennart Poettering
2025-03-05 12:38:13 +01:00
parent 73e53d2ee4
commit 9f0c830b5f
5 changed files with 39 additions and 1 deletions
+2 -1
View 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',
+34
View File
@@ -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,
};
+1
View 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,
+1
View 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;
+1
View 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,