libusb 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +1 -0
- data/History.md +8 -0
- data/README.md +5 -15
- data/Rakefile +8 -1
- data/ext/extconf.rb +49 -12
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/AUTHORS +12 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/COPYING +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/ChangeLog +18 -2
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/INSTALL +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.in +31 -18
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/NEWS +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/PORTING +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/README +5 -3
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/TODO +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/common.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/config.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/debug.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb.xcconfig +0 -0
- data/ext/libusb-1.0.20/Xcode/libusb.xcodeproj/project.pbxproj +865 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_debug.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_release.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/release.xcconfig +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/aclocal.m4 +35 -32
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/README +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/config.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Android.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Application.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/examples.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/libusb.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/tests.mk +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/compile +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.guess +13 -160
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.h.in +6 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.sub +26 -12
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure +244 -20
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure.ac +27 -4
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/depcomp +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.in +19 -6
- data/ext/libusb-1.0.20/doc/doxygen.cfg.in +2334 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.in +19 -6
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp_threaded.c +15 -10
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/fxload.c +28 -7
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt1.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/hotplugtest.c +21 -3
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/listdevs.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/sam3u_benchmark.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/xusb.c +2 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/install-sh +170 -196
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb-1.0.pc.in +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.am +15 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.in +192 -53
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/core.c +218 -100
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/descriptor.c +3 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.c +26 -9
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.h +8 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/io.c +432 -290
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.def +2 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.rc +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb.h +11 -10
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusbi.h +106 -29
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.c +27 -67
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.h +3 -7
- data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.am +5 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.in +810 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/aclocal.m4 +1193 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/compile +347 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/config.guess +1421 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/config.sub +1807 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/configure +17579 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/configure.ac +8 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/depcomp +791 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_pollfs.cpp +378 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb.h +112 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_backend.cpp +550 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.cpp +255 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.h +180 -0
- data/ext/libusb-1.0.20/libusb/os/haiku/install-sh +501 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/ltmain.sh +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/libtool.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltoptions.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltsugar.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltversion.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/lt~obsolete.m4 +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/missing +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_netlink.c +4 -4
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_udev.c +1 -2
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.c +46 -49
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.h +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/netbsd_usb.c +9 -73
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/openbsd_usb.c +9 -73
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.c +2 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.c +3 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.c +3 -3
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.c +3 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.c +87 -250
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_common.h +1 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.c +267 -181
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.h +22 -7
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/strerror.c +5 -2
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/sync.c +2 -1
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/version.h +1 -1
- data/ext/libusb-1.0.20/libusb/version_nano.h +1 -0
- data/ext/libusb-1.0.20/ltmain.sh +9655 -0
- data/ext/libusb-1.0.20/m4/libtool.m4 +7992 -0
- data/ext/libusb-1.0.20/m4/ltoptions.m4 +384 -0
- data/ext/libusb-1.0.20/m4/ltsugar.m4 +123 -0
- data/ext/libusb-1.0.20/m4/ltversion.m4 +23 -0
- data/ext/libusb-1.0.20/m4/lt~obsolete.m4 +98 -0
- data/ext/libusb-1.0.20/missing +215 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.am +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.in +19 -6
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/libusb_testlib.h +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/stress.c +0 -0
- data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/testlib.c +0 -0
- data/lib/libusb.rb +1 -0
- data/lib/libusb/call.rb +1 -0
- data/lib/libusb/context.rb +5 -2
- data/lib/libusb/stdio.rb +25 -0
- data/lib/libusb/version_gem.rb +1 -1
- data/libusb.gemspec +2 -1
- metadata +152 -115
- metadata.gz.sig +0 -0
- data/ext/libusb-1.0.19/Xcode/libusb.xcodeproj/project.pbxproj +0 -1
- data/ext/libusb-1.0.19/doc/doxygen.cfg.in +0 -1288
- data/ext/libusb-1.0.19/libusb/version_nano.h +0 -1
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
scriptversion=2013-10-28.13; # UTC
|
|
5
5
|
|
|
6
|
-
# Copyright (C) 1996-
|
|
6
|
+
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
|
7
7
|
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
8
8
|
|
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
|
@@ -20,10 +20,7 @@
|
|
|
20
20
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
#include
|
|
24
|
-
#include "libusb.h"
|
|
25
|
-
#include "libusbi.h"
|
|
26
|
-
#include "linux_usbfs.h"
|
|
23
|
+
#include <config.h>
|
|
27
24
|
|
|
28
25
|
#include <ctype.h>
|
|
29
26
|
#include <dirent.h>
|
|
@@ -53,6 +50,9 @@
|
|
|
53
50
|
#include <linux/filter.h>
|
|
54
51
|
#endif
|
|
55
52
|
|
|
53
|
+
#include "libusbi.h"
|
|
54
|
+
#include "linux_usbfs.h"
|
|
55
|
+
|
|
56
56
|
#define KERNEL 1
|
|
57
57
|
|
|
58
58
|
static int linux_netlink_socket = -1;
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
#include
|
|
23
|
+
#include <config.h>
|
|
24
24
|
|
|
25
25
|
#include <assert.h>
|
|
26
26
|
#include <ctype.h>
|
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
#include <unistd.h>
|
|
40
40
|
#include <libudev.h>
|
|
41
41
|
|
|
42
|
-
#include "libusb.h"
|
|
43
42
|
#include "libusbi.h"
|
|
44
43
|
#include "linux_usbfs.h"
|
|
45
44
|
|
|
@@ -38,7 +38,6 @@
|
|
|
38
38
|
#include <sys/utsname.h>
|
|
39
39
|
#include <unistd.h>
|
|
40
40
|
|
|
41
|
-
#include "libusb.h"
|
|
42
41
|
#include "libusbi.h"
|
|
43
42
|
#include "linux_usbfs.h"
|
|
44
43
|
|
|
@@ -199,7 +198,7 @@ static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent)
|
|
|
199
198
|
|
|
200
199
|
if (errno == ENOENT) {
|
|
201
200
|
if (!silent)
|
|
202
|
-
usbi_err(ctx, "File doesn't exist, wait %d ms and try again
|
|
201
|
+
usbi_err(ctx, "File doesn't exist, wait %d ms and try again", delay/1000);
|
|
203
202
|
|
|
204
203
|
/* Wait 10ms for USB device path creation.*/
|
|
205
204
|
usleep(delay);
|
|
@@ -308,6 +307,14 @@ static const char *find_usbfs_path(void)
|
|
|
308
307
|
}
|
|
309
308
|
}
|
|
310
309
|
|
|
310
|
+
/* On udev based systems without any usb-devices /dev/bus/usb will not
|
|
311
|
+
* exist. So if we've not found anything and we're using udev for hotplug
|
|
312
|
+
* simply assume /dev/bus/usb rather then making libusb_init fail. */
|
|
313
|
+
#if defined(USE_UDEV)
|
|
314
|
+
if (ret == NULL)
|
|
315
|
+
ret = "/dev/bus/usb";
|
|
316
|
+
#endif
|
|
317
|
+
|
|
311
318
|
if (ret != NULL)
|
|
312
319
|
usbi_dbg("found usbfs at %s", ret);
|
|
313
320
|
|
|
@@ -632,9 +639,9 @@ int linux_get_device_address (struct libusb_context *ctx, int detached,
|
|
|
632
639
|
|
|
633
640
|
/* will this work with all supported kernel versions? */
|
|
634
641
|
if (!strncmp(dev_node, "/dev/bus/usb", 12)) {
|
|
635
|
-
sscanf (dev_node, "/dev/bus/usb/%
|
|
642
|
+
sscanf (dev_node, "/dev/bus/usb/%hhu/%hhu", busnum, devaddr);
|
|
636
643
|
} else if (!strncmp(dev_node, "/proc/bus/usb", 13)) {
|
|
637
|
-
sscanf (dev_node, "/proc/bus/usb/%
|
|
644
|
+
sscanf (dev_node, "/proc/bus/usb/%hhu/%hhu", busnum, devaddr);
|
|
638
645
|
}
|
|
639
646
|
|
|
640
647
|
return LIBUSB_SUCCESS;
|
|
@@ -998,6 +1005,9 @@ static int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_di
|
|
|
998
1005
|
}
|
|
999
1006
|
|
|
1000
1007
|
parent_sysfs_dir = strdup(sysfs_dir);
|
|
1008
|
+
if (NULL == parent_sysfs_dir) {
|
|
1009
|
+
return LIBUSB_ERROR_NO_MEM;
|
|
1010
|
+
}
|
|
1001
1011
|
if (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) ||
|
|
1002
1012
|
NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) {
|
|
1003
1013
|
dev->port_number = atoi(tmp + 1);
|
|
@@ -1765,10 +1775,6 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer)
|
|
|
1765
1775
|
int bulk_buffer_len, use_bulk_continuation;
|
|
1766
1776
|
int r;
|
|
1767
1777
|
int i;
|
|
1768
|
-
size_t alloc_size;
|
|
1769
|
-
|
|
1770
|
-
if (tpriv->urbs)
|
|
1771
|
-
return LIBUSB_ERROR_BUSY;
|
|
1772
1778
|
|
|
1773
1779
|
if (is_out && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) &&
|
|
1774
1780
|
!(dpriv->caps & USBFS_CAP_ZERO_PACKET))
|
|
@@ -1827,8 +1833,7 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer)
|
|
|
1827
1833
|
}
|
|
1828
1834
|
usbi_dbg("need %d urbs for new transfer with length %d", num_urbs,
|
|
1829
1835
|
transfer->length);
|
|
1830
|
-
|
|
1831
|
-
urbs = calloc(1, alloc_size);
|
|
1836
|
+
urbs = calloc(num_urbs, sizeof(struct usbfs_urb));
|
|
1832
1837
|
if (!urbs)
|
|
1833
1838
|
return LIBUSB_ERROR_NO_MEM;
|
|
1834
1839
|
tpriv->urbs = urbs;
|
|
@@ -1946,18 +1951,11 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer)
|
|
|
1946
1951
|
unsigned int packet_len;
|
|
1947
1952
|
unsigned char *urb_buffer = transfer->buffer;
|
|
1948
1953
|
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
*
|
|
1954
|
-
* units at once. it would be simpler if we just fired one unit at a time,
|
|
1955
|
-
* but there is a big performance gain through doing it this way.
|
|
1956
|
-
*
|
|
1957
|
-
* Newer kernels lift the 32k limit (USBFS_CAP_NO_PACKET_SIZE_LIM),
|
|
1958
|
-
* using arbritary large transfers is still be a bad idea though, as
|
|
1959
|
-
* the kernel needs to allocate physical contiguous memory for this,
|
|
1960
|
-
* which may fail for large buffers.
|
|
1954
|
+
/* usbfs places arbitrary limits on iso URBs. this limit has changed
|
|
1955
|
+
* at least three times, and it's difficult to accurately detect which
|
|
1956
|
+
* limit this running kernel might impose. so we attempt to submit
|
|
1957
|
+
* whatever the user has provided. if the kernel rejects the request
|
|
1958
|
+
* due to its size, we return an error indicating such to the user.
|
|
1961
1959
|
*/
|
|
1962
1960
|
|
|
1963
1961
|
/* calculate how many URBs we need */
|
|
@@ -1968,14 +1966,16 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer)
|
|
|
1968
1966
|
if (packet_len > space_remaining) {
|
|
1969
1967
|
num_urbs++;
|
|
1970
1968
|
this_urb_len = packet_len;
|
|
1969
|
+
/* check that we can actually support this packet length */
|
|
1970
|
+
if (this_urb_len > MAX_ISO_BUFFER_LENGTH)
|
|
1971
|
+
return LIBUSB_ERROR_INVALID_PARAM;
|
|
1971
1972
|
} else {
|
|
1972
1973
|
this_urb_len += packet_len;
|
|
1973
1974
|
}
|
|
1974
1975
|
}
|
|
1975
|
-
usbi_dbg("need %d
|
|
1976
|
+
usbi_dbg("need %d %dk URBs for transfer", num_urbs, MAX_ISO_BUFFER_LENGTH / 1024);
|
|
1976
1977
|
|
|
1977
|
-
|
|
1978
|
-
urbs = calloc(1, alloc_size);
|
|
1978
|
+
urbs = calloc(num_urbs, sizeof(*urbs));
|
|
1979
1979
|
if (!urbs)
|
|
1980
1980
|
return LIBUSB_ERROR_NO_MEM;
|
|
1981
1981
|
|
|
@@ -2040,6 +2040,10 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer)
|
|
|
2040
2040
|
if (r < 0) {
|
|
2041
2041
|
if (errno == ENODEV) {
|
|
2042
2042
|
r = LIBUSB_ERROR_NO_DEVICE;
|
|
2043
|
+
} else if (errno == EINVAL) {
|
|
2044
|
+
usbi_warn(TRANSFER_CTX(transfer),
|
|
2045
|
+
"submiturb failed, transfer too large");
|
|
2046
|
+
r = LIBUSB_ERROR_INVALID_PARAM;
|
|
2043
2047
|
} else {
|
|
2044
2048
|
usbi_err(TRANSFER_CTX(transfer),
|
|
2045
2049
|
"submiturb failed error %d errno=%d", r, errno);
|
|
@@ -2093,9 +2097,6 @@ static int submit_control_transfer(struct usbi_transfer *itransfer)
|
|
|
2093
2097
|
struct usbfs_urb *urb;
|
|
2094
2098
|
int r;
|
|
2095
2099
|
|
|
2096
|
-
if (tpriv->urbs)
|
|
2097
|
-
return LIBUSB_ERROR_BUSY;
|
|
2098
|
-
|
|
2099
2100
|
if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH)
|
|
2100
2101
|
return LIBUSB_ERROR_INVALID_PARAM;
|
|
2101
2102
|
|
|
@@ -2153,6 +2154,14 @@ static int op_cancel_transfer(struct usbi_transfer *itransfer)
|
|
|
2153
2154
|
struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
|
|
2154
2155
|
struct libusb_transfer *transfer =
|
|
2155
2156
|
USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
2157
|
+
int r;
|
|
2158
|
+
|
|
2159
|
+
if (!tpriv->urbs)
|
|
2160
|
+
return LIBUSB_ERROR_NOT_FOUND;
|
|
2161
|
+
|
|
2162
|
+
r = discard_urbs(itransfer, 0, tpriv->num_urbs);
|
|
2163
|
+
if (r != 0)
|
|
2164
|
+
return r;
|
|
2156
2165
|
|
|
2157
2166
|
switch (transfer->type) {
|
|
2158
2167
|
case LIBUSB_TRANSFER_TYPE_BULK:
|
|
@@ -2160,21 +2169,11 @@ static int op_cancel_transfer(struct usbi_transfer *itransfer)
|
|
|
2160
2169
|
if (tpriv->reap_action == ERROR)
|
|
2161
2170
|
break;
|
|
2162
2171
|
/* else, fall through */
|
|
2163
|
-
case LIBUSB_TRANSFER_TYPE_CONTROL:
|
|
2164
|
-
case LIBUSB_TRANSFER_TYPE_INTERRUPT:
|
|
2165
|
-
case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
|
|
2166
|
-
tpriv->reap_action = CANCELLED;
|
|
2167
|
-
break;
|
|
2168
2172
|
default:
|
|
2169
|
-
|
|
2170
|
-
"unknown endpoint type %d", transfer->type);
|
|
2171
|
-
return LIBUSB_ERROR_INVALID_PARAM;
|
|
2173
|
+
tpriv->reap_action = CANCELLED;
|
|
2172
2174
|
}
|
|
2173
2175
|
|
|
2174
|
-
|
|
2175
|
-
return LIBUSB_ERROR_NOT_FOUND;
|
|
2176
|
-
|
|
2177
|
-
return discard_urbs(itransfer, 0, tpriv->num_urbs);
|
|
2176
|
+
return 0;
|
|
2178
2177
|
}
|
|
2179
2178
|
|
|
2180
2179
|
static void op_clear_transfer_priv(struct usbi_transfer *itransfer)
|
|
@@ -2189,17 +2188,16 @@ static void op_clear_transfer_priv(struct usbi_transfer *itransfer)
|
|
|
2189
2188
|
case LIBUSB_TRANSFER_TYPE_BULK:
|
|
2190
2189
|
case LIBUSB_TRANSFER_TYPE_BULK_STREAM:
|
|
2191
2190
|
case LIBUSB_TRANSFER_TYPE_INTERRUPT:
|
|
2192
|
-
|
|
2193
|
-
if (tpriv->urbs)
|
|
2191
|
+
if (tpriv->urbs) {
|
|
2194
2192
|
free(tpriv->urbs);
|
|
2195
|
-
|
|
2196
|
-
|
|
2193
|
+
tpriv->urbs = NULL;
|
|
2194
|
+
}
|
|
2197
2195
|
break;
|
|
2198
2196
|
case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
|
|
2199
|
-
|
|
2200
|
-
if (tpriv->iso_urbs)
|
|
2197
|
+
if (tpriv->iso_urbs) {
|
|
2201
2198
|
free_iso_urbs(tpriv);
|
|
2202
|
-
|
|
2199
|
+
tpriv->iso_urbs = NULL;
|
|
2200
|
+
}
|
|
2203
2201
|
break;
|
|
2204
2202
|
default:
|
|
2205
2203
|
usbi_err(TRANSFER_CTX(transfer),
|
|
@@ -2591,7 +2589,7 @@ static int op_handle_events(struct libusb_context *ctx,
|
|
|
2591
2589
|
}
|
|
2592
2590
|
|
|
2593
2591
|
if (!hpriv || hpriv->fd != pollfd->fd) {
|
|
2594
|
-
usbi_err(ctx, "cannot find handle for fd %d
|
|
2592
|
+
usbi_err(ctx, "cannot find handle for fd %d",
|
|
2595
2593
|
pollfd->fd);
|
|
2596
2594
|
continue;
|
|
2597
2595
|
}
|
|
@@ -2691,5 +2689,4 @@ const struct usbi_os_backend linux_usbfs_backend = {
|
|
|
2691
2689
|
.device_priv_size = sizeof(struct linux_device_priv),
|
|
2692
2690
|
.device_handle_priv_size = sizeof(struct linux_device_handle_priv),
|
|
2693
2691
|
.transfer_priv_size = sizeof(struct linux_transfer_priv),
|
|
2694
|
-
.add_iso_packet_size = 0,
|
|
2695
2692
|
};
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
#include <config.h>
|
|
20
|
+
|
|
19
21
|
#include <sys/time.h>
|
|
20
22
|
#include <sys/types.h>
|
|
21
23
|
|
|
@@ -28,7 +30,6 @@
|
|
|
28
30
|
|
|
29
31
|
#include <dev/usb/usb.h>
|
|
30
32
|
|
|
31
|
-
#include "libusb.h"
|
|
32
33
|
#include "libusbi.h"
|
|
33
34
|
|
|
34
35
|
struct device_priv {
|
|
@@ -40,7 +41,6 @@ struct device_priv {
|
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
struct handle_priv {
|
|
43
|
-
int pipe[2]; /* for event notification */
|
|
44
44
|
int endpoints[USB_MAX_ENDPOINTS];
|
|
45
45
|
};
|
|
46
46
|
|
|
@@ -74,8 +74,7 @@ static void netbsd_destroy_device(struct libusb_device *);
|
|
|
74
74
|
static int netbsd_submit_transfer(struct usbi_transfer *);
|
|
75
75
|
static int netbsd_cancel_transfer(struct usbi_transfer *);
|
|
76
76
|
static void netbsd_clear_transfer_priv(struct usbi_transfer *);
|
|
77
|
-
static int
|
|
78
|
-
nfds_t, int);
|
|
77
|
+
static int netbsd_handle_transfer_completion(struct usbi_transfer *);
|
|
79
78
|
static int netbsd_clock_gettime(int, struct timespec *);
|
|
80
79
|
|
|
81
80
|
/*
|
|
@@ -125,13 +124,13 @@ const struct usbi_os_backend netbsd_backend = {
|
|
|
125
124
|
netbsd_cancel_transfer,
|
|
126
125
|
netbsd_clear_transfer_priv,
|
|
127
126
|
|
|
128
|
-
|
|
127
|
+
NULL, /* handle_events() */
|
|
128
|
+
netbsd_handle_transfer_completion,
|
|
129
129
|
|
|
130
130
|
netbsd_clock_gettime,
|
|
131
131
|
sizeof(struct device_priv),
|
|
132
132
|
sizeof(struct handle_priv),
|
|
133
133
|
0, /* transfer_priv_size */
|
|
134
|
-
0, /* add_iso_packet_size */
|
|
135
134
|
};
|
|
136
135
|
|
|
137
136
|
int
|
|
@@ -222,10 +221,7 @@ netbsd_open(struct libusb_device_handle *handle)
|
|
|
222
221
|
|
|
223
222
|
usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd);
|
|
224
223
|
|
|
225
|
-
|
|
226
|
-
return _errno_to_libusb(errno);
|
|
227
|
-
|
|
228
|
-
return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->pipe[0], POLLIN);
|
|
224
|
+
return (LIBUSB_SUCCESS);
|
|
229
225
|
}
|
|
230
226
|
|
|
231
227
|
void
|
|
@@ -238,11 +234,6 @@ netbsd_close(struct libusb_device_handle *handle)
|
|
|
238
234
|
|
|
239
235
|
close(dpriv->fd);
|
|
240
236
|
dpriv->fd = -1;
|
|
241
|
-
|
|
242
|
-
usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
|
|
243
|
-
|
|
244
|
-
close(hpriv->pipe[0]);
|
|
245
|
-
close(hpriv->pipe[1]);
|
|
246
237
|
}
|
|
247
238
|
|
|
248
239
|
int
|
|
@@ -469,8 +460,7 @@ netbsd_submit_transfer(struct usbi_transfer *itransfer)
|
|
|
469
460
|
if (err)
|
|
470
461
|
return (err);
|
|
471
462
|
|
|
472
|
-
|
|
473
|
-
return _errno_to_libusb(errno);
|
|
463
|
+
usbi_signal_transfer_completion(itransfer);
|
|
474
464
|
|
|
475
465
|
return (LIBUSB_SUCCESS);
|
|
476
466
|
}
|
|
@@ -492,63 +482,9 @@ netbsd_clear_transfer_priv(struct usbi_transfer *itransfer)
|
|
|
492
482
|
}
|
|
493
483
|
|
|
494
484
|
int
|
|
495
|
-
|
|
496
|
-
int num_ready)
|
|
485
|
+
netbsd_handle_transfer_completion(struct usbi_transfer *itransfer)
|
|
497
486
|
{
|
|
498
|
-
|
|
499
|
-
struct handle_priv *hpriv = NULL;
|
|
500
|
-
struct usbi_transfer *itransfer;
|
|
501
|
-
struct pollfd *pollfd;
|
|
502
|
-
int i, err = 0;
|
|
503
|
-
|
|
504
|
-
usbi_dbg("");
|
|
505
|
-
|
|
506
|
-
pthread_mutex_lock(&ctx->open_devs_lock);
|
|
507
|
-
for (i = 0; i < nfds && num_ready > 0; i++) {
|
|
508
|
-
pollfd = &fds[i];
|
|
509
|
-
|
|
510
|
-
if (!pollfd->revents)
|
|
511
|
-
continue;
|
|
512
|
-
|
|
513
|
-
hpriv = NULL;
|
|
514
|
-
num_ready--;
|
|
515
|
-
list_for_each_entry(handle, &ctx->open_devs, list,
|
|
516
|
-
struct libusb_device_handle) {
|
|
517
|
-
hpriv = (struct handle_priv *)handle->os_priv;
|
|
518
|
-
|
|
519
|
-
if (hpriv->pipe[0] == pollfd->fd)
|
|
520
|
-
break;
|
|
521
|
-
|
|
522
|
-
hpriv = NULL;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
if (NULL == hpriv) {
|
|
526
|
-
usbi_dbg("fd %d is not an event pipe!", pollfd->fd);
|
|
527
|
-
err = ENOENT;
|
|
528
|
-
break;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
if (pollfd->revents & POLLERR) {
|
|
532
|
-
usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
|
|
533
|
-
usbi_handle_disconnect(handle);
|
|
534
|
-
continue;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
if (read(hpriv->pipe[0], &itransfer, sizeof(itransfer)) < 0) {
|
|
538
|
-
err = errno;
|
|
539
|
-
break;
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
if ((err = usbi_handle_transfer_completion(itransfer,
|
|
543
|
-
LIBUSB_TRANSFER_COMPLETED)))
|
|
544
|
-
break;
|
|
545
|
-
}
|
|
546
|
-
pthread_mutex_unlock(&ctx->open_devs_lock);
|
|
547
|
-
|
|
548
|
-
if (err)
|
|
549
|
-
return _errno_to_libusb(err);
|
|
550
|
-
|
|
551
|
-
return (LIBUSB_SUCCESS);
|
|
487
|
+
return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);
|
|
552
488
|
}
|
|
553
489
|
|
|
554
490
|
int
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
#include <config.h>
|
|
20
|
+
|
|
19
21
|
#include <sys/time.h>
|
|
20
22
|
#include <sys/types.h>
|
|
21
23
|
|
|
@@ -28,7 +30,6 @@
|
|
|
28
30
|
|
|
29
31
|
#include <dev/usb/usb.h>
|
|
30
32
|
|
|
31
|
-
#include "libusb.h"
|
|
32
33
|
#include "libusbi.h"
|
|
33
34
|
|
|
34
35
|
struct device_priv {
|
|
@@ -40,7 +41,6 @@ struct device_priv {
|
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
struct handle_priv {
|
|
43
|
-
int pipe[2]; /* for event notification */
|
|
44
44
|
int endpoints[USB_MAX_ENDPOINTS];
|
|
45
45
|
};
|
|
46
46
|
|
|
@@ -74,8 +74,7 @@ static void obsd_destroy_device(struct libusb_device *);
|
|
|
74
74
|
static int obsd_submit_transfer(struct usbi_transfer *);
|
|
75
75
|
static int obsd_cancel_transfer(struct usbi_transfer *);
|
|
76
76
|
static void obsd_clear_transfer_priv(struct usbi_transfer *);
|
|
77
|
-
static int
|
|
78
|
-
nfds_t, int);
|
|
77
|
+
static int obsd_handle_transfer_completion(struct usbi_transfer *);
|
|
79
78
|
static int obsd_clock_gettime(int, struct timespec *);
|
|
80
79
|
|
|
81
80
|
/*
|
|
@@ -128,13 +127,13 @@ const struct usbi_os_backend openbsd_backend = {
|
|
|
128
127
|
obsd_cancel_transfer,
|
|
129
128
|
obsd_clear_transfer_priv,
|
|
130
129
|
|
|
131
|
-
|
|
130
|
+
NULL, /* handle_events() */
|
|
131
|
+
obsd_handle_transfer_completion,
|
|
132
132
|
|
|
133
133
|
obsd_clock_gettime,
|
|
134
134
|
sizeof(struct device_priv),
|
|
135
135
|
sizeof(struct handle_priv),
|
|
136
136
|
0, /* transfer_priv_size */
|
|
137
|
-
0, /* add_iso_packet_size */
|
|
138
137
|
};
|
|
139
138
|
|
|
140
139
|
#define DEVPATH "/dev/"
|
|
@@ -262,10 +261,7 @@ obsd_open(struct libusb_device_handle *handle)
|
|
|
262
261
|
usbi_dbg("open %s: fd %d", devnode, dpriv->fd);
|
|
263
262
|
}
|
|
264
263
|
|
|
265
|
-
|
|
266
|
-
return _errno_to_libusb(errno);
|
|
267
|
-
|
|
268
|
-
return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->pipe[0], POLLIN);
|
|
264
|
+
return (LIBUSB_SUCCESS);
|
|
269
265
|
}
|
|
270
266
|
|
|
271
267
|
void
|
|
@@ -280,11 +276,6 @@ obsd_close(struct libusb_device_handle *handle)
|
|
|
280
276
|
close(dpriv->fd);
|
|
281
277
|
dpriv->fd = -1;
|
|
282
278
|
}
|
|
283
|
-
|
|
284
|
-
usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
|
|
285
|
-
|
|
286
|
-
close(hpriv->pipe[0]);
|
|
287
|
-
close(hpriv->pipe[1]);
|
|
288
279
|
}
|
|
289
280
|
|
|
290
281
|
int
|
|
@@ -515,8 +506,7 @@ obsd_submit_transfer(struct usbi_transfer *itransfer)
|
|
|
515
506
|
if (err)
|
|
516
507
|
return (err);
|
|
517
508
|
|
|
518
|
-
|
|
519
|
-
return _errno_to_libusb(errno);
|
|
509
|
+
usbi_signal_transfer_completion(itransfer);
|
|
520
510
|
|
|
521
511
|
return (LIBUSB_SUCCESS);
|
|
522
512
|
}
|
|
@@ -538,63 +528,9 @@ obsd_clear_transfer_priv(struct usbi_transfer *itransfer)
|
|
|
538
528
|
}
|
|
539
529
|
|
|
540
530
|
int
|
|
541
|
-
|
|
542
|
-
int num_ready)
|
|
531
|
+
obsd_handle_transfer_completion(struct usbi_transfer *itransfer)
|
|
543
532
|
{
|
|
544
|
-
|
|
545
|
-
struct handle_priv *hpriv = NULL;
|
|
546
|
-
struct usbi_transfer *itransfer;
|
|
547
|
-
struct pollfd *pollfd;
|
|
548
|
-
int i, err = 0;
|
|
549
|
-
|
|
550
|
-
usbi_dbg("");
|
|
551
|
-
|
|
552
|
-
pthread_mutex_lock(&ctx->open_devs_lock);
|
|
553
|
-
for (i = 0; i < nfds && num_ready > 0; i++) {
|
|
554
|
-
pollfd = &fds[i];
|
|
555
|
-
|
|
556
|
-
if (!pollfd->revents)
|
|
557
|
-
continue;
|
|
558
|
-
|
|
559
|
-
hpriv = NULL;
|
|
560
|
-
num_ready--;
|
|
561
|
-
list_for_each_entry(handle, &ctx->open_devs, list,
|
|
562
|
-
struct libusb_device_handle) {
|
|
563
|
-
hpriv = (struct handle_priv *)handle->os_priv;
|
|
564
|
-
|
|
565
|
-
if (hpriv->pipe[0] == pollfd->fd)
|
|
566
|
-
break;
|
|
567
|
-
|
|
568
|
-
hpriv = NULL;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
if (NULL == hpriv) {
|
|
572
|
-
usbi_dbg("fd %d is not an event pipe!", pollfd->fd);
|
|
573
|
-
err = ENOENT;
|
|
574
|
-
break;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
if (pollfd->revents & POLLERR) {
|
|
578
|
-
usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
|
|
579
|
-
usbi_handle_disconnect(handle);
|
|
580
|
-
continue;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
if (read(hpriv->pipe[0], &itransfer, sizeof(itransfer)) < 0) {
|
|
584
|
-
err = errno;
|
|
585
|
-
break;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
if ((err = usbi_handle_transfer_completion(itransfer,
|
|
589
|
-
LIBUSB_TRANSFER_COMPLETED)))
|
|
590
|
-
break;
|
|
591
|
-
}
|
|
592
|
-
pthread_mutex_unlock(&ctx->open_devs_lock);
|
|
593
|
-
|
|
594
|
-
if (err)
|
|
595
|
-
return _errno_to_libusb(err);
|
|
596
|
-
|
|
597
|
-
return (LIBUSB_SUCCESS);
|
|
533
|
+
return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);
|
|
598
534
|
}
|
|
599
535
|
|
|
600
536
|
int
|