endianness of control setup, issues when resubmitting transfers
serialization of handle_events
internal docs for OS porters
-configuration handling
check which messages are sent during open, claim interface, close, release
unconfigured devices
return NULL;
}
+/* iterate through all configurations, returning the index of the configuration
+ * matching a specific bConfigurationValue in the idx output parameter, or -1
+ * if the config was not found.
+ * returns 0 or a LIBUSB_ERROR code
+ */
+int usbi_get_config_index_by_value(struct libusb_device *dev,
+ uint8_t bConfigurationValue, int *idx)
+{
+ int i;
+
+ usbi_dbg("value %d", bConfigurationValue);
+ for (i = 0; i < dev->num_configurations; i++) {
+ unsigned char tmp[6];
+ int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp));
+ if (r < 0)
+ return r;
+ if (tmp[5] == bConfigurationValue) {
+ *idx = i;
+ return 0;
+ }
+ }
+
+ *idx = -1;
+ return 0;
+}
+
/** \ingroup desc
* Get a USB configuration descriptor with a specific bConfigurationValue.
* This is a non-blocking function which does not involve any requests being
struct libusb_config_descriptor *libusb_get_config_descriptor_by_value(
libusb_device *dev, uint8_t bConfigurationValue)
{
- int i;
- int r;
- int found = -1;
-
- usbi_dbg("value %d", bConfigurationValue);
- for (i = 0; i < dev->num_configurations; i++) {
- unsigned char tmp[6];
- r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp));
- if (r < 0)
- return NULL;
- if (tmp[5] == bConfigurationValue) {
- found = 1;
- break;
- }
- }
-
- if (!found)
+ int idx;
+ int r = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx);
+ if (r < 0 || idx == -1)
return NULL;
else
- return libusb_get_config_descriptor(dev, i);
+ return libusb_get_config_descriptor(dev, idx);
}
/** \ingroup desc
void usbi_handle_transfer_cancellation(struct usbi_transfer *transfer);
int usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest);
+int usbi_get_config_index_by_value(struct libusb_device *dev,
+ uint8_t bConfigurationValue, int *idx);
/* polling */
struct libusb_config_descriptor config;
unsigned char tmp[8];
unsigned char *buf;
+ int idx;
int r;
- /* FIXME */
- r = get_config_descriptor(fd, active_config, tmp, sizeof(tmp));
+ r = usbi_get_config_index_by_value(dev, active_config, &idx);
+ if (r < 0)
+ return r;
+ if (idx == -1)
+ return LIBUSB_ERROR_NOT_FOUND;
+
+ r = get_config_descriptor(fd, idx, tmp, sizeof(tmp));
if (r < 0) {
usbi_err("first read error %d", r);
return r;
if (!buf)
return LIBUSB_ERROR_NO_MEM;
- r = get_config_descriptor(fd, active_config, buf, config.wTotalLength);
+ r = get_config_descriptor(fd, idx, buf, config.wTotalLength);
if (r < 0) {
free(buf);
return r;