Transfer length can be inferred from the setup packet.
static int set_mode_async(unsigned char data)
{
- int bufsize = LIBUSB_CONTROL_SETUP_SIZE + 1;
- unsigned char *buf = malloc(bufsize);
+ unsigned char *buf = malloc(LIBUSB_CONTROL_SETUP_SIZE + 1);
struct libusb_transfer *transfer;
if (!buf)
printf("async set mode %02x\n", data);
libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1);
buf[LIBUSB_CONTROL_SETUP_SIZE] = data;
- libusb_fill_control_transfer(transfer, devh, buf, bufsize,
- cb_mode_changed, NULL, 1000);
+ libusb_fill_control_transfer(transfer, devh, buf, cb_mode_changed, NULL,
+ 1000);
return libusb_submit_transfer(transfer);
}
static inline void libusb_fill_control_transfer(
struct libusb_transfer *transfer, libusb_device_handle *dev_handle,
- unsigned char *buffer, int length, libusb_transfer_cb_fn callback,
- void *user_data, unsigned int timeout)
+ unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data,
+ unsigned int timeout)
{
+ struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer;
transfer->dev_handle = dev_handle;
transfer->endpoint = 0;
transfer->endpoint_type = LIBUSB_ENDPOINT_TYPE_CONTROL;
transfer->timeout = timeout;
transfer->buffer = buffer;
- transfer->length = length;
+ if (setup)
+ transfer->length = LIBUSB_CONTROL_SETUP_SIZE + setup->wLength;
transfer->user_data = user_data;
transfer->callback = callback;
}
{
struct libusb_transfer *transfer = libusb_alloc_transfer();
unsigned char *buffer;
- int length = wLength + LIBUSB_CONTROL_SETUP_SIZE;
int completed = 0;
int r;
if (!transfer)
return -ENOMEM;
- buffer = malloc(length);
+ buffer = malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength);
if (!buffer) {
libusb_free_transfer(transfer);
return -ENOMEM;
if ((bRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT)
memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength);
- libusb_fill_control_transfer(transfer, dev_handle, buffer, length,
+ libusb_fill_control_transfer(transfer, dev_handle, buffer,
ctrl_transfer_cb, &completed, timeout);
r = libusb_submit_transfer(transfer);
if (r < 0) {