]> git.proxmox.com Git - systemd.git/blame - src/libudev/libudev-device-private.c
New upstream version 236
[systemd.git] / src / libudev / libudev-device-private.c
CommitLineData
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
28int 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
44int 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
56int 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
68int 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
80const 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
95mode_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
110uid_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
125gid_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
140void 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
147char **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
162ssize_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
179int 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
191int 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
203void 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
209int 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
221struct 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
241struct 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
261struct 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
279struct 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
297int 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
310const 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
325int 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
334void 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
340int 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
348int 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
360int 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
372int 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
384void 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
390void udev_device_cleanup_tags_list(struct udev_device *udev_device) {
391 assert(udev_device);
392
393 device_cleanup_tags(udev_device->device);
394}
395
396void udev_device_cleanup_devlinks_list(struct udev_device *udev_device) {
397 assert(udev_device);
398
399 device_cleanup_devlinks(udev_device->device);
400}
401
402void udev_device_set_info_loaded(struct udev_device *udev_device) {
403 assert(udev_device);
404
405 device_seal(udev_device->device);
406}
407
408void udev_device_read_db(struct udev_device *udev_device) {
409 assert(udev_device);
410
411 device_read_db_force(udev_device->device);
412}