diff --git a/libnfc/buses/usbbus.c b/libnfc/buses/usbbus.c index d8ea11b..5c7dd20 100644 --- a/libnfc/buses/usbbus.c +++ b/libnfc/buses/usbbus.c @@ -76,16 +76,6 @@ ent->next = NULL; \ } while (0) -struct usbbus_dev_handle { - libusb_device_handle *handle; - struct usbbus_device *device; - /* libusb-0.1 is buggy w.r.t. interface claiming. it allows you to claim - * multiple interfaces but only tracks the most recently claimed one, - * which is used for usb_set_altinterface(). we clone the buggy behaviour - * here. */ - int last_claimed_interface; -}; - #define USBBUS_DT_CONFIG_SIZE 9 #define USBBUS_DT_INTERFACE_SIZE 9 #define USBBUS_DT_ENDPOINT_AUDIO_SIZE 9 @@ -640,53 +630,40 @@ int usbbus_prepare(void) return 0; } -usbbus_dev_handle *usbbus_open(struct usbbus_device *dev) +usbbus_device_handle *usbbus_open(struct usbbus_device *dev) { int r; - usbbus_dev_handle *udev = malloc(sizeof(*udev)); - if (!udev) - return NULL; - - r = libusb_open((libusb_device *) dev->dev, &udev->handle); + usbbus_device_handle *udev; + r = libusb_open((libusb_device *) dev->dev, (libusb_device_handle **)&udev); if (r < 0) { - free(udev); errno = libusb_to_errno(r); return NULL; } - - udev->last_claimed_interface = -1; - udev->device = dev; - return udev; + return (usbbus_device_handle *)udev; } -int usbbus_close(usbbus_dev_handle *dev) +void usbbus_close(usbbus_device_handle *dev) { - libusb_close(dev->handle); - free(dev); - return 0; + libusb_close((libusb_device_handle *)dev); } -int usbbus_set_configuration(usbbus_dev_handle *dev, int configuration) +int usbbus_set_configuration(usbbus_device_handle *dev, int configuration) { - return compat_err(libusb_set_configuration(dev->handle, configuration)); + return compat_err(libusb_set_configuration((libusb_device_handle *)dev, configuration)); } -int usbbus_get_string_simple(usbbus_dev_handle *dev, int index, char *buf, size_t buflen) +int usbbus_get_string_simple(usbbus_device_handle *dev, int index, char *buf, size_t buflen) { - int r; - r = libusb_get_string_descriptor_ascii(dev->handle, index & 0xff, + return libusb_get_string_descriptor_ascii((libusb_device_handle *)dev, index & 0xff, (unsigned char *) buf, (int) buflen); - if (r >= 0) - return r; - return compat_err(r); } -static int usbbus_bulk_io(usbbus_dev_handle *dev, int ep, unsigned char *bytes, +static int usbbus_bulk_io(usbbus_device_handle *dev, int ep, unsigned char *bytes, int size, int timeout) { int actual_length; int r; - r = libusb_bulk_transfer(dev->handle, ep & 0xff, bytes, size, + r = libusb_bulk_transfer((libusb_device_handle *)dev, ep & 0xff, bytes, size, &actual_length, timeout); /* if we timed out but did transfer some data, report as successful short @@ -697,46 +674,39 @@ static int usbbus_bulk_io(usbbus_dev_handle *dev, int ep, unsigned char *bytes, return compat_err(r); } -int usbbus_bulk_read(usbbus_dev_handle *dev, int ep, char *bytes, int size, int timeout) +int usbbus_bulk_read(usbbus_device_handle *dev, int ep, char *bytes, int size, int timeout) { return usbbus_bulk_io(dev, ep, (unsigned char *) bytes, size, timeout); } -int usbbus_bulk_write(usbbus_dev_handle *dev, int ep, const char *bytes, int size, int timeout) +int usbbus_bulk_write(usbbus_device_handle *dev, int ep, const char *bytes, int size, int timeout) { return usbbus_bulk_io(dev, ep, (unsigned char *)bytes, size, timeout); } -int usbbus_claim_interface(usbbus_dev_handle *dev, int interface) +int usbbus_claim_interface(usbbus_device_handle *dev, int interface) { int r; - r = libusb_claim_interface(dev->handle, interface); + r = libusb_claim_interface((libusb_device_handle *)dev, interface); if (r == 0) { - dev->last_claimed_interface = interface; return 0; } return compat_err(r); } -int usbbus_release_interface(usbbus_dev_handle *dev, int interface) +int usbbus_release_interface(usbbus_device_handle *dev, int interface) { - int r; - r = libusb_release_interface(dev->handle, interface); - if (r == 0) - dev->last_claimed_interface = -1; - return compat_err(r); + return compat_err(libusb_release_interface((libusb_device_handle *)dev, interface)); } -int usbbus_set_altinterface(usbbus_dev_handle *dev, int alternate) +int usbbus_set_interface_alt_setting(usbbus_device_handle *dev, int interface, int alternate) { - if (dev->last_claimed_interface < 0) - return -(errno = EINVAL); - return compat_err(libusb_set_interface_alt_setting(dev->handle, dev->last_claimed_interface, alternate)); + return libusb_set_interface_alt_setting((libusb_device_handle *)dev, interface, alternate); } -int usbbus_reset(usbbus_dev_handle *dev) +int usbbus_reset(usbbus_device_handle *dev) { - return compat_err(libusb_reset_device(dev->handle)); + return compat_err(libusb_reset_device((libusb_device_handle *)dev)); } struct usbbus_bus *usbbus_get_busses(void) diff --git a/libnfc/buses/usbbus.h b/libnfc/buses/usbbus.h index 2c1852f..b105a1c 100644 --- a/libnfc/buses/usbbus.h +++ b/libnfc/buses/usbbus.h @@ -60,8 +60,8 @@ int usbbus_prepare(void); #define USBBUS_PATH_MAX 4096 #endif -struct usbbus_dev_handle; -typedef struct usbbus_dev_handle usbbus_dev_handle; +struct usbbus_device_handle; +typedef struct usbbus_device_handle usbbus_device_handle; struct usbbus_endpoint_descriptor { uint8_t bLength; @@ -166,16 +166,16 @@ struct usbbus_bus { }; -usbbus_dev_handle *usbbus_open(struct usbbus_device *dev); -int usbbus_close(usbbus_dev_handle *dev); -int usbbus_set_configuration(usbbus_dev_handle *dev, int configuration); -int usbbus_get_string_simple(usbbus_dev_handle *dev, int index, char *buf, size_t buflen); -int usbbus_bulk_read(usbbus_dev_handle *dev, int ep, char *bytes, int size, int timeout); -int usbbus_bulk_write(usbbus_dev_handle *dev, int ep, const char *bytes, int size, int timeout); -int usbbus_claim_interface(usbbus_dev_handle *dev, int interface); -int usbbus_release_interface(usbbus_dev_handle *dev, int interface); -int usbbus_set_altinterface(usbbus_dev_handle *dev, int alternate); -int usbbus_reset(usbbus_dev_handle *dev); +usbbus_device_handle *usbbus_open(struct usbbus_device *dev); +void usbbus_close(usbbus_device_handle *dev); +int usbbus_set_configuration(usbbus_device_handle *dev, int configuration); +int usbbus_get_string_simple(usbbus_device_handle *dev, int index, char *buf, size_t buflen); +int usbbus_bulk_read(usbbus_device_handle *dev, int ep, char *bytes, int size, int timeout); +int usbbus_bulk_write(usbbus_device_handle *dev, int ep, const char *bytes, int size, int timeout); +int usbbus_claim_interface(usbbus_device_handle *dev, int interface); +int usbbus_release_interface(usbbus_device_handle *dev, int interface); +int usbbus_set_interface_alt_setting(usbbus_device_handle *dev, int interface, int alternate); +int usbbus_reset(usbbus_device_handle *dev); struct usbbus_bus *usbbus_get_busses(void); #endif // __NFC_BUS_USB_H__ diff --git a/libnfc/drivers/acr122_usb.c b/libnfc/drivers/acr122_usb.c index e7c959e..cf61b31 100644 --- a/libnfc/drivers/acr122_usb.c +++ b/libnfc/drivers/acr122_usb.c @@ -172,7 +172,7 @@ struct acr122_usb_apdu_frame { // Internal data struct struct acr122_usb_data { - usbbus_dev_handle *pudh; + usbbus_device_handle *pudh; uint32_t uiEndPointIn; uint32_t uiEndPointOut; uint32_t uiMaxPacketSize; @@ -322,7 +322,7 @@ acr122_usb_scan(const nfc_context *context, nfc_connstring connstrings[], const continue; } - usbbus_dev_handle *udev = usbbus_open(dev); + usbbus_device_handle *udev = usbbus_open(dev); if (udev == NULL) continue; @@ -350,7 +350,7 @@ struct acr122_usb_descriptor { }; static bool -acr122_usb_get_usb_device_name(struct usbbus_device *dev, usbbus_dev_handle *udev, char *buffer, size_t len) +acr122_usb_get_usb_device_name(struct usbbus_device *dev, usbbus_device_handle *udev, char *buffer, size_t len) { *buffer = '\0'; @@ -426,7 +426,7 @@ acr122_usb_open(const nfc_context *context, const nfc_connstring connstring) goto free_mem; } - res = usbbus_set_altinterface(data.pudh, 0); + res = usbbus_set_interface_alt_setting(data.pudh, 0, 0); if (res < 0) { log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to set alternate setting on USB interface (%s)", usbbus_strerror(res)); usbbus_close(data.pudh); @@ -492,9 +492,7 @@ acr122_usb_close(nfc_device *pnd) log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to release USB interface (%s)", usbbus_strerror(res)); } - if ((res = usbbus_close(DRIVER_DATA(pnd)->pudh)) < 0) { - log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to close USB connection (%s)", usbbus_strerror(res)); - } + usbbus_close(DRIVER_DATA(pnd)->pudh); pn53x_data_free(pnd); nfc_device_free(pnd); } diff --git a/libnfc/drivers/pn53x_usb.c b/libnfc/drivers/pn53x_usb.c index ac1a570..f039045 100644 --- a/libnfc/drivers/pn53x_usb.c +++ b/libnfc/drivers/pn53x_usb.c @@ -72,7 +72,7 @@ typedef enum { // Internal data struct struct pn53x_usb_data { - usbbus_dev_handle *pudh; + usbbus_device_handle *pudh; pn53x_usb_model model; uint32_t uiEndPointIn; uint32_t uiEndPointOut; @@ -84,7 +84,7 @@ struct pn53x_usb_data { const struct pn53x_io pn53x_usb_io; // Prototypes -bool pn53x_usb_get_usb_device_name(struct usbbus_device *dev, usbbus_dev_handle *udev, char *buffer, size_t len); +bool pn53x_usb_get_usb_device_name(struct usbbus_device *dev, usbbus_device_handle *udev, char *buffer, size_t len); int pn53x_usb_init(nfc_device *pnd); static int @@ -204,7 +204,7 @@ pn53x_usb_scan(const nfc_context *context, nfc_connstring connstrings[], const s continue; } - usbbus_dev_handle *udev = usbbus_open(dev); + usbbus_device_handle *udev = usbbus_open(dev); if (udev == NULL) continue; @@ -240,7 +240,7 @@ struct pn53x_usb_descriptor { }; bool -pn53x_usb_get_usb_device_name(struct usbbus_device *dev, usbbus_dev_handle *udev, char *buffer, size_t len) +pn53x_usb_get_usb_device_name(struct usbbus_device *dev, usbbus_device_handle *udev, char *buffer, size_t len) { *buffer = '\0'; @@ -412,9 +412,7 @@ pn53x_usb_close(nfc_device *pnd) log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to release USB interface (%s)", usbbus_strerror(res)); } - if ((res = usbbus_close(DRIVER_DATA(pnd)->pudh)) < 0) { - log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to close USB connection (%s)", usbbus_strerror(res)); - } + usbbus_close(DRIVER_DATA(pnd)->pudh); pn53x_data_free(pnd); nfc_device_free(pnd); }