+ if (strcmp(subsystem, "drivers") == 0) {
+ char subsys[UTIL_NAME_SIZE];
+ char *driver;
+
+ util_strlcpy(subsys, sysname, sizeof(subsys));
+ driver = strchr(subsys, ':');
+ if (driver != NULL) {
+ driver[0] = '\0';
+ driver = &driver[1];
+ util_strlcpy(path, "/subsystem/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, subsys, sizeof(path_full) - sys_path_len);
+ util_strlcat(path, "/drivers/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, driver, sizeof(path_full) - sys_path_len);
+ if (stat(path_full, &statbuf) == 0)
+ goto found;
+
+ util_strlcpy(path, "/bus/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, subsys, sizeof(path_full) - sys_path_len);
+ util_strlcat(path, "/drivers/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, driver, sizeof(path_full) - sys_path_len);
+ if (stat(path_full, &statbuf) == 0)
+ goto found;
+ }
+ goto out;
+ }
+
+ util_strlcpy(path, "/subsystem/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, subsystem, sizeof(path_full) - sys_path_len);
+ util_strlcat(path, "/devices/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, sysname, sizeof(path_full) - sys_path_len);
+ if (stat(path_full, &statbuf) == 0)
+ goto found;
+
+ util_strlcpy(path, "/bus/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, subsystem, sizeof(path_full) - sys_path_len);
+ util_strlcat(path, "/devices/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, sysname, sizeof(path_full) - sys_path_len);
+ if (stat(path_full, &statbuf) == 0)
+ goto found;
+
+ util_strlcpy(path, "/class/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, subsystem, sizeof(path_full) - sys_path_len);
+ util_strlcat(path, "/", sizeof(path_full) - sys_path_len);
+ util_strlcat(path, sysname, sizeof(path_full) - sys_path_len);
+ if (stat(path_full, &statbuf) == 0)
+ goto found;
+out:
+ return NULL;
+found:
+ return udev_device_new_from_syspath(udev, path_full);
+}
+
+static struct udev_device *device_new_from_parent(struct udev_device *udev_device)
+{
+ struct udev_device *udev_device_parent = NULL;
+ char path[UTIL_PATH_SIZE];
+ const char *subdir;
+
+ /* follow "device" link in deprecated sys layout */
+ if (strncmp(udev_device->devpath, "/class/", 7) == 0 ||
+ strncmp(udev_device->devpath, "/block/", 7) == 0) {