From: Zbigniew Jędrzejewski-Szmek Date: Tue, 23 Aug 2022 14:24:02 +0000 (+0200) Subject: sd-device: add helper to read a unsigned int attribute X-Git-Tag: v252-rc1~356^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=48a511cf92cbf202e9ef6064a9b5ebd1f497e1a8;p=thirdparty%2Fsystemd.git sd-device: add helper to read a unsigned int attribute There are dozens of places where this could be used, but I don't want to do the conversion now because it's quite a bit of work. I think we could export this function later on, because reading numerical attributes is so common. But for now, I'm just adding the helper to use it one place. --- diff --git a/src/libsystemd/sd-device/device-private.h b/src/libsystemd/sd-device/device-private.h index 3d670a3afcc..d993b77b49c 100644 --- a/src/libsystemd/sd-device/device-private.h +++ b/src/libsystemd/sd-device/device-private.h @@ -18,6 +18,7 @@ static inline int device_new_from_watch_handle(sd_device **ret, int wd) { } int device_get_property_bool(sd_device *device, const char *key); +int device_get_sysattr_unsigned(sd_device *device, const char *sysattr, unsigned *ret_value); int device_get_sysattr_bool(sd_device *device, const char *sysattr); int device_get_device_id(sd_device *device, const char **ret); int device_get_devlink_priority(sd_device *device, int *ret); diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 6bc4e6a019f..51bee24d511 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -2206,6 +2206,25 @@ _public_ int sd_device_get_sysattr_value(sd_device *device, const char *sysattr, return 0; } +int device_get_sysattr_unsigned(sd_device *device, const char *sysattr, unsigned *ret_value) { + const char *value; + int r; + + r = sd_device_get_sysattr_value(device, sysattr, &value); + if (r < 0) + return r; + + unsigned v; + r = safe_atou(value, &v); + if (r < 0) + return log_device_debug_errno(device, r, "Failed to parse '%s' attribute: %m", sysattr); + + if (ret_value) + *ret_value = v; + /* We return "true" if the value is positive. */ + return v > 0; +} + int device_get_sysattr_bool(sd_device *device, const char *sysattr) { const char *value; int r; diff --git a/src/libsystemd/sd-device/test-sd-device.c b/src/libsystemd/sd-device/test-sd-device.c index 8172c64e456..3deb9beaac7 100644 --- a/src/libsystemd/sd-device/test-sd-device.c +++ b/src/libsystemd/sd-device/test-sd-device.c @@ -180,6 +180,13 @@ static void test_sd_device_one(sd_device *d) { r = sd_device_get_sysattr_value(d, "name_assign_type", &val); assert_se(r >= 0 || ERRNO_IS_PRIVILEGE(r) || IN_SET(r, -ENOENT, -EINVAL)); + + if (r > 0) { + unsigned x; + + assert_se(device_get_sysattr_unsigned(d, "name_assign_type", NULL) >= 0); + assert_se(device_get_sysattr_unsigned(d, "name_assign_type", &x) >= 0); + } } TEST(sd_device_enumerator_devices) {