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