1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include "device-private.h"
7 #include "device-util.h"
8 #include "string-util.h"
10 #include "udev-builtin.h"
12 static bool initialized
;
14 static const UdevBuiltin
*const builtins
[_UDEV_BUILTIN_MAX
] = {
16 [UDEV_BUILTIN_BLKID
] = &udev_builtin_blkid
,
18 [UDEV_BUILTIN_BTRFS
] = &udev_builtin_btrfs
,
19 [UDEV_BUILTIN_HWDB
] = &udev_builtin_hwdb
,
20 [UDEV_BUILTIN_INPUT_ID
] = &udev_builtin_input_id
,
21 [UDEV_BUILTIN_KEYBOARD
] = &udev_builtin_keyboard
,
23 [UDEV_BUILTIN_KMOD
] = &udev_builtin_kmod
,
25 [UDEV_BUILTIN_NET_ID
] = &udev_builtin_net_id
,
26 [UDEV_BUILTIN_NET_LINK
] = &udev_builtin_net_setup_link
,
27 [UDEV_BUILTIN_PATH_ID
] = &udev_builtin_path_id
,
28 [UDEV_BUILTIN_USB_ID
] = &udev_builtin_usb_id
,
30 [UDEV_BUILTIN_UACCESS
] = &udev_builtin_uaccess
,
34 void udev_builtin_init(void) {
40 for (i
= 0; i
< _UDEV_BUILTIN_MAX
; i
++)
41 if (builtins
[i
] && builtins
[i
]->init
)
47 void udev_builtin_exit(void) {
53 for (i
= 0; i
< _UDEV_BUILTIN_MAX
; i
++)
54 if (builtins
[i
] && builtins
[i
]->exit
)
60 bool udev_builtin_validate(void) {
63 for (i
= 0; i
< _UDEV_BUILTIN_MAX
; i
++)
64 if (builtins
[i
] && builtins
[i
]->validate
&& builtins
[i
]->validate())
69 void udev_builtin_list(void) {
72 for (i
= 0; i
< _UDEV_BUILTIN_MAX
; i
++)
74 fprintf(stderr
, " %-14s %s\n", builtins
[i
]->name
, builtins
[i
]->help
);
77 const char *udev_builtin_name(UdevBuiltinCommand cmd
) {
78 assert(cmd
>= 0 && cmd
< _UDEV_BUILTIN_MAX
);
83 return builtins
[cmd
]->name
;
86 bool udev_builtin_run_once(UdevBuiltinCommand cmd
) {
87 assert(cmd
>= 0 && cmd
< _UDEV_BUILTIN_MAX
);
92 return builtins
[cmd
]->run_once
;
95 UdevBuiltinCommand
udev_builtin_lookup(const char *command
) {
101 command
+= strspn(command
, WHITESPACE
);
102 n
= strcspn(command
, WHITESPACE
);
103 for (i
= 0; i
< _UDEV_BUILTIN_MAX
; i
++)
104 if (builtins
[i
] && strneq(builtins
[i
]->name
, command
, n
))
107 return _UDEV_BUILTIN_INVALID
;
110 int udev_builtin_run(sd_device
*dev
, UdevBuiltinCommand cmd
, const char *command
, bool test
) {
111 _cleanup_strv_free_
char **argv
= NULL
;
114 assert(cmd
>= 0 && cmd
< _UDEV_BUILTIN_MAX
);
120 argv
= strv_split_full(command
, NULL
, SPLIT_QUOTES
| SPLIT_RELAX
);
124 /* we need '0' here to reset the internal state */
126 return builtins
[cmd
]->cmd(dev
, strv_length(argv
), argv
, test
);
129 int udev_builtin_add_property(sd_device
*dev
, bool test
, const char *key
, const char *val
) {
135 r
= device_add_property(dev
, key
, val
);
137 return log_device_debug_errno(dev
, r
, "Failed to add property '%s%s%s'",
138 key
, val
? "=" : "", strempty(val
));
141 printf("%s=%s\n", key
, strempty(val
));