]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-device/device-util.c
56acec67f6de2a2a4b536b685ecef60c0366fcec
[thirdparty/systemd.git] / src / libsystemd / sd-device / device-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "device-private.h"
4 #include "device-util.h"
5 #include "devnum-util.h"
6 #include "fd-util.h"
7 #include "string-util.h"
8
9 int devname_from_devnum(mode_t mode, dev_t devnum, char **ret) {
10 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
11 _cleanup_free_ char *s = NULL;
12 const char *devname;
13 int r;
14
15 assert(ret);
16
17 if (major(devnum) == 0 && minor(devnum) == 0)
18 return device_path_make_inaccessible(mode, ret);
19
20 r = device_new_from_mode_and_devnum(&dev, mode, devnum);
21 if (r < 0)
22 return r;
23
24 r = sd_device_get_devname(dev, &devname);
25 if (r < 0)
26 return r;
27
28 s = strdup(devname);
29 if (!s)
30 return -ENOMEM;
31
32 *ret = TAKE_PTR(s);
33 return 0;
34 }
35
36 int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret) {
37 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
38 _cleanup_close_ int fd = -EBADF;
39 int r;
40
41 r = device_new_from_mode_and_devnum(&dev, mode, devnum);
42 if (r < 0)
43 return r;
44
45 fd = sd_device_open(dev, flags);
46 if (fd < 0)
47 return fd;
48
49 if (ret) {
50 const char *devname;
51 char *s;
52
53 r = sd_device_get_devname(dev, &devname);
54 if (r < 0)
55 return r;
56
57 s = strdup(devname);
58 if (!s)
59 return -ENOMEM;
60
61 *ret = s;
62 }
63
64 return TAKE_FD(fd);
65 }