X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/d60d9baaa2cf2cb36b24f2e8ed83b9e28589c7b0..4a8a2269f615db1d1e98e2214fea8c93bca4f7a5:/hmcfgusb.c diff --git a/hmcfgusb.c b/hmcfgusb.c index c3fb60b..7ec0714 100644 --- a/hmcfgusb.c +++ b/hmcfgusb.c @@ -152,16 +152,12 @@ int hmcfgusb_send(struct hmcfgusb_dev *usbdev, unsigned char* send_data, int len return 0; } - usleep(1000); - if (done) { err = libusb_interrupt_transfer(usbdev->usb_devh, EP_OUT, send_data, 0, &cnt, USB_TIMEOUT); if (err) { fprintf(stderr, "Can't send data: %s\n", usb_strerror(err)); return 0; } - - usleep(1000); } return 1; @@ -195,7 +191,6 @@ static struct libusb_transfer *hmcfgusb_prepare_int(libusb_device_handle *devh, if (err != 0) { fprintf(stderr, "Can't submit transfer: %s\n", usb_strerror(err)); libusb_free_transfer(transfer); - free(data_buf); return NULL; } @@ -230,7 +225,17 @@ static void LIBUSB_CALL hmcfgusb_interrupt(struct libusb_transfer *transfer) if (cb_data && cb_data->cb) { if (debug) hexdump(transfer->buffer, transfer->actual_length, "USB > "); - cb_data->cb(transfer->buffer, transfer->actual_length, cb_data->data); + + if (!cb_data->cb(transfer->buffer, transfer->actual_length, cb_data->data)) { + quit = EIO; + + if (cb_data && cb_data->dev && cb_data->dev->transfer) { + libusb_free_transfer(cb_data->dev->transfer); + cb_data->dev->transfer = NULL; + } + + return; + } } else { hexdump(transfer->buffer, transfer->actual_length, "> "); } @@ -239,7 +244,6 @@ static void LIBUSB_CALL hmcfgusb_interrupt(struct libusb_transfer *transfer) err = libusb_submit_transfer(transfer); if (err != 0) { fprintf(stderr, "Can't re-submit transfer: %s\n", usb_strerror(err)); - free(transfer->buffer); libusb_free_transfer(transfer); } } @@ -321,6 +325,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) dev->n_pfd = dev->n_usb_pfd; + quit = 0; + return dev; } @@ -374,6 +380,7 @@ int hmcfgusb_poll(struct hmcfgusb_dev *dev, int timeout) n = poll(dev->pfd, dev->n_pfd, tv.tv_sec * 1000); if (n < 0) { perror("poll"); + errno = 0; return -1; } else if (n == 0) { usb_event = 1; @@ -384,6 +391,7 @@ int hmcfgusb_poll(struct hmcfgusb_dev *dev, int timeout) usb_event = 1; break; } else { + errno = 0; return dev->pfd[fd_n].fd; } } @@ -401,8 +409,11 @@ int hmcfgusb_poll(struct hmcfgusb_dev *dev, int timeout) } } - if (quit) + errno = 0; + if (quit) { + fprintf(stderr, "closing device-connection due to error %d\n", quit); errno = quit; + } return -1; }