return NULL;
}
+static void
+parse_interface_config(libusb_device *dev, struct usbdev_data *data)
+{
+ struct libusb_config_descriptor *config;
+ const struct libusb_interface *iface;
+
+ data->interface = -1;
+ if (libusb_get_config_descriptor(dev, 0, &config))
+ return;
+
+ data->config = config;
+ if (!config->bNumInterfaces)
+ return;
+
+ iface = &config->interface[0];
+ if (!iface->num_altsetting)
+ return;
+
+ data->interface = iface->altsetting[0].bInterfaceNumber;
+}
+
static void iterate_devs(cmd_cb_t cb)
{
struct usbdev_data data;
data.devh, data.desc.iSerialNumber,
(void *) data.serial, sizeof(data.serial));
+ parse_interface_config(usbdevs[i], &data);
+
data.info = find_dev_data(&data, dev);
if (data.info)
cb(&data);
+
+ if (data.config)
+ libusb_free_config_descriptor(data.config);
+
libusb_close(data.devh);
}
}
struct usbdev_data {
struct libusb_device_descriptor desc;
+ struct libusb_config_descriptor *config;
libusb_device_handle *devh;
struct blob_attr *info;
+ int interface;
char idstr[10];
char mfg[128], prod[128], serial[128];