]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device: use string_replace_char() and strspn_from_end()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Apr 2022 17:19:44 +0000 (02:19 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Apr 2022 17:19:44 +0000 (02:19 +0900)
src/libsystemd/sd-device/sd-device.c

index bf9c753db5efc05b9ef9c10cf43b315a517999e9..c7f4c48d421e247c6916d9ab769ca744baaf0074 100644 (file)
@@ -1173,7 +1173,7 @@ _public_ int sd_device_get_devname(sd_device *device, const char **devname) {
 
 static int device_set_sysname_and_sysnum(sd_device *device) {
         _cleanup_free_ char *sysname = NULL;
-        char *p;
+        size_t len, n;
         int r;
 
         assert(device);
@@ -1185,14 +1185,15 @@ static int device_set_sysname_and_sysnum(sd_device *device) {
                 return -EINVAL;
 
         /* some devices have '!' in their name, change that to '/' */
-        for (p = strchrnul(sysname, '!'); *p != '\0'; p = strchrnul(p, '!'))
-                *p = '/';
+        string_replace_char(sysname, '!', '/');
 
-        /* trailing number (refuse number only sysname)*/
-        for (; p > sysname && isdigit(p[-1]); p--)
-                ;
+        n = strspn_from_end(sysname, DIGITS);
+        len = strlen(sysname);
+        assert(n <= len);
+        if (n == len)
+                n = 0; /* Do not set sysnum for number only sysname. */
 
-        device->sysnum = p > sysname && *p != '\0' ? p : NULL;
+        device->sysnum = n > 0 ? sysname + len - n : NULL;
         return free_and_replace(device->sysname, sysname);
 }