]>
Commit | Line | Data |
---|---|---|
0ef6f454 LP |
1 | #pragma once |
2 | ||
f0083e3d | 3 | /* |
f0083e3d | 4 | * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com> |
1298001e | 5 | * Copyright (C) 2003-2010 Kay Sievers <kay@vrfy.org> |
f0083e3d | 6 | * |
55e9959b KS |
7 | * This program is free software: you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation, either version 2 of the License, or | |
10 | * (at your option) any later version. | |
f0083e3d | 11 | * |
55e9959b KS |
12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
f0083e3d GKH |
19 | */ |
20 | ||
c076a2bd | 21 | #include <sys/param.h> |
27d13af7 | 22 | #include <sys/sysmacros.h> |
07630cea | 23 | #include <sys/types.h> |
1aa1e248 | 24 | |
48a9b173 | 25 | #include "libudev.h" |
07630cea LP |
26 | #include "sd-netlink.h" |
27 | ||
e9a5ef7c | 28 | #include "label.h" |
07630cea LP |
29 | #include "libudev-private.h" |
30 | #include "macro.h" | |
775f8b3c | 31 | #include "strv.h" |
07630cea | 32 | #include "util.h" |
f0083e3d | 33 | |
aa8734ff | 34 | struct udev_event { |
912541b0 KS |
35 | struct udev *udev; |
36 | struct udev_device *dev; | |
37 | struct udev_device *dev_parent; | |
38 | struct udev_device *dev_db; | |
39 | char *name; | |
40 | char *program_result; | |
41 | mode_t mode; | |
42 | uid_t uid; | |
43 | gid_t gid; | |
c26547d6 | 44 | struct udev_list seclabel_list; |
912541b0 KS |
45 | struct udev_list run_list; |
46 | int exec_delay; | |
40fe8b11 | 47 | usec_t birth_usec; |
1c4baffc | 48 | sd_netlink *rtnl; |
912541b0 KS |
49 | unsigned int builtin_run; |
50 | unsigned int builtin_ret; | |
912541b0 KS |
51 | bool inotify_watch; |
52 | bool inotify_watch_final; | |
1edefa4f | 53 | bool group_set; |
912541b0 | 54 | bool group_final; |
1edefa4f | 55 | bool owner_set; |
912541b0 KS |
56 | bool owner_final; |
57 | bool mode_set; | |
58 | bool mode_final; | |
59 | bool name_final; | |
60 | bool devlink_final; | |
61 | bool run_final; | |
aa8734ff | 62 | }; |
aa8734ff | 63 | |
bd284db1 | 64 | struct udev_watch { |
912541b0 KS |
65 | struct udev_list_node node; |
66 | int handle; | |
67 | char *name; | |
bd284db1 SJR |
68 | }; |
69 | ||
c7521974 | 70 | /* udev-rules.c */ |
f1128767 | 71 | struct udev_rules; |
37ed4f56 | 72 | struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names); |
7c85d636 | 73 | struct udev_rules *udev_rules_unref(struct udev_rules *rules); |
6ada823a | 74 | bool udev_rules_check_timestamp(struct udev_rules *rules); |
4fd6af76 ZJS |
75 | void udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event, |
76 | usec_t timeout_usec, usec_t timeout_warn_usec, | |
77 | struct udev_list *properties_list); | |
84b6ad70 | 78 | int udev_rules_apply_static_dev_perms(struct udev_rules *rules); |
f1128767 KS |
79 | |
80 | /* udev-event.c */ | |
37ed4f56 KS |
81 | struct udev_event *udev_event_new(struct udev_device *dev); |
82 | void udev_event_unref(struct udev_event *event); | |
e20a9171 DS |
83 | size_t udev_event_apply_format(struct udev_event *event, |
84 | const char *src, char *dest, size_t size, | |
85 | bool replace_whitespace); | |
37ed4f56 | 86 | int udev_event_apply_subsys_kernel(struct udev_event *event, const char *string, |
912541b0 | 87 | char *result, size_t maxsize, int read_value); |
2181d30a | 88 | int udev_event_spawn(struct udev_event *event, |
dd5eddd2 | 89 | usec_t timeout_usec, |
67117413 | 90 | usec_t timeout_warn_usec, |
53318514 | 91 | bool accept_failure, |
bbf35206 | 92 | const char *cmd, char *result, size_t ressize); |
adeba500 KS |
93 | void udev_event_execute_rules(struct udev_event *event, |
94 | usec_t timeout_usec, usec_t timeout_warn_usec, | |
95 | struct udev_list *properties_list, | |
8314de1d TG |
96 | struct udev_rules *rules); |
97 | void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec); | |
e216e514 | 98 | int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]); |
c7521974 | 99 | |
bd284db1 | 100 | /* udev-watch.c */ |
1e03b754 | 101 | int udev_watch_init(struct udev *udev); |
37ed4f56 KS |
102 | void udev_watch_restore(struct udev *udev); |
103 | void udev_watch_begin(struct udev *udev, struct udev_device *dev); | |
104 | void udev_watch_end(struct udev *udev, struct udev_device *dev); | |
105 | struct udev_device *udev_watch_lookup(struct udev *udev, int wd); | |
bd284db1 | 106 | |
aa8734ff | 107 | /* udev-node.c */ |
c26547d6 KS |
108 | void udev_node_add(struct udev_device *dev, bool apply, |
109 | mode_t mode, uid_t uid, gid_t gid, | |
110 | struct udev_list *seclabel_list); | |
e7f32890 | 111 | void udev_node_remove(struct udev_device *dev); |
37ed4f56 | 112 | void udev_node_update_old_links(struct udev_device *dev, struct udev_device *dev_old); |
aa8734ff | 113 | |
c15d02e5 KS |
114 | /* udev-ctrl.c */ |
115 | struct udev_ctrl; | |
5cc4112e KS |
116 | struct udev_ctrl *udev_ctrl_new(struct udev *udev); |
117 | struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd); | |
c15d02e5 | 118 | int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl); |
c15d02e5 | 119 | struct udev_ctrl *udev_ctrl_unref(struct udev_ctrl *uctrl); |
1f5a5100 | 120 | int udev_ctrl_cleanup(struct udev_ctrl *uctrl); |
c15d02e5 KS |
121 | struct udev *udev_ctrl_get_udev(struct udev_ctrl *uctrl); |
122 | int udev_ctrl_get_fd(struct udev_ctrl *uctrl); | |
123 | int udev_ctrl_send_set_log_level(struct udev_ctrl *uctrl, int priority, int timeout); | |
124 | int udev_ctrl_send_stop_exec_queue(struct udev_ctrl *uctrl, int timeout); | |
125 | int udev_ctrl_send_start_exec_queue(struct udev_ctrl *uctrl, int timeout); | |
7c85d636 | 126 | int udev_ctrl_send_reload(struct udev_ctrl *uctrl, int timeout); |
c15d02e5 KS |
127 | int udev_ctrl_send_ping(struct udev_ctrl *uctrl, int timeout); |
128 | int udev_ctrl_send_exit(struct udev_ctrl *uctrl, int timeout); | |
129 | int udev_ctrl_send_set_env(struct udev_ctrl *uctrl, const char *key, int timeout); | |
130 | int udev_ctrl_send_set_children_max(struct udev_ctrl *uctrl, int count, int timeout); | |
131 | struct udev_ctrl_connection; | |
132 | struct udev_ctrl_connection *udev_ctrl_get_connection(struct udev_ctrl *uctrl); | |
133 | struct udev_ctrl_connection *udev_ctrl_connection_ref(struct udev_ctrl_connection *conn); | |
134 | struct udev_ctrl_connection *udev_ctrl_connection_unref(struct udev_ctrl_connection *conn); | |
135 | struct udev_ctrl_msg; | |
136 | struct udev_ctrl_msg *udev_ctrl_receive_msg(struct udev_ctrl_connection *conn); | |
c15d02e5 KS |
137 | struct udev_ctrl_msg *udev_ctrl_msg_unref(struct udev_ctrl_msg *ctrl_msg); |
138 | int udev_ctrl_get_set_log_level(struct udev_ctrl_msg *ctrl_msg); | |
139 | int udev_ctrl_get_stop_exec_queue(struct udev_ctrl_msg *ctrl_msg); | |
140 | int udev_ctrl_get_start_exec_queue(struct udev_ctrl_msg *ctrl_msg); | |
7c85d636 | 141 | int udev_ctrl_get_reload(struct udev_ctrl_msg *ctrl_msg); |
c15d02e5 KS |
142 | int udev_ctrl_get_ping(struct udev_ctrl_msg *ctrl_msg); |
143 | int udev_ctrl_get_exit(struct udev_ctrl_msg *ctrl_msg); | |
144 | const char *udev_ctrl_get_set_env(struct udev_ctrl_msg *ctrl_msg); | |
145 | int udev_ctrl_get_set_children_max(struct udev_ctrl_msg *ctrl_msg); | |
146 | ||
d7867b31 KS |
147 | /* built-in commands */ |
148 | enum udev_builtin_cmd { | |
349cc4a5 | 149 | #if HAVE_BLKID |
912541b0 | 150 | UDEV_BUILTIN_BLKID, |
f553b3b1 | 151 | #endif |
0bb91b50 | 152 | UDEV_BUILTIN_BTRFS, |
796b06c2 | 153 | UDEV_BUILTIN_HWDB, |
912541b0 | 154 | UDEV_BUILTIN_INPUT_ID, |
9d7d42bc | 155 | UDEV_BUILTIN_KEYBOARD, |
349cc4a5 | 156 | #if HAVE_KMOD |
912541b0 | 157 | UDEV_BUILTIN_KMOD, |
e3043162 | 158 | #endif |
a660c63c | 159 | UDEV_BUILTIN_NET_ID, |
af6f0d42 | 160 | UDEV_BUILTIN_NET_LINK, |
912541b0 | 161 | UDEV_BUILTIN_PATH_ID, |
912541b0 | 162 | UDEV_BUILTIN_USB_ID, |
349cc4a5 | 163 | #if HAVE_ACL |
83cd6b75 KS |
164 | UDEV_BUILTIN_UACCESS, |
165 | #endif | |
912541b0 | 166 | UDEV_BUILTIN_MAX |
d7867b31 KS |
167 | }; |
168 | struct udev_builtin { | |
912541b0 KS |
169 | const char *name; |
170 | int (*cmd)(struct udev_device *dev, int argc, char *argv[], bool test); | |
171 | const char *help; | |
172 | int (*init)(struct udev *udev); | |
173 | void (*exit)(struct udev *udev); | |
174 | bool (*validate)(struct udev *udev); | |
175 | bool run_once; | |
d7867b31 | 176 | }; |
349cc4a5 | 177 | #if HAVE_BLKID |
81dadce5 | 178 | extern const struct udev_builtin udev_builtin_blkid; |
f553b3b1 | 179 | #endif |
0bb91b50 | 180 | extern const struct udev_builtin udev_builtin_btrfs; |
796b06c2 | 181 | extern const struct udev_builtin udev_builtin_hwdb; |
57f4ef67 | 182 | extern const struct udev_builtin udev_builtin_input_id; |
9d7d42bc | 183 | extern const struct udev_builtin udev_builtin_keyboard; |
349cc4a5 | 184 | #if HAVE_KMOD |
81dadce5 | 185 | extern const struct udev_builtin udev_builtin_kmod; |
e3043162 | 186 | #endif |
a660c63c | 187 | extern const struct udev_builtin udev_builtin_net_id; |
0b99c9f8 | 188 | extern const struct udev_builtin udev_builtin_net_setup_link; |
57f4ef67 KS |
189 | extern const struct udev_builtin udev_builtin_path_id; |
190 | extern const struct udev_builtin udev_builtin_usb_id; | |
83cd6b75 | 191 | extern const struct udev_builtin udev_builtin_uaccess; |
4af113f9 | 192 | void udev_builtin_init(struct udev *udev); |
4f1795cc | 193 | void udev_builtin_exit(struct udev *udev); |
81dadce5 | 194 | enum udev_builtin_cmd udev_builtin_lookup(const char *command); |
d7867b31 | 195 | const char *udev_builtin_name(enum udev_builtin_cmd cmd); |
81dadce5 KS |
196 | bool udev_builtin_run_once(enum udev_builtin_cmd cmd); |
197 | int udev_builtin_run(struct udev_device *dev, enum udev_builtin_cmd cmd, const char *command, bool test); | |
4f1795cc | 198 | void udev_builtin_list(struct udev *udev); |
fc863dea | 199 | bool udev_builtin_validate(struct udev *udev); |
c38a141b | 200 | int udev_builtin_add_property(struct udev_device *dev, bool test, const char *key, const char *val); |
a4bbef09 KS |
201 | int udev_builtin_hwdb_lookup(struct udev_device *dev, const char *prefix, const char *modalias, |
202 | const char *filter, bool test); | |
80df994c | 203 | |
80df994c KS |
204 | /* udevadm commands */ |
205 | struct udevadm_cmd { | |
912541b0 KS |
206 | const char *name; |
207 | int (*cmd)(struct udev *udev, int argc, char *argv[]); | |
208 | const char *help; | |
209 | int debug; | |
80df994c KS |
210 | }; |
211 | extern const struct udevadm_cmd udevadm_info; | |
212 | extern const struct udevadm_cmd udevadm_trigger; | |
213 | extern const struct udevadm_cmd udevadm_settle; | |
214 | extern const struct udevadm_cmd udevadm_control; | |
215 | extern const struct udevadm_cmd udevadm_monitor; | |
796b06c2 | 216 | extern const struct udevadm_cmd udevadm_hwdb; |
80df994c KS |
217 | extern const struct udevadm_cmd udevadm_test; |
218 | extern const struct udevadm_cmd udevadm_test_builtin; |