static int device_new_from_child(sd_device **ret, sd_device *child) {
_cleanup_free_ char *path = NULL;
- const char *subdir, *syspath;
+ const char *syspath;
int r;
assert(ret);
if (r < 0)
return r;
- path = strdup(syspath);
- if (!path)
- return -ENOMEM;
- subdir = path + STRLEN("/sys");
-
for (;;) {
- char *pos;
+ _cleanup_free_ char *p = NULL;
- pos = strrchr(subdir, '/');
- if (!pos || pos < subdir + 2)
- return -ENODEV;
+ r = path_extract_directory(path ?: syspath, &p);
+ if (r < 0)
+ return r;
- *pos = '\0';
+ if (path_equal(p, "/sys"))
+ return -ENODEV;
- r = sd_device_new_from_syspath(ret, path);
- if (r < 0)
- continue;
+ r = sd_device_new_from_syspath(ret, p);
+ if (r != -ENODEV)
+ return r;
- return 0;
+ free_and_replace(path, p);
}
}