+
+ /* find matching sibling of the current usb_device, they share the same hub */
+ udev_parent = udev_device_get_parent_with_subsystem_devtype(udev_dev, "usb", "usb_device");
+ if (udev_parent == NULL)
+ return NULL;
+
+ enumerate = udev_enumerate_new(udev);
+ if (enumerate == NULL)
+ return NULL;
+
+ udev_enumerate_add_match_subsystem(enumerate, "usb");
+
+ /* match all childs of the parent */
+ util_strscpyl(str, sizeof(str), udev_device_get_sysname(udev_parent), "*", NULL);
+ udev_enumerate_add_match_sysname(enumerate, str);
+
+ /* match the specified interface */
+ util_strscpy(str, sizeof(str), sibling_intf);
+ str[2] = '\0';
+ str[5] = '\0';
+ str[8] = '\0';
+ if (strcmp(str, "-1") != 0)
+ udev_enumerate_add_match_sysattr(enumerate, "bInterfaceClass", str);
+ if (strcmp(&str[3], "-1") != 0)
+ udev_enumerate_add_match_sysattr(enumerate, "bInterfaceSubClass", &str[3]);
+ if (strcmp(&str[6], "-1") != 0)
+ udev_enumerate_add_match_sysattr(enumerate, "bInterfaceProtocol", &str[6]);
+
+ udev_enumerate_scan_devices(enumerate);
+ udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(enumerate)) {
+ struct udev_device *udev_device;
+
+ udev_device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(entry));
+ if (udev_device != NULL) {
+ /* get the usb_device of the usb_interface we matched */
+ udev_parent = udev_device_get_parent_with_subsystem_devtype(udev_device, "usb", "usb_device");
+ if (udev_parent == NULL)
+ continue;
+ /* only look at the first matching device */
+ dev = usb_device_open_from_udev(udev_parent);
+ if (dev != NULL)
+ handle = usb_open(dev);
+ udev_device_unref(udev_device);
+ break;
+ }
+}
+ udev_enumerate_unref(enumerate);
+ return handle;