]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/udev/udev-builtin.c
util-lib: split our string related calls from util.[ch] into its own file string...
[thirdparty/systemd.git] / src / udev / udev-builtin.c
1 /***
2 This file is part of systemd.
3
4 Copyright 2007-2012 Kay Sievers <kay@vrfy.org>
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include <getopt.h>
21 #include <stdio.h>
22 #include <string.h>
23
24 #include "string-util.h"
25 #include "udev.h"
26
27 static bool initialized;
28
29 static const struct udev_builtin *builtins[] = {
30 #ifdef HAVE_BLKID
31 [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
32 #endif
33 [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
34 [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
35 [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
36 [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
37 #ifdef HAVE_KMOD
38 [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod,
39 #endif
40 [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id,
41 [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link,
42 [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id,
43 [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id,
44 #ifdef HAVE_ACL
45 [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess,
46 #endif
47 };
48
49 void udev_builtin_init(struct udev *udev) {
50 unsigned int i;
51
52 if (initialized)
53 return;
54
55 for (i = 0; i < ELEMENTSOF(builtins); i++)
56 if (builtins[i] && builtins[i]->init)
57 builtins[i]->init(udev);
58
59 initialized = true;
60 }
61
62 void udev_builtin_exit(struct udev *udev) {
63 unsigned int i;
64
65 if (!initialized)
66 return;
67
68 for (i = 0; i < ELEMENTSOF(builtins); i++)
69 if (builtins[i] && builtins[i]->exit)
70 builtins[i]->exit(udev);
71
72 initialized = false;
73 }
74
75 bool udev_builtin_validate(struct udev *udev) {
76 unsigned int i;
77
78 for (i = 0; i < ELEMENTSOF(builtins); i++)
79 if (builtins[i] && builtins[i]->validate && builtins[i]->validate(udev))
80 return true;
81 return false;
82 }
83
84 void udev_builtin_list(struct udev *udev) {
85 unsigned int i;
86
87 for (i = 0; i < ELEMENTSOF(builtins); i++)
88 if (builtins[i])
89 fprintf(stderr, " %-14s %s\n", builtins[i]->name, builtins[i]->help);
90 }
91
92 const char *udev_builtin_name(enum udev_builtin_cmd cmd) {
93 if (!builtins[cmd])
94 return NULL;
95
96 return builtins[cmd]->name;
97 }
98
99 bool udev_builtin_run_once(enum udev_builtin_cmd cmd) {
100 if (!builtins[cmd])
101 return false;
102
103 return builtins[cmd]->run_once;
104 }
105
106 enum udev_builtin_cmd udev_builtin_lookup(const char *command) {
107 char name[UTIL_PATH_SIZE];
108 enum udev_builtin_cmd i;
109 char *pos;
110
111 strscpy(name, sizeof(name), command);
112 pos = strchr(name, ' ');
113 if (pos)
114 pos[0] = '\0';
115 for (i = 0; i < ELEMENTSOF(builtins); i++)
116 if (builtins[i] && streq(builtins[i]->name, name))
117 return i;
118 return UDEV_BUILTIN_MAX;
119 }
120
121 int udev_builtin_run(struct udev_device *dev, enum udev_builtin_cmd cmd, const char *command, bool test) {
122 char arg[UTIL_PATH_SIZE];
123 int argc;
124 char *argv[128];
125
126 if (!builtins[cmd])
127 return -EOPNOTSUPP;
128
129 /* we need '0' here to reset the internal state */
130 optind = 0;
131 strscpy(arg, sizeof(arg), command);
132 udev_build_argv(udev_device_get_udev(dev), arg, &argc, argv);
133 return builtins[cmd]->cmd(dev, argc, argv, test);
134 }
135
136 int udev_builtin_add_property(struct udev_device *dev, bool test, const char *key, const char *val) {
137 udev_device_add_property(dev, key, val);
138
139 if (test)
140 printf("%s=%s\n", key, val);
141 return 0;
142 }