}
static sd_device *skip_subsystem(sd_device *dev, const char *subsys) {
+ sd_device *parent;
+
assert(dev);
assert(subsys);
- for (;;) {
+ /* Unlike the function name, this drops multiple parent devices EXCEPT FOR THE LAST ONE.
+ * The last one will be dropped at the end of the loop in builtin_path_id().
+ * E.g.
+ * Input: /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0
+ * Output: /sys/devices/pci0000:00/0000:00:14.0/usb1
+ */
+
+ for (parent = dev; ; ) {
const char *subsystem;
- if (sd_device_get_subsystem(dev, &subsystem) < 0)
+ if (sd_device_get_subsystem(parent, &subsystem) < 0)
break;
if (!streq(subsystem, subsys))
break;
- if (sd_device_get_parent(dev, &dev) < 0)
+ dev = parent;
+ if (sd_device_get_parent(dev, &parent) < 0)
break;
}