Simplify libusb_fill_control_transfer()

Transfer length can be inferred from the setup packet.
This commit is contained in:
Daniel Drake 2008-03-10 11:32:15 +00:00
parent 7c5ea95297
commit aae05f688d
3 changed files with 10 additions and 10 deletions

View file

@ -168,8 +168,7 @@ static void cb_mode_changed(struct libusb_transfer *transfer)
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)
@ -184,8 +183,8 @@ static int set_mode_async(unsigned char data)
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);
}

View file

@ -270,15 +270,17 @@ void libusb_free_transfer(struct libusb_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;
}

View file

@ -39,14 +39,13 @@ API_EXPORTED int libusb_control_transfer(libusb_device_handle *dev_handle,
{
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;
@ -57,7 +56,7 @@ API_EXPORTED int libusb_control_transfer(libusb_device_handle *dev_handle,
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) {