]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
88a6477e | 2 | /*** |
96b2fb93 LP |
3 | Copyright © 2008-2012 Kay Sievers <kay@vrfy.org> |
4 | Copyright © 2015 Tom Gundersen <teg@jklm.no> | |
88a6477e | 5 | ***/ |
8dfc8dbe | 6 | |
b4bbcaa9 TA |
7 | #include "libudev.h" |
8 | ||
f4ac4d1a | 9 | #include "device-private.h" |
07630cea LP |
10 | #include "libudev-device-internal.h" |
11 | #include "libudev-private.h" | |
f4ac4d1a TG |
12 | |
13 | int udev_device_tag_index(struct udev_device *udev_device, struct udev_device *udev_device_old, bool add) { | |
14 | sd_device *device_old = NULL; | |
15 | int r; | |
16 | ||
17 | assert(udev_device); | |
18 | ||
19 | if (udev_device_old) | |
20 | device_old = udev_device_old->device; | |
21 | ||
22 | r = device_tag_index(udev_device->device, device_old, add); | |
23 | if (r < 0) | |
24 | return r; | |
25 | ||
26 | return 0; | |
27 | } | |
28 | ||
29 | int udev_device_update_db(struct udev_device *udev_device) { | |
30 | int r; | |
31 | ||
32 | assert(udev_device); | |
33 | ||
34 | r = device_update_db(udev_device->device); | |
35 | if (r < 0) | |
36 | return r; | |
37 | ||
38 | return 0; | |
39 | } | |
40 | ||
41 | int udev_device_delete_db(struct udev_device *udev_device) { | |
42 | int r; | |
43 | ||
44 | assert(udev_device); | |
45 | ||
46 | r = device_delete_db(udev_device->device); | |
47 | if (r < 0) | |
48 | return r; | |
49 | ||
50 | return 0; | |
51 | } | |
52 | ||
53 | int udev_device_get_ifindex(struct udev_device *udev_device) { | |
54 | int r, ifindex; | |
55 | ||
56 | assert(udev_device); | |
57 | ||
58 | r = sd_device_get_ifindex(udev_device->device, &ifindex); | |
59 | if (r < 0) | |
60 | return r; | |
61 | ||
62 | return ifindex; | |
63 | } | |
64 | ||
65 | const char *udev_device_get_devpath_old(struct udev_device *udev_device) { | |
66 | const char *devpath_old = NULL; | |
67 | int r; | |
2b41e68a | 68 | |
f4ac4d1a TG |
69 | assert(udev_device); |
70 | ||
71 | r = sd_device_get_property_value(udev_device->device, "DEVPATH_OLD", &devpath_old); | |
72 | if (r < 0 && r != -ENOENT) { | |
73 | errno = -r; | |
74 | return NULL; | |
912541b0 | 75 | } |
f4ac4d1a TG |
76 | |
77 | return devpath_old; | |
c1dbe11d | 78 | } |
28460195 | 79 | |
f4ac4d1a TG |
80 | mode_t udev_device_get_devnode_mode(struct udev_device *udev_device) { |
81 | mode_t mode; | |
82 | int r; | |
83 | ||
84 | assert(udev_device); | |
85 | ||
86 | r = device_get_devnode_mode(udev_device->device, &mode); | |
87 | if (r < 0) { | |
88 | errno = -r; | |
89 | return 0; | |
912541b0 KS |
90 | } |
91 | ||
f4ac4d1a TG |
92 | return mode; |
93 | } | |
912541b0 | 94 | |
f4ac4d1a TG |
95 | uid_t udev_device_get_devnode_uid(struct udev_device *udev_device) { |
96 | uid_t uid; | |
97 | int r; | |
98 | ||
99 | assert(udev_device); | |
100 | ||
101 | r = device_get_devnode_uid(udev_device->device, &uid); | |
102 | if (r < 0) { | |
103 | errno = -r; | |
104 | return 0; | |
105 | } | |
106 | ||
107 | return uid; | |
28460195 KS |
108 | } |
109 | ||
f4ac4d1a TG |
110 | gid_t udev_device_get_devnode_gid(struct udev_device *udev_device) { |
111 | gid_t gid; | |
112 | int r; | |
113 | ||
114 | assert(udev_device); | |
115 | ||
116 | r = device_get_devnode_gid(udev_device->device, &gid); | |
117 | if (r < 0) { | |
118 | errno = -r; | |
912541b0 KS |
119 | return 0; |
120 | } | |
121 | ||
f4ac4d1a TG |
122 | return gid; |
123 | } | |
124 | ||
125 | void udev_device_ensure_usec_initialized(struct udev_device *udev_device, struct udev_device *udev_device_old) { | |
f4ac4d1a TG |
126 | assert(udev_device); |
127 | ||
90b33a27 ZJS |
128 | device_ensure_usec_initialized(udev_device->device, |
129 | udev_device_old ? udev_device_old->device : NULL); | |
f4ac4d1a TG |
130 | } |
131 | ||
132 | char **udev_device_get_properties_envp(struct udev_device *udev_device) { | |
133 | char **envp; | |
134 | int r; | |
135 | ||
136 | assert(udev_device); | |
137 | ||
138 | r = device_get_properties_strv(udev_device->device, &envp); | |
139 | if (r < 0) { | |
140 | errno = -r; | |
141 | return NULL; | |
912541b0 KS |
142 | } |
143 | ||
f4ac4d1a TG |
144 | return envp; |
145 | } | |
146 | ||
147 | ssize_t udev_device_get_properties_monitor_buf(struct udev_device *udev_device, const char **buf) { | |
148 | const char *nulstr; | |
149 | size_t len; | |
150 | int r; | |
151 | ||
152 | assert(udev_device); | |
153 | assert(buf); | |
154 | ||
155 | r = device_get_properties_nulstr(udev_device->device, (const uint8_t **)&nulstr, &len); | |
029f4f21 | 156 | if (r < 0) |
f4ac4d1a TG |
157 | return r; |
158 | ||
159 | *buf = nulstr; | |
160 | ||
161 | return len; | |
162 | } | |
163 | ||
164 | int udev_device_get_devlink_priority(struct udev_device *udev_device) { | |
165 | int priority, r; | |
166 | ||
167 | assert(udev_device); | |
168 | ||
169 | r = device_get_devlink_priority(udev_device->device, &priority); | |
170 | if (r < 0) | |
171 | return r; | |
172 | ||
173 | return priority; | |
174 | } | |
175 | ||
176 | int udev_device_get_watch_handle(struct udev_device *udev_device) { | |
177 | int handle, r; | |
178 | ||
179 | assert(udev_device); | |
180 | ||
181 | r = device_get_watch_handle(udev_device->device, &handle); | |
182 | if (r < 0) | |
183 | return r; | |
184 | ||
185 | return handle; | |
186 | } | |
187 | ||
188 | void udev_device_set_is_initialized(struct udev_device *udev_device) { | |
189 | assert(udev_device); | |
190 | ||
191 | device_set_is_initialized(udev_device->device); | |
192 | } | |
193 | ||
194 | int udev_device_rename(struct udev_device *udev_device, const char *name) { | |
195 | int r; | |
196 | ||
197 | assert(udev_device); | |
198 | ||
199 | r = device_rename(udev_device->device, name); | |
200 | if (r < 0) | |
201 | return r; | |
202 | ||
912541b0 | 203 | return 0; |
ca999860 GKH |
204 | } |
205 | ||
f4ac4d1a TG |
206 | struct udev_device *udev_device_shallow_clone(struct udev_device *old_device) { |
207 | struct udev_device *device; | |
208 | int r; | |
209 | ||
210 | assert(old_device); | |
211 | ||
212 | device = udev_device_new(old_device->udev); | |
213 | if (!device) | |
214 | return NULL; | |
215 | ||
216 | r = device_shallow_clone(old_device->device, &device->device); | |
217 | if (r < 0) { | |
218 | udev_device_unref(device); | |
219 | errno = -r; | |
220 | return NULL; | |
221 | } | |
222 | ||
223 | return device; | |
224 | } | |
225 | ||
226 | struct udev_device *udev_device_clone_with_db(struct udev_device *udev_device_old) { | |
227 | struct udev_device *udev_device; | |
228 | int r; | |
229 | ||
230 | assert(udev_device_old); | |
231 | ||
232 | udev_device = udev_device_new(udev_device_old->udev); | |
233 | if (!udev_device) | |
234 | return NULL; | |
235 | ||
236 | r = device_clone_with_db(udev_device_old->device, &udev_device->device); | |
237 | if (r < 0) { | |
238 | udev_device_unref(udev_device); | |
239 | errno = -r; | |
240 | return NULL; | |
241 | } | |
242 | ||
243 | return udev_device; | |
244 | } | |
245 | ||
246 | struct udev_device *udev_device_new_from_nulstr(struct udev *udev, char *nulstr, ssize_t buflen) { | |
247 | struct udev_device *device; | |
248 | int r; | |
249 | ||
250 | device = udev_device_new(udev); | |
251 | if (!device) | |
252 | return NULL; | |
253 | ||
254 | r = device_new_from_nulstr(&device->device, (uint8_t*)nulstr, buflen); | |
255 | if (r < 0) { | |
256 | udev_device_unref(device); | |
257 | errno = -r; | |
258 | return NULL; | |
259 | } | |
260 | ||
261 | return device; | |
262 | } | |
263 | ||
264 | struct udev_device *udev_device_new_from_synthetic_event(struct udev *udev, const char *syspath, const char *action) { | |
265 | struct udev_device *device; | |
266 | int r; | |
267 | ||
268 | device = udev_device_new(udev); | |
269 | if (!device) | |
270 | return NULL; | |
271 | ||
272 | r = device_new_from_synthetic_event(&device->device, syspath, action); | |
273 | if (r < 0) { | |
274 | udev_device_unref(device); | |
275 | errno = -r; | |
276 | return NULL; | |
277 | } | |
278 | ||
279 | return device; | |
280 | } | |
281 | ||
282 | int udev_device_copy_properties(struct udev_device *udev_device_dst, struct udev_device *udev_device_src) { | |
283 | int r; | |
284 | ||
285 | assert(udev_device_dst); | |
286 | assert(udev_device_src); | |
287 | ||
288 | r = device_copy_properties(udev_device_dst->device, udev_device_src->device); | |
289 | if (r < 0) | |
290 | return r; | |
291 | ||
292 | return 0; | |
293 | } | |
294 | ||
295 | const char *udev_device_get_id_filename(struct udev_device *udev_device) { | |
296 | const char *filename; | |
297 | int r; | |
298 | ||
299 | assert(udev_device); | |
300 | ||
301 | r = device_get_id_filename(udev_device->device, &filename); | |
302 | if (r < 0) { | |
303 | errno = -r; | |
304 | return NULL; | |
305 | } | |
306 | ||
307 | return filename; | |
308 | } | |
309 | ||
310 | int udev_device_set_watch_handle(struct udev_device *udev_device, int handle) { | |
912541b0 | 311 | |
f4ac4d1a TG |
312 | assert(udev_device); |
313 | ||
314 | device_set_watch_handle(udev_device->device, handle); | |
315 | ||
316 | return 0; | |
317 | } | |
318 | ||
319 | void udev_device_set_db_persist(struct udev_device *udev_device) { | |
320 | assert(udev_device); | |
321 | ||
322 | device_set_db_persist(udev_device->device); | |
323 | } | |
324 | ||
325 | int udev_device_set_devlink_priority(struct udev_device *udev_device, int priority) { | |
326 | assert(udev_device); | |
327 | ||
328 | device_set_devlink_priority(udev_device->device, priority); | |
3c0bab4a | 329 | |
912541b0 | 330 | return 0; |
8e41d35d | 331 | } |
f4ac4d1a TG |
332 | |
333 | int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink) { | |
334 | int r; | |
335 | ||
336 | assert(udev_device); | |
337 | ||
338 | r = device_add_devlink(udev_device->device, devlink); | |
339 | if (r < 0) | |
340 | return r; | |
341 | ||
342 | return 0; | |
343 | } | |
344 | ||
345 | int udev_device_add_property(struct udev_device *udev_device, const char *property, const char *value) { | |
346 | int r; | |
347 | ||
348 | assert(udev_device); | |
349 | ||
350 | r = device_add_property(udev_device->device, property, value); | |
351 | if (r < 0) | |
352 | return r; | |
353 | ||
354 | return 0; | |
355 | } | |
356 | ||
357 | int udev_device_add_tag(struct udev_device *udev_device, const char *tag) { | |
358 | int r; | |
359 | ||
360 | assert(udev_device); | |
361 | ||
362 | r = device_add_tag(udev_device->device, tag); | |
363 | if (r < 0) | |
364 | return r; | |
365 | ||
366 | return 0; | |
367 | } | |
368 | ||
369 | void udev_device_remove_tag(struct udev_device *udev_device, const char *tag) { | |
370 | assert(udev_device); | |
371 | ||
372 | device_remove_tag(udev_device->device, tag); | |
373 | } | |
374 | ||
375 | void udev_device_cleanup_tags_list(struct udev_device *udev_device) { | |
376 | assert(udev_device); | |
377 | ||
378 | device_cleanup_tags(udev_device->device); | |
379 | } | |
380 | ||
381 | void udev_device_cleanup_devlinks_list(struct udev_device *udev_device) { | |
382 | assert(udev_device); | |
383 | ||
384 | device_cleanup_devlinks(udev_device->device); | |
385 | } | |
386 | ||
387 | void udev_device_set_info_loaded(struct udev_device *udev_device) { | |
388 | assert(udev_device); | |
389 | ||
390 | device_seal(udev_device->device); | |
391 | } | |
107f2e25 TG |
392 | |
393 | void udev_device_read_db(struct udev_device *udev_device) { | |
394 | assert(udev_device); | |
395 | ||
396 | device_read_db_force(udev_device->device); | |
397 | } |