]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
d7867b31 | 2 | |
07630cea | 3 | #include <getopt.h> |
d7867b31 | 4 | #include <stdio.h> |
d7867b31 | 5 | #include <string.h> |
d7867b31 | 6 | |
07630cea | 7 | #include "string-util.h" |
d7867b31 KS |
8 | #include "udev.h" |
9 | ||
7781e063 KS |
10 | static bool initialized; |
11 | ||
d7867b31 | 12 | static const struct udev_builtin *builtins[] = { |
349cc4a5 | 13 | #if HAVE_BLKID |
912541b0 | 14 | [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid, |
f553b3b1 | 15 | #endif |
0bb91b50 | 16 | [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs, |
796b06c2 | 17 | [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb, |
912541b0 | 18 | [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id, |
9d7d42bc | 19 | [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard, |
349cc4a5 | 20 | #if HAVE_KMOD |
912541b0 | 21 | [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod, |
e3043162 | 22 | #endif |
a660c63c | 23 | [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id, |
0b99c9f8 | 24 | [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link, |
912541b0 | 25 | [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id, |
912541b0 | 26 | [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id, |
349cc4a5 | 27 | #if HAVE_ACL |
83cd6b75 KS |
28 | [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess, |
29 | #endif | |
d7867b31 KS |
30 | }; |
31 | ||
2024ed61 | 32 | void udev_builtin_init(void) { |
912541b0 | 33 | unsigned int i; |
912541b0 | 34 | |
7781e063 | 35 | if (initialized) |
4af113f9 | 36 | return; |
7781e063 | 37 | |
4af113f9 | 38 | for (i = 0; i < ELEMENTSOF(builtins); i++) |
8cacf69b | 39 | if (builtins[i] && builtins[i]->init) |
2024ed61 | 40 | builtins[i]->init(); |
7781e063 KS |
41 | |
42 | initialized = true; | |
aa29418a KS |
43 | } |
44 | ||
2024ed61 | 45 | void udev_builtin_exit(void) { |
912541b0 | 46 | unsigned int i; |
aa29418a | 47 | |
7781e063 KS |
48 | if (!initialized) |
49 | return; | |
50 | ||
8fef0ff2 | 51 | for (i = 0; i < ELEMENTSOF(builtins); i++) |
8cacf69b | 52 | if (builtins[i] && builtins[i]->exit) |
2024ed61 | 53 | builtins[i]->exit(); |
7781e063 KS |
54 | |
55 | initialized = false; | |
aa29418a KS |
56 | } |
57 | ||
2024ed61 | 58 | bool udev_builtin_validate(void) { |
912541b0 | 59 | unsigned int i; |
912541b0 | 60 | |
8fef0ff2 | 61 | for (i = 0; i < ELEMENTSOF(builtins); i++) |
2024ed61 | 62 | if (builtins[i] && builtins[i]->validate && builtins[i]->validate()) |
4af113f9 KS |
63 | return true; |
64 | return false; | |
4f1795cc KS |
65 | } |
66 | ||
2024ed61 | 67 | void udev_builtin_list(void) { |
912541b0 | 68 | unsigned int i; |
d7867b31 | 69 | |
8fef0ff2 | 70 | for (i = 0; i < ELEMENTSOF(builtins); i++) |
8cacf69b LZ |
71 | if (builtins[i]) |
72 | fprintf(stderr, " %-14s %s\n", builtins[i]->name, builtins[i]->help); | |
d7867b31 KS |
73 | } |
74 | ||
9ec6e95b | 75 | const char *udev_builtin_name(enum udev_builtin_cmd cmd) { |
f89d10ae DM |
76 | if (!builtins[cmd]) |
77 | return NULL; | |
78 | ||
912541b0 | 79 | return builtins[cmd]->name; |
d7867b31 KS |
80 | } |
81 | ||
9ec6e95b | 82 | bool udev_builtin_run_once(enum udev_builtin_cmd cmd) { |
f89d10ae | 83 | if (!builtins[cmd]) |
4e18de3d | 84 | return false; |
f89d10ae | 85 | |
912541b0 | 86 | return builtins[cmd]->run_once; |
81dadce5 KS |
87 | } |
88 | ||
9ec6e95b | 89 | enum udev_builtin_cmd udev_builtin_lookup(const char *command) { |
912541b0 KS |
90 | char name[UTIL_PATH_SIZE]; |
91 | enum udev_builtin_cmd i; | |
92 | char *pos; | |
93 | ||
d5a89d7d | 94 | strscpy(name, sizeof(name), command); |
912541b0 KS |
95 | pos = strchr(name, ' '); |
96 | if (pos) | |
97 | pos[0] = '\0'; | |
8fef0ff2 | 98 | for (i = 0; i < ELEMENTSOF(builtins); i++) |
8cacf69b | 99 | if (builtins[i] && streq(builtins[i]->name, name)) |
912541b0 KS |
100 | return i; |
101 | return UDEV_BUILTIN_MAX; | |
d7867b31 KS |
102 | } |
103 | ||
9ec6e95b | 104 | int udev_builtin_run(struct udev_device *dev, enum udev_builtin_cmd cmd, const char *command, bool test) { |
912541b0 KS |
105 | char arg[UTIL_PATH_SIZE]; |
106 | int argc; | |
107 | char *argv[128]; | |
108 | ||
f89d10ae DM |
109 | if (!builtins[cmd]) |
110 | return -EOPNOTSUPP; | |
111 | ||
e5f2783e KS |
112 | /* we need '0' here to reset the internal state */ |
113 | optind = 0; | |
d5a89d7d | 114 | strscpy(arg, sizeof(arg), command); |
2024ed61 | 115 | udev_build_argv(arg, &argc, argv); |
912541b0 | 116 | return builtins[cmd]->cmd(dev, argc, argv, test); |
d7867b31 KS |
117 | } |
118 | ||
9ec6e95b | 119 | int udev_builtin_add_property(struct udev_device *dev, bool test, const char *key, const char *val) { |
b94da8cf | 120 | udev_device_add_property(dev, key, val); |
d7867b31 | 121 | |
912541b0 KS |
122 | if (test) |
123 | printf("%s=%s\n", key, val); | |
124 | return 0; | |
d7867b31 | 125 | } |