]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device: introduce device_get_sysnum_unsigned()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 7 Feb 2025 16:25:15 +0000 (01:25 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 7 Feb 2025 16:38:02 +0000 (01:38 +0900)
src/libsystemd/sd-device/device-private.h
src/libsystemd/sd-device/sd-device.c
src/libsystemd/sd-device/test-sd-device.c

index aa42cbb2a19c9da0d7752026e7084a8188745be9..7d925aa581dd29efe2cd5022228ae4347a8231d5 100644 (file)
@@ -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);
index 033a9eb87579b6e3ac35d1801387ba061b8c32e1..ac441a7f3852fe6e300e79f333fe7dbbe28637e3 100644 (file)
@@ -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);
 
index 230493ed183ce7c96bcafd7deea7ef26cc5b990c..b5ef0dca3553e7911349fa9402020887669cafea 100644 (file)
@@ -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);