]>
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 | |
0c9c0634 | 7 | #include "device-private.h" |
63918f92 | 8 | #include "device-util.h" |
07630cea | 9 | #include "string-util.h" |
0c9c0634 | 10 | #include "strv.h" |
07a26e42 | 11 | #include "udev-builtin.h" |
d7867b31 | 12 | |
7781e063 KS |
13 | static bool initialized; |
14 | ||
c45b369d | 15 | static const struct udev_builtin *builtins[_UDEV_BUILTIN_MAX] = { |
349cc4a5 | 16 | #if HAVE_BLKID |
912541b0 | 17 | [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid, |
f553b3b1 | 18 | #endif |
0bb91b50 | 19 | [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs, |
796b06c2 | 20 | [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb, |
912541b0 | 21 | [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id, |
9d7d42bc | 22 | [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard, |
349cc4a5 | 23 | #if HAVE_KMOD |
912541b0 | 24 | [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod, |
e3043162 | 25 | #endif |
a660c63c | 26 | [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id, |
0b99c9f8 | 27 | [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link, |
912541b0 | 28 | [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id, |
912541b0 | 29 | [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id, |
349cc4a5 | 30 | #if HAVE_ACL |
83cd6b75 KS |
31 | [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess, |
32 | #endif | |
d7867b31 KS |
33 | }; |
34 | ||
2024ed61 | 35 | void udev_builtin_init(void) { |
14cb109d | 36 | unsigned i; |
912541b0 | 37 | |
7781e063 | 38 | if (initialized) |
4af113f9 | 39 | return; |
7781e063 | 40 | |
c45b369d | 41 | for (i = 0; i < _UDEV_BUILTIN_MAX; i++) |
8cacf69b | 42 | if (builtins[i] && builtins[i]->init) |
2024ed61 | 43 | builtins[i]->init(); |
7781e063 KS |
44 | |
45 | initialized = true; | |
aa29418a KS |
46 | } |
47 | ||
2024ed61 | 48 | void udev_builtin_exit(void) { |
14cb109d | 49 | unsigned i; |
aa29418a | 50 | |
7781e063 KS |
51 | if (!initialized) |
52 | return; | |
53 | ||
c45b369d | 54 | for (i = 0; i < _UDEV_BUILTIN_MAX; i++) |
8cacf69b | 55 | if (builtins[i] && builtins[i]->exit) |
2024ed61 | 56 | builtins[i]->exit(); |
7781e063 KS |
57 | |
58 | initialized = false; | |
aa29418a KS |
59 | } |
60 | ||
2024ed61 | 61 | bool udev_builtin_validate(void) { |
14cb109d | 62 | unsigned i; |
912541b0 | 63 | |
c45b369d | 64 | for (i = 0; i < _UDEV_BUILTIN_MAX; i++) |
2024ed61 | 65 | if (builtins[i] && builtins[i]->validate && builtins[i]->validate()) |
4af113f9 KS |
66 | return true; |
67 | return false; | |
4f1795cc KS |
68 | } |
69 | ||
2024ed61 | 70 | void udev_builtin_list(void) { |
14cb109d | 71 | unsigned i; |
d7867b31 | 72 | |
c45b369d | 73 | for (i = 0; i < _UDEV_BUILTIN_MAX; i++) |
8cacf69b LZ |
74 | if (builtins[i]) |
75 | fprintf(stderr, " %-14s %s\n", builtins[i]->name, builtins[i]->help); | |
d7867b31 KS |
76 | } |
77 | ||
9ec6e95b | 78 | const char *udev_builtin_name(enum udev_builtin_cmd cmd) { |
c45b369d YW |
79 | assert(cmd >= 0 && cmd < _UDEV_BUILTIN_MAX); |
80 | ||
f89d10ae DM |
81 | if (!builtins[cmd]) |
82 | return NULL; | |
83 | ||
912541b0 | 84 | return builtins[cmd]->name; |
d7867b31 KS |
85 | } |
86 | ||
9ec6e95b | 87 | bool udev_builtin_run_once(enum udev_builtin_cmd cmd) { |
c45b369d YW |
88 | assert(cmd >= 0 && cmd < _UDEV_BUILTIN_MAX); |
89 | ||
f89d10ae | 90 | if (!builtins[cmd]) |
4e18de3d | 91 | return false; |
f89d10ae | 92 | |
912541b0 | 93 | return builtins[cmd]->run_once; |
81dadce5 KS |
94 | } |
95 | ||
9ec6e95b | 96 | enum udev_builtin_cmd udev_builtin_lookup(const char *command) { |
912541b0 | 97 | enum udev_builtin_cmd i; |
9b917abe | 98 | size_t n; |
912541b0 | 99 | |
9b917abe YW |
100 | assert(command); |
101 | ||
102 | command += strspn(command, WHITESPACE); | |
103 | n = strcspn(command, WHITESPACE); | |
c45b369d | 104 | for (i = 0; i < _UDEV_BUILTIN_MAX; i++) |
9b917abe | 105 | if (builtins[i] && strneq(builtins[i]->name, command, n)) |
912541b0 | 106 | return i; |
c45b369d YW |
107 | |
108 | return _UDEV_BUILTIN_INVALID; | |
d7867b31 KS |
109 | } |
110 | ||
3d6194e8 | 111 | int udev_builtin_run(sd_device *dev, enum udev_builtin_cmd cmd, const char *command, bool test) { |
6d93eeb7 | 112 | _cleanup_strv_free_ char **argv = NULL; |
912541b0 | 113 | |
c45b369d YW |
114 | assert(dev); |
115 | assert(cmd >= 0 && cmd < _UDEV_BUILTIN_MAX); | |
116 | assert(command); | |
117 | ||
f89d10ae DM |
118 | if (!builtins[cmd]) |
119 | return -EOPNOTSUPP; | |
120 | ||
6d93eeb7 YW |
121 | argv = strv_split_full(command, NULL, SPLIT_QUOTES | SPLIT_RELAX); |
122 | if (!argv) | |
123 | return -ENOMEM; | |
124 | ||
e5f2783e KS |
125 | /* we need '0' here to reset the internal state */ |
126 | optind = 0; | |
3d6194e8 | 127 | return builtins[cmd]->cmd(dev, strv_length(argv), argv, test); |
d7867b31 KS |
128 | } |
129 | ||
0c9c0634 YW |
130 | int udev_builtin_add_property(sd_device *dev, bool test, const char *key, const char *val) { |
131 | int r; | |
132 | ||
c45b369d YW |
133 | assert(dev); |
134 | assert(key); | |
135 | ||
0c9c0634 YW |
136 | r = device_add_property(dev, key, val); |
137 | if (r < 0) | |
63918f92 YW |
138 | return log_device_debug_errno(dev, r, "Failed to add property '%s%s%s'", |
139 | key, val ? "=" : "", strempty(val)); | |
d7867b31 | 140 | |
912541b0 | 141 | if (test) |
7e8bd58e | 142 | printf("%s=%s\n", key, strempty(val)); |
63918f92 | 143 | |
912541b0 | 144 | return 0; |
d7867b31 | 145 | } |