From: Yu Watanabe Date: Fri, 7 Feb 2025 16:25:15 +0000 (+0900) Subject: sd-device: introduce device_get_sysnum_unsigned() X-Git-Tag: v258-rc1~1386^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7543ae05e3063e582218a60d57b0e4a2583b8058;p=thirdparty%2Fsystemd.git sd-device: introduce device_get_sysnum_unsigned() --- diff --git a/src/libsystemd/sd-device/device-private.h b/src/libsystemd/sd-device/device-private.h index aa42cbb2a19..7d925aa581d 100644 --- a/src/libsystemd/sd-device/device-private.h +++ b/src/libsystemd/sd-device/device-private.h @@ -18,6 +18,7 @@ int device_new_from_strv(sd_device **ret, char **strv); int device_opendir(sd_device *device, const char *subdir, DIR **ret); +int device_get_sysnum_unsigned(sd_device *device, unsigned *ret); int device_get_property_bool(sd_device *device, const char *key); int device_get_property_int(sd_device *device, const char *key, int *ret); int device_get_sysattr_int(sd_device *device, const char *sysattr, int *ret_value); diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 033a9eb8757..ac441a7f385 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -1445,6 +1445,26 @@ _public_ int sd_device_get_sysnum(sd_device *device, const char **ret) { return 0; } +int device_get_sysnum_unsigned(sd_device *device, unsigned *ret) { + int r; + + assert(device); + + const char *s; + r = sd_device_get_sysnum(device, &s); + if (r < 0) + return r; + + unsigned n; + r = safe_atou_full(s, SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE | 10, &n); + if (r < 0) + return r; + + if (ret) + *ret = n; + return 0; +} + _public_ int sd_device_get_action(sd_device *device, sd_device_action_t *ret) { assert_return(device, -EINVAL); diff --git a/src/libsystemd/sd-device/test-sd-device.c b/src/libsystemd/sd-device/test-sd-device.c index 230493ed183..b5ef0dca355 100644 --- a/src/libsystemd/sd-device/test-sd-device.c +++ b/src/libsystemd/sd-device/test-sd-device.c @@ -182,6 +182,8 @@ static void test_sd_device_one(sd_device *d) { assert_se(val < sysname + strlen(sysname)); assert_se(in_charset(val, DIGITS)); assert_se(!ascii_isdigit(val[-1])); + r = device_get_sysnum_unsigned(d, NULL); + ASSERT_TRUE(r >= 0 || r == -ERANGE); /* sysnum may be too large. */ } else assert_se(r == -ENOENT);