Here's a diff to test first release candidate of the next libusb version. I'd appreciate if people using libusb could test, especially if your port was preventing an upgrade. I don't plan to commit an upgrade to a RC but know would be a good time to find & report potential issues.
Index: Makefile =================================================================== RCS file: /cvs/ports/devel/libusb1/Makefile,v retrieving revision 1.23 diff -u -p -r1.23 Makefile --- Makefile 16 Mar 2015 18:07:43 -0000 1.23 +++ Makefile 14 Aug 2015 11:57:51 -0000 @@ -2,15 +2,15 @@ COMMENT = library for USB device access from userspace -VERSION = 1.0.9 +VERSION = 1.0.20-rc1 DISTNAME = libusb-${VERSION} PKGNAME = libusb1-${VERSION} -REVISION = 9 -SHARED_LIBS += usb-1.0 1.0 # 1.0 + +SHARED_LIBS += usb-1.0 1.1 # 1.0 CATEGORIES = devel -HOMEPAGE = http://www.libusb.org +HOMEPAGE = http://www.libusb.info MAINTAINER = Martin Pieuchot <m...@openbsd.org> @@ -19,8 +19,26 @@ PERMIT_PACKAGE_CDROM = Yes WANTLIB = pthread +.if ${VERSION:S/-rc//} == ${VERSION} MASTER_SITES = ${MASTER_SITE_SOURCEFORGE:=libusb/} EXTRACT_SUFX = .tar.bz2 +.else +GH_ACCOUNT = libusb +GH_PROJECT = libusb +GH_COMMIT = d73bc723aaeb4e043bb079198b37f5e0b0726168 + + +BUILD_DEPENDS= devel/libtool \ + ${MODGNU_AUTOCONF_DEPENDS} \ + ${MODGNU_AUTOMAKE_DEPENDS} + +AUTOCONF_VERSION= 2.69 +AUTOMAKE_VERSION= 1.11 + +pre-configure: + cd ${WRKSRC} && env AUTOCONF_VERSION=${AUTOCONF_VERSION} \ + AUTOMAKE_VERSION=${AUTOMAKE_VERSION} sh ./bootstrap.sh +.endif CONFIGURE_STYLE = gnu CONFIGURE_ARGS += ${CONFIGURE_SHARED} Index: distinfo =================================================================== RCS file: /cvs/ports/devel/libusb1/distinfo,v retrieving revision 1.3 diff -u -p -r1.3 distinfo --- distinfo 18 Jan 2015 03:13:17 -0000 1.3 +++ distinfo 14 Aug 2015 11:45:33 -0000 @@ -1,2 +1,2 @@ -SHA256 (libusb-1.0.9.tar.bz2) = 6SDu3C0GsJYGYRyZ7HMEQTxnhMum4zko54JD0yMZX5s= -SIZE (libusb-1.0.9.tar.bz2) = 421971 +SHA256 (libusb-1.0.20-rc1.tar.gz) = lmlBTmwtinvE5Rg584rKMhD9l3wJP6GQ7HnE5W4eiZ0= +SIZE (libusb-1.0.20-rc1.tar.gz) = 361819 Index: patches/patch-libusb_core_c =================================================================== RCS file: /cvs/ports/devel/libusb1/patches/patch-libusb_core_c,v retrieving revision 1.3 diff -u -p -r1.3 patch-libusb_core_c --- patches/patch-libusb_core_c 19 Jun 2012 21:10:59 -0000 1.3 +++ patches/patch-libusb_core_c 16 Jun 2015 11:45:17 -0000 @@ -4,9 +4,9 @@ On OpenBSD USB controllers are shown as itinial limit too small. On a recent machine this value is almost always exceeded, so bump it. ---- libusb/core.c.orig Fri Apr 20 08:44:27 2012 -+++ libusb/core.c Tue Jun 12 15:48:05 2012 -@@ -468,7 +468,7 @@ libusb_free_device_list(list, 1); +--- libusb/core.c.orig Sun Jan 26 00:06:33 2014 ++++ libusb/core.c Mon Jan 27 10:08:37 2014 +@@ -448,7 +448,7 @@ libusb_free_device_list(list, 1); * which grows when required. it can be freed once discovery has completed, * eliminating the need for a list node in the libusb_device structure * itself. */ Index: patches/patch-libusb_os_openbsd_usb_c =================================================================== RCS file: /cvs/ports/devel/libusb1/patches/patch-libusb_os_openbsd_usb_c,v retrieving revision 1.5 diff -u -p -r1.5 patch-libusb_os_openbsd_usb_c --- patches/patch-libusb_os_openbsd_usb_c 22 Apr 2013 08:37:20 -0000 1.5 +++ patches/patch-libusb_os_openbsd_usb_c 16 Jun 2015 11:45:17 -0000 @@ -1,570 +0,0 @@ -$OpenBSD: patch-libusb_os_openbsd_usb_c,v 1.5 2013/04/22 08:37:20 mpi Exp $ - -Add support for non ugen(4) attached devices through usb(4) buses. - ---- libusb/os/openbsd_usb.c.orig Fri Apr 20 08:44:27 2012 -+++ libusb/os/openbsd_usb.c Sun Apr 21 12:39:40 2013 -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2011 Martin Pieuchot <m...@openbsd.org> -+ * Copyright (c) 2011-2013 Martin Pieuchot <m...@openbsd.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public -@@ -32,8 +32,8 @@ - #include "libusbi.h" - - struct device_priv { -- char devnode[16]; -- int fd; -+ char *devname; /* name of the ugen(4) node */ -+ int fd; /* device file descriptor */ - - unsigned char *cdesc; /* active config descriptor */ - usb_device_descriptor_t ddesc; /* usb device descriptor */ -@@ -82,11 +82,14 @@ static int obsd_clock_gettime(int, struct timespec *); - * Private functions - */ - static int _errno_to_libusb(int); --static int _cache_active_config_descriptor(struct libusb_device *, int); -+static int _cache_active_config_descriptor(struct libusb_device *); - static int _sync_control_transfer(struct usbi_transfer *); - static int _sync_gen_transfer(struct usbi_transfer *); - static int _access_endpoint(struct libusb_transfer *); - -+static int _bus_open(int); -+ -+ - const struct usbi_os_backend openbsd_backend = { - "Synchronous OpenBSD backend", - NULL, /* init() */ -@@ -128,75 +131,105 @@ const struct usbi_os_backend openbsd_backend = { - 0, /* add_iso_packet_size */ - }; - -+#define DEVPATH "/dev/" -+#define USBDEV DEVPATH "usb" -+ - int - obsd_get_device_list(struct libusb_context * ctx, - struct discovered_devs **discdevs) - { -+ struct discovered_devs *ddd; - struct libusb_device *dev; - struct device_priv *dpriv; - struct usb_device_info di; -+ struct usb_device_ddesc dd; - unsigned long session_id; -- char devnode[16]; -- int fd, err, i; -+ char devices[USB_MAX_DEVICES]; -+ char busnode[16]; -+ char *udevname; -+ int fd, addr, i, j; - - usbi_dbg(""); - -- /* Only ugen(4) is supported */ -- for (i = 0; i < USB_MAX_DEVICES; i++) { -- /* Control endpoint is always .00 */ -- snprintf(devnode, sizeof(devnode), "/dev/ugen%d.00", i); -+ for (i = 0; i < 8; i++) { -+ snprintf(busnode, sizeof(busnode), USBDEV "%d", i); - -- if ((fd = open(devnode, O_RDONLY)) < 0) { -+ if ((fd = open(busnode, O_RDWR)) < 0) { - if (errno != ENOENT && errno != ENXIO) -- usbi_err(ctx, "could not open %s", devnode); -+ usbi_err(ctx, "could not open %s", busnode); - continue; - } - -- if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) -- continue; -+ bzero(devices, sizeof(devices)); -+ for (addr = 1; addr < USB_MAX_DEVICES; addr++) { -+ if (devices[addr]) -+ continue; - -- session_id = (di.udi_bus << 8 | di.udi_addr); -- dev = usbi_get_device_by_session_id(ctx, session_id); -+ di.udi_addr = addr; -+ if (ioctl(fd, USB_DEVICEINFO, &di) < 0) -+ continue; - -- if (dev == NULL) { -- dev = usbi_alloc_device(ctx, session_id); -- if (dev == NULL) -- return (LIBUSB_ERROR_NO_MEM); -+ /* -+ * XXX If ugen(4) is attached to the USB device -+ * it will be used. -+ */ -+ udevname = NULL; -+ for (j = 0; j < USB_MAX_DEVNAMES; j++) -+ if (!strncmp("ugen", di.udi_devnames[j], 4)) { -+ udevname = strdup(di.udi_devnames[j]); -+ break; -+ } - -- dev->bus_number = di.udi_bus; -- dev->device_address = di.udi_addr; -- dev->speed = di.udi_speed; -+ session_id = (di.udi_bus << 8 | di.udi_addr); -+ dev = usbi_get_device_by_session_id(ctx, session_id); - -- dpriv = (struct device_priv *)dev->os_priv; -- strlcpy(dpriv->devnode, devnode, sizeof(devnode)); -- dpriv->fd = -1; -+ if (dev == NULL) { -+ dev = usbi_alloc_device(ctx, session_id); -+ if (dev == NULL) { -+ close(fd); -+ return (LIBUSB_ERROR_NO_MEM); -+ } - -- if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { -- err = errno; -- goto error; -+ dev->bus_number = di.udi_bus; -+ dev->device_address = di.udi_addr; -+ dev->speed = di.udi_speed; -+ -+ dpriv = (struct device_priv *)dev->os_priv; -+ dpriv->fd = -1; -+ dpriv->cdesc = NULL; -+ dpriv->devname = udevname; -+ -+ dd.udd_bus = di.udi_bus; -+ dd.udd_addr = di.udi_addr; -+ if (ioctl(fd, USB_DEVICE_GET_DDESC, &dd) < 0) { -+ libusb_unref_device(dev); -+ continue; -+ } -+ dpriv->ddesc = dd.udd_desc; -+ -+ if (_cache_active_config_descriptor(dev)) { -+ libusb_unref_device(dev); -+ continue; -+ } -+ -+ if (usbi_sanitize_device(dev)) -+ libusb_unref_device(dev); - } - -- dpriv->cdesc = NULL; -- if (_cache_active_config_descriptor(dev, fd)) { -- err = errno; -- goto error; -+ ddd = discovered_devs_append(*discdevs, dev); -+ if (ddd == NULL) { -+ close(fd); -+ return (LIBUSB_ERROR_NO_MEM); - } - -- if ((err = usbi_sanitize_device(dev))) -- goto error; -+ *discdevs = ddd; -+ devices[addr] = 1; - } -- close(fd); - -- if (discovered_devs_append(*discdevs, dev) == NULL) -- return (LIBUSB_ERROR_NO_MEM); -+ close(fd); - } - - return (LIBUSB_SUCCESS); -- --error: -- close(fd); -- libusb_unref_device(dev); -- return _errno_to_libusb(err); - } - - int -@@ -204,16 +237,22 @@ obsd_open(struct libusb_device_handle *handle) - { - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; -+ char devnode[16]; - -- dpriv->fd = open(dpriv->devnode, O_RDWR); -- if (dpriv->fd < 0) { -- dpriv->fd = open(dpriv->devnode, O_RDONLY); -+ if (dpriv->devname) { -+ /* -+ * Only open ugen(4) attached devices read-write, all -+ * read-only operations are done through the bus node. -+ */ -+ snprintf(devnode, sizeof(devnode), DEVPATH "%s.00", -+ dpriv->devname); -+ dpriv->fd = open(devnode, O_RDWR); - if (dpriv->fd < 0) - return _errno_to_libusb(errno); -+ -+ usbi_dbg("open %s: fd %d", devnode, dpriv->fd); - } - -- usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd); -- - if (pipe(hpriv->pipe) < 0) - return _errno_to_libusb(errno); - -@@ -226,10 +265,12 @@ obsd_close(struct libusb_device_handle *handle) - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - -- usbi_dbg("close: fd %d", dpriv->fd); -+ if (dpriv->devname) { -+ usbi_dbg("close: fd %d", dpriv->fd); - -- close(dpriv->fd); -- dpriv->fd = -1; -+ close(dpriv->fd); -+ dpriv->fd = -1; -+ } - - usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); - -@@ -257,9 +298,8 @@ obsd_get_active_config_descriptor(struct libusb_device - unsigned char *buf, size_t len, int *host_endian) - { - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; -- usb_config_descriptor_t *ucd; -+ usb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc; - -- ucd = (usb_config_descriptor_t *) dpriv->cdesc; - len = MIN(len, UGETW(ucd->wTotalLength)); - - usbi_dbg("len %d", len); -@@ -275,35 +315,27 @@ int - obsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx, - unsigned char *buf, size_t len, int *host_endian) - { -- struct device_priv *dpriv = (struct device_priv *)dev->os_priv; -- struct usb_full_desc ufd; -+ struct usb_device_fdesc udf; - int fd, err; - -- usbi_dbg("index %d, len %d", idx, len); -+ if ((fd = _bus_open(dev->bus_number)) < 0) -+ return _errno_to_libusb(errno); - -- /* A config descriptor may be requested before opening the device */ -- if (dpriv->fd >= 0) { -- fd = dpriv->fd; -- } else { -- fd = open(dpriv->devnode, O_RDONLY); -- if (fd < 0) -- return _errno_to_libusb(errno); -- } -+ udf.udf_bus = dev->bus_number; -+ udf.udf_addr = dev->device_address; -+ udf.udf_config_index = idx; -+ udf.udf_size = len; -+ udf.udf_data = buf; - -- ufd.ufd_config_index = idx; -- ufd.ufd_size = len; -- ufd.ufd_data = buf; -+ usbi_dbg("index %d, len %d", udf.udf_config_index, len); - -- if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { -+ if (ioctl(fd, USB_DEVICE_GET_FDESC, &udf) < 0) { - err = errno; -- if (dpriv->fd < 0) -- close(fd); -+ close(fd); - return _errno_to_libusb(err); - } -+ close(fd); - -- if (dpriv->fd < 0) -- close(fd); -- - *host_endian = 0; - - return (LIBUSB_SUCCESS); -@@ -313,14 +345,12 @@ int - obsd_get_configuration(struct libusb_device_handle *handle, int *config) - { - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; -+ usb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc; - -- usbi_dbg(""); -+ *config = ucd->bConfigurationValue; - -- if (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0) -- return _errno_to_libusb(errno); -+ usbi_dbg("bConfigurationValue %d", *config); - -- usbi_dbg("configuration %d", *config); -- - return (LIBUSB_SUCCESS); - } - -@@ -329,12 +359,15 @@ obsd_set_configuration(struct libusb_device_handle *ha - { - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - -- usbi_dbg("configuration %d", config); -+ if (dpriv->devname == NULL) -+ return (LIBUSB_ERROR_NOT_SUPPORTED); - -+ usbi_dbg("bConfigurationValue %d", config); -+ - if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) - return _errno_to_libusb(errno); - -- return _cache_active_config_descriptor(handle->dev, dpriv->fd); -+ return _cache_active_config_descriptor(handle->dev); - } - - int -@@ -369,6 +402,9 @@ obsd_set_interface_altsetting(struct libusb_device_han - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - struct usb_alt_interface intf; - -+ if (dpriv->devname == NULL) -+ return (LIBUSB_ERROR_NOT_SUPPORTED); -+ - usbi_dbg("iface %d, setting %d", iface, altsetting); - - memset(&intf, 0, sizeof(intf)); -@@ -385,19 +421,27 @@ obsd_set_interface_altsetting(struct libusb_device_han - int - obsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint) - { -- struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - struct usb_ctl_request req; -+ int fd, err; - -+ if ((fd = _bus_open(handle->dev->bus_number)) < 0) -+ return _errno_to_libusb(errno); -+ - usbi_dbg(""); - -+ req.ucr_addr = handle->dev->device_address; - req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; - req.ucr_request.bRequest = UR_CLEAR_FEATURE; - USETW(req.ucr_request.wValue, UF_ENDPOINT_HALT); - USETW(req.ucr_request.wIndex, endpoint); - USETW(req.ucr_request.wLength, 0); - -- if (ioctl(dpriv->fd, USB_DO_REQUEST, &req) < 0) -- return _errno_to_libusb(errno); -+ if (ioctl(fd, USB_REQUEST, &req) < 0) { -+ err = errno; -+ close(fd); -+ return _errno_to_libusb(err); -+ } -+ close(fd); - - return (LIBUSB_SUCCESS); - } -@@ -418,6 +462,7 @@ obsd_destroy_device(struct libusb_device *dev) - usbi_dbg(""); - - free(dpriv->cdesc); -+ free(dpriv->devname); - } - - int -@@ -557,6 +602,8 @@ obsd_clock_gettime(int clkid, struct timespec *tp) - int - _errno_to_libusb(int err) - { -+ usbi_dbg("error: %s (%d)", strerror(err), err); -+ - switch (err) { - case EIO: - return (LIBUSB_ERROR_IO); -@@ -566,52 +613,64 @@ _errno_to_libusb(int err) - return (LIBUSB_ERROR_NO_DEVICE); - case ENOMEM: - return (LIBUSB_ERROR_NO_MEM); -+ case ETIMEDOUT: -+ return (LIBUSB_ERROR_TIMEOUT); - } - -- usbi_dbg("error: %s", strerror(err)); -- - return (LIBUSB_ERROR_OTHER); - } - - int --_cache_active_config_descriptor(struct libusb_device *dev, int fd) -+_cache_active_config_descriptor(struct libusb_device *dev) - { - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; -- struct usb_config_desc ucd; -- struct usb_full_desc ufd; -+ struct usb_device_cdesc udc; -+ struct usb_device_fdesc udf; - unsigned char* buf; -- int len; -+ int fd, len, err; - -- usbi_dbg("fd %d", fd); -+ if ((fd = _bus_open(dev->bus_number)) < 0) -+ return _errno_to_libusb(errno); - -- ucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX; -+ usbi_dbg("fd %d, addr %d", fd, dev->device_address); - -- if ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0) -+ udc.udc_bus = dev->bus_number; -+ udc.udc_addr = dev->device_address; -+ udc.udc_config_index = USB_CURRENT_CONFIG_INDEX; -+ if (ioctl(fd, USB_DEVICE_GET_CDESC, &udc) < 0) { -+ err = errno; -+ close(fd); - return _errno_to_libusb(errno); -+ } - -- usbi_dbg("active bLength %d", ucd.ucd_desc.bLength); -+ usbi_dbg("active bLength %d", udc.udc_desc.bLength); - -- len = UGETW(ucd.ucd_desc.wTotalLength); -+ len = UGETW(udc.udc_desc.wTotalLength); - buf = malloc(len); - if (buf == NULL) - return (LIBUSB_ERROR_NO_MEM); - -- ufd.ufd_config_index = ucd.ucd_config_index; -- ufd.ufd_size = len; -- ufd.ufd_data = buf; -+ udf.udf_bus = dev->bus_number; -+ udf.udf_addr = dev->device_address; -+ udf.udf_config_index = udc.udc_config_index; -+ udf.udf_size = len; -+ udf.udf_data = buf; - -- usbi_dbg("index %d, len %d", ufd.ufd_config_index, len); -+ usbi_dbg("index %d, len %d", udf.udf_config_index, len); - -- if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { -+ if (ioctl(fd, USB_DEVICE_GET_FDESC, &udf) < 0) { -+ err = errno; -+ close(fd); - free(buf); -- return _errno_to_libusb(errno); -+ return _errno_to_libusb(err); - } -+ close(fd); - - if (dpriv->cdesc) - free(dpriv->cdesc); - dpriv->cdesc = buf; - -- return (0); -+ return (LIBUSB_SUCCESS); - } - - int -@@ -626,12 +685,13 @@ _sync_control_transfer(struct usbi_transfer *itransfer - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - setup = (struct libusb_control_setup *)transfer->buffer; - -- usbi_dbg("type %d request %d value %d index %d length %d timeout %d", -+ usbi_dbg("type %x request %x value %x index %d length %d timeout %d", - setup->bmRequestType, setup->bRequest, - libusb_le16_to_cpu(setup->wValue), - libusb_le16_to_cpu(setup->wIndex), - libusb_le16_to_cpu(setup->wLength), transfer->timeout); - -+ req.ucr_addr = transfer->dev_handle->dev->device_address; - req.ucr_request.bmRequestType = setup->bmRequestType; - req.ucr_request.bRequest = setup->bRequest; - /* Don't use USETW, libusb already deals with the endianness */ -@@ -643,12 +703,31 @@ _sync_control_transfer(struct usbi_transfer *itransfer - if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) - req.ucr_flags = USBD_SHORT_XFER_OK; - -- if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) -- return _errno_to_libusb(errno); -+ if (dpriv->devname == NULL) { -+ /* -+ * XXX If the device is not attached to ugen(4) it is -+ * XXX still possible to submit a control transfer but -+ * XXX with the default timeout only. -+ */ -+ int fd, err; - -- if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) -- return _errno_to_libusb(errno); -+ if ((fd = _bus_open(transfer->dev_handle->dev->bus_number)) < 0) -+ return _errno_to_libusb(errno); - -+ if ((ioctl(fd, USB_REQUEST, &req)) < 0) { -+ err = errno; -+ close(fd); -+ return _errno_to_libusb(err); -+ } -+ close(fd); -+ } else { -+ if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) -+ return _errno_to_libusb(errno); -+ -+ if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) -+ return _errno_to_libusb(errno); -+ } -+ - itransfer->transferred = req.ucr_actlen; - - usbi_dbg("transferred %d", itransfer->transferred); -@@ -661,7 +740,7 @@ _access_endpoint(struct libusb_transfer *transfer) - { - struct handle_priv *hpriv; - struct device_priv *dpriv; -- char *s, devnode[16]; -+ char devnode[16]; - int fd, endpt; - mode_t mode; - -@@ -674,10 +753,9 @@ _access_endpoint(struct libusb_transfer *transfer) - usbi_dbg("endpoint %d mode %d", endpt, mode); - - if (hpriv->endpoints[endpt] < 0) { -- /* Pick the right node given the control one */ -- strlcpy(devnode, dpriv->devnode, sizeof(devnode)); -- s = strchr(devnode, '.'); -- snprintf(s, 4, ".%02d", endpt); -+ /* Pick the right endpoint node */ -+ snprintf(devnode, sizeof(devnode), DEVPATH "%s.%02d", -+ dpriv->devname, endpt); - - /* We may need to read/write to the same endpoint later. */ - if (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO)) -@@ -694,10 +772,15 @@ int - _sync_gen_transfer(struct usbi_transfer *itransfer) - { - struct libusb_transfer *transfer; -+ struct device_priv *dpriv; - int fd, nr = 1; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); -+ dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - -+ if (dpriv->devname == NULL) -+ return (LIBUSB_ERROR_NOT_SUPPORTED); -+ - /* - * Bulk, Interrupt or Isochronous transfer depends on the - * endpoint and thus the node to open. -@@ -724,4 +807,14 @@ _sync_gen_transfer(struct usbi_transfer *itransfer) - itransfer->transferred = nr; - - return (0); -+} -+ -+int -+_bus_open(int number) -+{ -+ char busnode[16]; -+ -+ snprintf(busnode, sizeof(busnode), USBDEV "%d", number); -+ -+ return open(busnode, O_RDWR); - }