From: Yu Watanabe Date: Sat, 27 Aug 2022 19:30:23 +0000 (+0900) Subject: sd-device: introduce device_open_from_devnum() X-Git-Tag: v252-rc1~308^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ff65036cfe95c3c16af3077b7067de33b88c5ba5;p=thirdparty%2Fsystemd.git sd-device: introduce device_open_from_devnum() --- diff --git a/src/libsystemd/sd-device/device-util.c b/src/libsystemd/sd-device/device-util.c index f1cd67aa289..f000278c755 100644 --- a/src/libsystemd/sd-device/device-util.c +++ b/src/libsystemd/sd-device/device-util.c @@ -3,6 +3,7 @@ #include "device-private.h" #include "device-util.h" #include "devnum-util.h" +#include "fd-util.h" #include "string-util.h" int devpath_from_devnum(mode_t mode, dev_t devnum, char **ret) { @@ -31,3 +32,34 @@ int devpath_from_devnum(mode_t mode, dev_t devnum, char **ret) { *ret = TAKE_PTR(s); return 0; } + +int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret) { + _cleanup_(sd_device_unrefp) sd_device *dev = NULL; + _cleanup_close_ int fd = -1; + int r; + + r = device_new_from_mode_and_devnum(&dev, mode, devnum); + if (r < 0) + return r; + + fd = sd_device_open(dev, flags); + if (fd < 0) + return fd; + + if (ret) { + const char *devname; + char *s; + + r = sd_device_get_devname(dev, &devname); + if (r < 0) + return r; + + s = strdup(devname); + if (!s) + return -ENOMEM; + + *ret = s; + } + + return TAKE_FD(fd); +} diff --git a/src/libsystemd/sd-device/device-util.h b/src/libsystemd/sd-device/device-util.h index 6150c45082c..53943b83822 100644 --- a/src/libsystemd/sd-device/device-util.h +++ b/src/libsystemd/sd-device/device-util.h @@ -82,3 +82,4 @@ #define log_device_error_errno(device, error, ...) log_device_full_errno(device, LOG_ERR, error, __VA_ARGS__) int devpath_from_devnum(mode_t mode, dev_t devnum, char **ret); +int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret);