The diff below updates devel/libusb1 to the recent 1.0.9 release. All OpenBSD specific code has been commited upsteam and I don't expect any regression but if you are using any application relying on the libusb, please test this update.
Comments and oks welcome. Martin Index: Makefile =================================================================== RCS file: /cvs/ports/devel/libusb1/Makefile,v retrieving revision 1.7 diff -u -p -r1.7 Makefile --- Makefile 8 Apr 2012 13:14:54 -0000 1.7 +++ Makefile 20 Apr 2012 12:44:05 -0000 @@ -2,11 +2,10 @@ COMMENT = library for USB device access from userspace -VERSION = 1.0.8 +VERSION = 1.0.9 DISTNAME = libusb-${VERSION} PKGNAME = libusb1-${VERSION} -REVISION = 4 -SHARED_LIBS += usb-1.0 0.0 # 0.0 +SHARED_LIBS += usb-1.0 1.0 # 1.0 CATEGORIES = devel @@ -27,29 +26,7 @@ EXTRACT_SUFX = .tar.bz2 BUILD_DEPENDS = devel/libtool USE_LIBTOOL = Yes -AUTOCONF_VERSION = 2.65 -AUTOMAKE_VERSION = 1.11 -CONFIGURE_STYLE = automake autoconf -CONFIGURE_ARGS += ${CONFIGURE_SHARED} - -.ifdef DEBUG -CONFIGURE_ARGS += --enable-log \ - --enable-debug-log \ - --enable-examples-build -.endif - -AUTO_ENV= AUTOCONF_VERSION=${AUTOCONF_VERSION} \ - AUTOMAKE_VERSION=${AUTOMAKE_VERSION} - -post-extract: - cp ${FILESDIR}/openbsd_ugen.c ${WRKSRC}/libusb/os/ - -post-patch: - @echo "Running aclocal-${AUTOMAKE_VERSION} in ${WRKSRC}" - @cd ${WRKSRC}; ${AUTO_ENV} aclocal - -pre-configure: - @echo "Running automake-${AUTOMAKE_VERSION} in ${WRKSRC}" - @cd ${WRKSRC}; ${AUTO_ENV} automake --foreign +CONFIGURE_STYLE = gnu +USE_GMAKE = Yes .include <bsd.port.mk> Index: distinfo =================================================================== RCS file: /cvs/ports/devel/libusb1/distinfo,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 distinfo --- distinfo 2 Nov 2011 14:31:56 -0000 1.1.1.1 +++ distinfo 20 Apr 2012 12:37:44 -0000 @@ -1,5 +1,5 @@ -MD5 (libusb-1.0.8.tar.bz2) = N9NObqpppLZFoZ/0ymPO7w== -RMD160 (libusb-1.0.8.tar.bz2) = WkE6d+JAoVSA7xQ31fU5O6266YU= -SHA1 (libusb-1.0.8.tar.bz2) = VIQ5eGD3Ccm1FhHSJIGfjtWZQGM= -SHA256 (libusb-1.0.8.tar.bz2) = IdDTpXEPf0IRxZUQLGuezLQkNaF6T1vSw/QWarG626k= -SIZE (libusb-1.0.8.tar.bz2) = 331820 +MD5 (libusb-1.0.9.tar.bz2) = f1oCN1rZYNTjOm2ufWPPyw== +RMD160 (libusb-1.0.9.tar.bz2) = VBBXD4zjF4METrBK66rnreOyGmE= +SHA1 (libusb-1.0.9.tar.bz2) = AlWC/y9iFuLbwmEK4WsuBz4bM0Y= +SHA256 (libusb-1.0.9.tar.bz2) = 6SDu3C0GsJYGYRyZ7HMEQTxnhMum4zko54JD0yMZX5s= +SIZE (libusb-1.0.9.tar.bz2) = 421971 Index: files/openbsd_ugen.c =================================================================== RCS file: files/openbsd_ugen.c diff -N files/openbsd_ugen.c --- files/openbsd_ugen.c 8 Apr 2012 13:14:54 -0000 1.6 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,715 +0,0 @@ -/* $OpenBSD: openbsd_ugen.c,v 1.6 2012/04/08 13:14:54 mpi Exp $ */ -/* - * Copyright (c) 2011 Martin Pieuchot <m...@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <sys/time.h> -#include <sys/types.h> - -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <dev/usb/usb.h> - -#include "libusb.h" -#include "libusbi.h" - -struct device_priv { - char devnode[16]; - int fd; - - unsigned char *cdesc; /* active config descriptor */ - usb_device_descriptor_t ddesc; /* usb device descriptor */ -}; - -struct handle_priv { - int pipe[2]; /* for event notification */ - int endpoints[USB_MAX_ENDPOINTS]; -}; - -/* - * Backend functions - */ -int ugen_get_device_list(struct libusb_context *, struct discovered_devs **); -int ugen_open(struct libusb_device_handle *); -void ugen_close(struct libusb_device_handle *); - -int ugen_get_device_descriptor(struct libusb_device *, unsigned char *, int *); -int ugen_get_active_config_descriptor(struct libusb_device *, unsigned char *, - size_t, int *); -int ugen_get_config_descriptor(struct libusb_device *, uint8_t, unsigned char *, - size_t, int *); - -int ugen_get_configuration(struct libusb_device_handle *, int *); -int ugen_set_configuration(struct libusb_device_handle *, int); - -int ugen_claim_interface(struct libusb_device_handle *, int); -int ugen_release_interface(struct libusb_device_handle *, int); - -int ugen_set_interface_altsetting(struct libusb_device_handle *, int, int); -int ugen_clear_halt(struct libusb_device_handle *, unsigned char); -int ugen_reset_device(struct libusb_device_handle *); -void ugen_destroy_device(struct libusb_device *); - -int ugen_submit_transfer(struct usbi_transfer *); -int ugen_cancel_transfer(struct usbi_transfer *); -void ugen_clear_transfer_priv(struct usbi_transfer *); -int ugen_handle_events(struct libusb_context *ctx, struct pollfd *, nfds_t, - int); -int ugen_clock_gettime(int, struct timespec *); - -/* - * Private functions - */ -int _errno_to_libusb(int); -int _cache_active_config_descriptor(struct libusb_device *, int); -int _sync_control_transfer(struct usbi_transfer *); -int _access_endpoint(struct libusb_transfer *); -int _sync_gen_transfer(struct usbi_transfer *); - -const struct usbi_os_backend openbsd_backend = { - "Synchronous OpenBSD backend", - NULL, /* init() */ - NULL, /* exit() */ - ugen_get_device_list, - ugen_open, - ugen_close, - - ugen_get_device_descriptor, - ugen_get_active_config_descriptor, - ugen_get_config_descriptor, - - ugen_get_configuration, - ugen_set_configuration, - - ugen_claim_interface, - ugen_release_interface, - - ugen_set_interface_altsetting, - ugen_clear_halt, - ugen_reset_device, - - NULL, /* kernel_driver_active() */ - NULL, /* detach_kernel_driver() */ - NULL, /* attach_kernel_driver() */ - - ugen_destroy_device, - - ugen_submit_transfer, - ugen_cancel_transfer, - ugen_clear_transfer_priv, - - ugen_handle_events, - - ugen_clock_gettime, - sizeof(struct device_priv), - sizeof(struct handle_priv), - 0, /* transfer_priv_size */ - 0, /* add_iso_packet_size */ -}; - -int -ugen_get_device_list(struct libusb_context * ctx, - struct discovered_devs **discdevs) -{ - struct libusb_device *dev; - struct device_priv *dpriv; - struct usb_device_info di; - unsigned long session_id; - char devnode[16]; - int fd, err, i; - - 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); - - if ((fd = open(devnode, O_RDONLY)) < 0) { - if (errno != ENOENT && errno != ENXIO) - usbi_err(ctx, "could no open %s", devnode); - continue; - } - - if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) - continue; - - session_id = (di.udi_bus << 8 | di.udi_addr); - dev = usbi_get_device_by_session_id(ctx, session_id); - - if (dev == NULL) { - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) - return (LIBUSB_ERROR_NO_MEM); - - dev->bus_number = di.udi_bus; - dev->device_address = di.udi_addr; - - dpriv = (struct device_priv *)dev->os_priv; - strlcpy(dpriv->devnode, devnode, sizeof(devnode)); - dpriv->fd = -1; - - if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { - err = errno; - goto error; - } - - dpriv->cdesc = NULL; - if (_cache_active_config_descriptor(dev, fd)) { - err = errno; - goto error; - } - - if ((err = usbi_sanitize_device(dev))) - goto error; - } - close(fd); - - if (discovered_devs_append(*discdevs, dev) == NULL) - return (LIBUSB_ERROR_NO_MEM); - } - - return (LIBUSB_SUCCESS); - -error: - close(fd); - libusb_unref_device(dev); - return _errno_to_libusb(err); -} - -int -ugen_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; - - dpriv->fd = open(dpriv->devnode, O_RDWR); - if (dpriv->fd < 0) { - dpriv->fd = open(dpriv->devnode, O_RDONLY); - if (dpriv->fd < 0) - return _errno_to_libusb(errno); - } - - usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd); - - if (pipe(hpriv->pipe) < 0) - return _errno_to_libusb(errno); - - return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->pipe[0], POLLIN); -} - -void -ugen_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); - - close(dpriv->fd); - dpriv->fd = -1; - - usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); - - close(hpriv->pipe[0]); - close(hpriv->pipe[1]); -} - -int -ugen_get_device_descriptor(struct libusb_device *dev, unsigned char *buf, - int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - - usbi_dbg(""); - - memcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH); - - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -ugen_get_active_config_descriptor(struct libusb_device *dev, - unsigned char *buf, size_t len, int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - usb_config_descriptor_t *ucd; - - ucd = (usb_config_descriptor_t *) dpriv->cdesc; - len = MIN(len, UGETW(ucd->wTotalLength)); - - usbi_dbg("len %d", len); - - memcpy(buf, dpriv->cdesc, len); - - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -ugen_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; - int fd, err; - - usbi_dbg("index %d, len %d", idx, len); - - /* 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); - } - - ufd.ufd_config_index = idx; - ufd.ufd_size = len; - ufd.ufd_data = buf; - - if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { - err = errno; - if (dpriv->fd < 0) - close(fd); - return _errno_to_libusb(err); - } - - if (dpriv->fd < 0) - close(fd); - - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -ugen_get_configuration(struct libusb_device_handle *handle, int *config) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - usbi_dbg(""); - - if (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0) - return _errno_to_libusb(errno); - - usbi_dbg("configuration %d", *config); - - return (LIBUSB_SUCCESS); -} - -int -ugen_set_configuration(struct libusb_device_handle *handle, int config) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - usbi_dbg("configuration %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); -} - -int -ugen_claim_interface(struct libusb_device_handle *handle, int iface) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - int i; - - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - hpriv->endpoints[i] = -1; - - return (LIBUSB_SUCCESS); -} - -int -ugen_release_interface(struct libusb_device_handle *handle, int iface) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - int i; - - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - if (hpriv->endpoints[i] >= 0) - close(hpriv->endpoints[i]); - - return (LIBUSB_SUCCESS); -} - -int -ugen_set_interface_altsetting(struct libusb_device_handle *handle, int iface, - int altsetting) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - struct usb_alt_interface intf; - - usbi_dbg("iface %d, setting %d", iface, altsetting); - - memset(&intf, 0, sizeof(intf)); - - intf.uai_interface_index = iface; - intf.uai_alt_no = altsetting; - - if (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0) - return _errno_to_libusb(errno); - - return (LIBUSB_SUCCESS); -} - -int -ugen_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; - - usbi_dbg(""); - - 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); - - return (LIBUSB_SUCCESS); -} - -int -ugen_reset_device(struct libusb_device_handle *handle) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -ugen_destroy_device(struct libusb_device *dev) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - - usbi_dbg(""); - - free(dpriv->cdesc); -} - -int -ugen_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct handle_priv *hpriv; - int err = 0; - - usbi_dbg(""); - - transfer = __USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - err = _sync_control_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - if (0 == transfer->endpoint & LIBUSB_ENDPOINT_IN) { - /* Isochronous write is not supported */ - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - /* PASSTHROUGH */ - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - err = _sync_gen_transfer(itransfer); - break; - } - - if (err) - return (err); - - if (write(hpriv->pipe[1], &itransfer, sizeof(itransfer)) < 0) - return _errno_to_libusb(errno); - - return (LIBUSB_SUCCESS); -} - -int -ugen_cancel_transfer(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -ugen_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - /* Nothing to do */ -} - -int -ugen_handle_events(struct libusb_context *ctx, struct pollfd *fds, nfds_t nfds, - int num_ready) -{ - struct libusb_device_handle *handle; - struct handle_priv *hpriv = NULL; - struct usbi_transfer *itransfer; - struct pollfd *pollfd; - int i, err = 0; - - usbi_dbg(""); - - pthread_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - pollfd = &fds[i]; - - if (!pollfd->revents) - continue; - - hpriv = NULL; - num_ready--; - list_for_each_entry(handle, &ctx->open_devs, list) { - hpriv = (struct handle_priv *)handle->os_priv; - - if (hpriv->pipe[0] == pollfd->fd) - break; - - hpriv = NULL; - } - - if (NULL == hpriv) { - usbi_dbg("fd %d is not an event pipe!", pollfd->fd); - err = ENOENT; - break; - } - - if (pollfd->revents & POLLERR) { - usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); - usbi_handle_disconnect(handle); - continue; - } - - if (read(hpriv->pipe[0], &itransfer, sizeof(itransfer)) < 0) { - err = errno; - break; - } - - if ((err = usbi_handle_transfer_completion(itransfer, - LIBUSB_TRANSFER_COMPLETED))) - break; - } - pthread_mutex_unlock(&ctx->open_devs_lock); - - if (err) - return _errno_to_libusb(err); - - return (LIBUSB_SUCCESS); -} - -int -ugen_clock_gettime(int clkid, struct timespec *tp) -{ - usbi_dbg("clock %d", clkid); - - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -int -_errno_to_libusb(int err) -{ - switch (err) { - case EIO: - return (LIBUSB_ERROR_IO); - case EACCES: - return (LIBUSB_ERROR_ACCESS); - case ENOENT: - return (LIBUSB_ERROR_NO_DEVICE); - case ENOMEM: - return (LIBUSB_ERROR_NO_MEM); - } - - usbi_dbg("error: %s", strerror(err)); - - return (LIBUSB_ERROR_OTHER); -} - -int -_cache_active_config_descriptor(struct libusb_device *dev, int fd) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - struct usb_config_desc ucd; - struct usb_full_desc ufd; - unsigned char* buf; - int len; - - usbi_dbg("fd %d", fd); - - ucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX; - - if ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0) - return _errno_to_libusb(errno); - - usbi_dbg("active bLength %d", ucd.ucd_desc.bLength); - - len = UGETW(ucd.ucd_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; - - usbi_dbg("index %d, len %d", ufd.ufd_config_index, len); - - if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { - free(buf); - return _errno_to_libusb(errno); - } - - if (dpriv->cdesc) - free(dpriv->cdesc); - dpriv->cdesc = buf; - - return (0); -} - -int -_sync_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct libusb_control_setup *setup; - struct device_priv *dpriv; - struct usb_ctl_request req; - - transfer = __USBI_TRANSFER_TO_LIBUSB_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", - 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_request.bmRequestType = setup->bmRequestType; - req.ucr_request.bRequest = setup->bRequest; - /* Don't use USETW, libusb already deals with the endianness */ - (*(uint16_t *)req.ucr_request.wValue) = setup->wValue; - (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex; - (*(uint16_t *)req.ucr_request.wLength) = setup->wLength; - req.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; - - 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 ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) - return _errno_to_libusb(errno); - - itransfer->transferred = req.ucr_actlen; - - usbi_dbg("transferred %d", itransfer->transferred); - - return (0); -} - -int -_access_endpoint(struct libusb_transfer *transfer) -{ - struct handle_priv *hpriv; - struct device_priv *dpriv; - char *s, devnode[16]; - int fd, endpt; - mode_t mode; - - hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - - endpt = UE_GET_ADDR(transfer->endpoint); - mode = (transfer->endpoint & LIBUSB_ENDPOINT_IN) ? O_RDONLY : O_WRONLY; - - 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); - - /* We may need to read/write to the same endpoint later. */ - if (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO)) - if ((fd = open(devnode, mode)) < 0) - return (-1); - - hpriv->endpoints[endpt] = fd; - } - - return (hpriv->endpoints[endpt]); -} - -int -_sync_gen_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - int fd, nr = 1; - - transfer = __USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - /* - * Bulk, Interrupt or Isochronous transfer depends on the - * endpoint and thus the node to open. - */ - if ((fd = _access_endpoint(transfer)) < 0) - return _errno_to_libusb(errno); - - if ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) - return _errno_to_libusb(errno); - - if (transfer->endpoint & LIBUSB_ENDPOINT_IN) { - if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) - if ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0) - return _errno_to_libusb(errno); - - nr = read(fd, transfer->buffer, transfer->length); - } else { - nr = write(fd, transfer->buffer, transfer->length); - } - - if (nr < 0) - return _errno_to_libusb(errno); - - itransfer->transferred = nr; - - return (0); -} Index: patches/patch-configure_ac =================================================================== RCS file: patches/patch-configure_ac diff -N patches/patch-configure_ac --- patches/patch-configure_ac 2 Nov 2011 14:31:56 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,23 +0,0 @@ ---- configure.ac.orig Wed May 5 00:01:36 2010 -+++ configure.ac Sat Sep 24 19:48:36 2011 -@@ -30,12 +30,20 @@ - backend="darwin" - AM_LDFLAGS="-Wl,-framework -Wl,IOKit -Wl,-framework -Wl,CoreFoundation -Wl,-prebind -no-undefined" - ;; -+*-openbsd*) -+ AC_DEFINE(OS_OPENBSD, [], [OpenBSD backend]) -+ AC_SUBST(OS_OPENBSD) -+ AC_MSG_RESULT([OpenBSD]) -+ backend="openbsd" -+ AM_LDFLAGS="" -+ ;; - *) - AC_MSG_ERROR([unsupported operating system]) - esac - - AM_CONDITIONAL([OS_LINUX], [test "x$backend" == "xlinux"]) - AM_CONDITIONAL([OS_DARWIN], [test "x$backend" == "xdarwin"]) -+AM_CONDITIONAL([OS_OPENBSD], [test "x$backend" == "xopenbsd"]) - - # Library versioning - lt_major="0" Index: patches/patch-libusb-1.0.pc_in =================================================================== RCS file: patches/patch-libusb-1.0.pc_in diff -N patches/patch-libusb-1.0.pc_in --- patches/patch-libusb-1.0.pc_in 2 Nov 2011 14:31:56 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,10 +0,0 @@ ---- libusb-1.0.pc.in.orig Sun Sep 25 12:22:30 2011 -+++ libusb-1.0.pc.in Sun Sep 25 12:24:04 2011 -@@ -6,6 +6,6 @@ - Name: libusb-1.0 - Description: C API for USB device access from Linux userspace - Version: @VERSION@ --Libs: -L${libdir} -lusb-1.0 -+Libs: -L${libdir} -lusb-1.0 -pthread - Cflags: -I${includedir}/libusb-1.0 - Index: patches/patch-libusb_Makefile_am =================================================================== RCS file: patches/patch-libusb_Makefile_am diff -N patches/patch-libusb_Makefile_am --- patches/patch-libusb_Makefile_am 2 Nov 2011 14:31:56 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,24 +0,0 @@ ---- libusb/Makefile.am.orig Sat Sep 24 16:28:54 2011 -+++ libusb/Makefile.am Sat Sep 24 16:29:57 2011 -@@ -2,8 +2,9 @@ - - LINUX_USBFS_SRC = os/linux_usbfs.h os/linux_usbfs.c - DARWIN_USB_SRC = os/darwin_usb.h os/darwin_usb.c -+OPENBSD_USB_SRC = os/openbsd_ugen.c - --EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) -+EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) - - if OS_LINUX - OS_SRC = $(LINUX_USBFS_SRC) -@@ -12,6 +13,10 @@ - if OS_DARWIN - OS_SRC = $(DARWIN_USB_SRC) - AM_CFLAGS_EXT = -no-cpp-precomp -+endif -+ -+if OS_OPENBSD -+OS_SRC = $(OPENBSD_USB_SRC) - endif - - libusb_1_0_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) -pthread Index: patches/patch-libusb_core_c =================================================================== RCS file: patches/patch-libusb_core_c diff -N patches/patch-libusb_core_c --- patches/patch-libusb_core_c 2 Nov 2011 14:31:56 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,11 +0,0 @@ ---- libusb/core.c.orig Fri Sep 23 12:27:20 2011 -+++ libusb/core.c Fri Sep 23 12:27:39 2011 -@@ -36,6 +36,8 @@ - const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; - #elif defined(OS_DARWIN) - const struct usbi_os_backend * const usbi_backend = &darwin_backend; -+#elif defined(OS_OPENBSD) -+const struct usbi_os_backend * const usbi_backend = &openbsd_backend; - #else - #error "Unsupported OS" - #endif Index: patches/patch-libusb_libusbi_h =================================================================== RCS file: patches/patch-libusb_libusbi_h diff -N patches/patch-libusb_libusbi_h --- patches/patch-libusb_libusbi_h 2 Nov 2011 14:31:56 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,10 +0,0 @@ ---- libusb/libusbi.h.orig Fri Sep 23 12:29:59 2011 -+++ libusb/libusbi.h Fri Sep 23 12:30:01 2011 -@@ -805,6 +805,7 @@ - - extern const struct usbi_os_backend linux_usbfs_backend; - extern const struct usbi_os_backend darwin_backend; -+extern const struct usbi_os_backend openbsd_backend; - - #endif -