]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/udev/udev-builtin.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / udev / udev-builtin.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 Copyright © 2007-2012 Kay Sievers <kay@vrfy.org>
4 ***/
5
6 #include <getopt.h>
7 #include <stdio.h>
8 #include <string.h>
9
10 #include "string-util.h"
11 #include "udev.h"
12
13 static bool initialized;
14
15 static const struct udev_builtin *builtins[] = {
16 #if HAVE_BLKID
17 [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
18 #endif
19 [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
20 [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
21 [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
22 [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
23 #if HAVE_KMOD
24 [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod,
25 #endif
26 [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id,
27 [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link,
28 [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id,
29 [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id,
30 #if HAVE_ACL
31 [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess,
32 #endif
33 };
34
35 void udev_builtin_init(struct udev *udev) {
36 unsigned int i;
37
38 if (initialized)
39 return;
40
41 for (i = 0; i < ELEMENTSOF(builtins); i++)
42 if (builtins[i] && builtins[i]->init)
43 builtins[i]->init(udev);
44
45 initialized = true;
46 }
47
48 void udev_builtin_exit(struct udev *udev) {
49 unsigned int i;
50
51 if (!initialized)
52 return;
53
54 for (i = 0; i < ELEMENTSOF(builtins); i++)
55 if (builtins[i] && builtins[i]->exit)
56 builtins[i]->exit(udev);
57
58 initialized = false;
59 }
60
61 bool udev_builtin_validate(struct udev *udev) {
62 unsigned int i;
63
64 for (i = 0; i < ELEMENTSOF(builtins); i++)
65 if (builtins[i] && builtins[i]->validate && builtins[i]->validate(udev))
66 return true;
67 return false;
68 }
69
70 void udev_builtin_list(struct udev *udev) {
71 unsigned int i;
72
73 for (i = 0; i < ELEMENTSOF(builtins); i++)
74 if (builtins[i])
75 fprintf(stderr, " %-14s %s\n", builtins[i]->name, builtins[i]->help);
76 }
77
78 const char *udev_builtin_name(enum udev_builtin_cmd cmd) {
79 if (!builtins[cmd])
80 return NULL;
81
82 return builtins[cmd]->name;
83 }
84
85 bool udev_builtin_run_once(enum udev_builtin_cmd cmd) {
86 if (!builtins[cmd])
87 return false;
88
89 return builtins[cmd]->run_once;
90 }
91
92 enum udev_builtin_cmd udev_builtin_lookup(const char *command) {
93 char name[UTIL_PATH_SIZE];
94 enum udev_builtin_cmd i;
95 char *pos;
96
97 strscpy(name, sizeof(name), command);
98 pos = strchr(name, ' ');
99 if (pos)
100 pos[0] = '\0';
101 for (i = 0; i < ELEMENTSOF(builtins); i++)
102 if (builtins[i] && streq(builtins[i]->name, name))
103 return i;
104 return UDEV_BUILTIN_MAX;
105 }
106
107 int udev_builtin_run(struct udev_device *dev, enum udev_builtin_cmd cmd, const char *command, bool test) {
108 char arg[UTIL_PATH_SIZE];
109 int argc;
110 char *argv[128];
111
112 if (!builtins[cmd])
113 return -EOPNOTSUPP;
114
115 /* we need '0' here to reset the internal state */
116 optind = 0;
117 strscpy(arg, sizeof(arg), command);
118 udev_build_argv(udev_device_get_udev(dev), arg, &argc, argv);
119 return builtins[cmd]->cmd(dev, argc, argv, test);
120 }
121
122 int udev_builtin_add_property(struct udev_device *dev, bool test, const char *key, const char *val) {
123 udev_device_add_property(dev, key, val);
124
125 if (test)
126 printf("%s=%s\n", key, val);
127 return 0;
128 }