static int device_set_sysname_and_sysnum(sd_device *device) {
_cleanup_free_ char *sysname = NULL;
- const char *sysnum = NULL;
- size_t len = 0;
+ char *p;
+ int r;
assert(device);
return r;
/* some devices have '!' in their name, change that to '/' */
- while (sysname[len] != '\0') {
- if (sysname[len] == '!')
- sysname[len] = '/';
-
- len++;
- }
-
- /* trailing number */
- while (len > 0 && isdigit(sysname[--len]))
- sysnum = &sysname[len];
+ for (p = strchrnul(sysname, '!'); *p != '\0'; p = strchrnul(p, '!'))
+ *p = '/';
- if (len == 0)
- sysnum = NULL;
+ /* trailing number (refuse number only sysname)*/
+ for (; p > sysname && isdigit(p[-1]); p--)
+ ;
- device->sysnum = sysnum;
+ device->sysnum = p > sysname && *p != '\0' ? p : NULL;
return free_and_replace(device->sysname, sysname);
}