udev: add builtin that reports current factory reset state
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user