]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udev-builtin.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / udev / udev-builtin.c
CommitLineData
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
13static bool initialized;
14
c45b369d 15static 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 35void 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 48void 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 61bool 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 70void 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 78const 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 87bool 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 96enum 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 111int 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
130int 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}