mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #4150 from Pringo/master
Externals: Update libusb to version 1.0.20
This commit is contained in:
Vendored
+12
-1
@@ -8,20 +8,22 @@ Copyright © 2010-2012 Michael Plante <michael.plante@gmail.com>
|
||||
Copyright © 2011-2013 Hans de Goede <hdegoede@redhat.com>
|
||||
Copyright © 2012-2013 Martin Pieuchot <mpi@openbsd.org>
|
||||
Copyright © 2012-2013 Toby Gray <toby.gray@realvnc.com>
|
||||
Copyright © 2013-2015 Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
|
||||
Other contributors:
|
||||
Akshay Jaggi
|
||||
Alan Ott
|
||||
Alan Stern
|
||||
Alex Vatchenko
|
||||
Andrew Fernandes
|
||||
Anthony Clay
|
||||
Antonio Ospite
|
||||
Artem Egorkine
|
||||
Aurelien Jarno
|
||||
Bastien Nocera
|
||||
Bei Zhang
|
||||
Benjamin Dobell
|
||||
Carl Karsten
|
||||
Chris Dickens
|
||||
Colin Walters
|
||||
Dave Camarillo
|
||||
David Engraf
|
||||
@@ -32,6 +34,7 @@ Felipe Balbi
|
||||
Florian Albrechtskirchinger
|
||||
Francesco Montorsi
|
||||
Francisco Facioni
|
||||
Gaurav Gupta
|
||||
Graeme Gill
|
||||
Gustavo Zacarias
|
||||
Hans Ulrich Niedermann
|
||||
@@ -48,7 +51,9 @@ Kuangye Guo
|
||||
Lars Kanis
|
||||
Lars Wirzenius
|
||||
Luca Longinotti
|
||||
Marcus Meissner
|
||||
Markus Heidelberg
|
||||
Martin Ettl
|
||||
Martin Koegler
|
||||
Matthias Bolte
|
||||
Mike Frysinger
|
||||
@@ -64,15 +69,21 @@ Rob Walker
|
||||
Sean McBride
|
||||
Sebastian Pipping
|
||||
Simon Haggett
|
||||
Simon Newton
|
||||
Thomas Röfer
|
||||
Tim Hutt
|
||||
Tim Roberts
|
||||
Tobias Klauser
|
||||
Toby Peterson
|
||||
Tormod Volden
|
||||
Trygve Laugstøl
|
||||
Uri Lublin
|
||||
Vasily Khoruzhick
|
||||
Vegard Storheil Eriksen
|
||||
Venkatesh Shukla
|
||||
Vitali Lovich
|
||||
Xiaofan Chen
|
||||
Zoltán Kovács
|
||||
Роман Донченко
|
||||
parafin
|
||||
xantares
|
||||
|
||||
Vendored
+18
-2
@@ -1,14 +1,30 @@
|
||||
For detailed information about the changes below, please see the git log or
|
||||
visit: http://log.libusb.info
|
||||
|
||||
2015-09-13: v1.0.20
|
||||
* Add Haiku support
|
||||
* Fix multiple memory and resource leaks (#16, #52, #76, #81)
|
||||
* Fix possible deadlock when executing transfer callback
|
||||
* New libusb_free_pollfds() API
|
||||
* Darwin: Fix devices not being detected on OS X 10.8 (#48)
|
||||
* Linux: Allow larger isochronous transfer submission (#23)
|
||||
* Windows: Fix broken builds Cygwin/MinGW builds and compiler warnings
|
||||
* Windows: Fix broken bus number lookup
|
||||
* Windows: Improve submission of control requests for composite devices
|
||||
* Examples: Add two-stage load support to fxload (#12)
|
||||
* Correctly report cancellations due to timeouts
|
||||
* Improve efficiency of event handling
|
||||
* Improve speed of transfer submission in multi-threaded environments
|
||||
* Various other bug fixes and improvements
|
||||
The (#xx) numbers are libusb issue numbers, see ie:
|
||||
https://github.com/libusb/libusb/issues/16
|
||||
|
||||
2014-05-30: v1.0.19
|
||||
* Add support for USB bulk streams on Linux and Mac OS X (#11)
|
||||
* Windows: Add AMD and Intel USB-3.0 root hub support
|
||||
* Windows: Fix USB 3.0 speed detection on Windows 8 or later (#10)
|
||||
* Added Russian translation for libusb_strerror strings
|
||||
* All: Various small fixes and cleanups
|
||||
The (#xx) numbers are libusb issue numbers, see ie:
|
||||
https://github.com/libusb/libusb/issues/11
|
||||
|
||||
2014-01-25: v1.0.18
|
||||
* Fix multiple memory leaks
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
Dolphin-specific changes (as of 2015-02-12)
|
||||
Dolphin-specific changes (as of 2016-08-25)
|
||||
-------------------------------------------
|
||||
|
||||
- removed all toplevel directories save msvc/ & libusb/
|
||||
|
||||
Vendored
+5
-3
@@ -2,9 +2,10 @@ libusb
|
||||
======
|
||||
|
||||
libusb is a library for USB device access from Linux, Mac OS X,
|
||||
Windows and OpenBSD/NetBSD userspace.
|
||||
It is written in C and licensed under the GNU Lesser General Public
|
||||
License version 2.1 or, at your option, any later version (see COPYING).
|
||||
Windows, OpenBSD/NetBSD and Haiku userspace.
|
||||
It is written in C (Haiku backend in C++) and licensed under the GNU
|
||||
Lesser General Public License version 2.1 or, at your option, any later
|
||||
version (see COPYING).
|
||||
|
||||
libusb is abstracted internally in such a way that it can hopefully
|
||||
be ported to other operating systems. Please see the PORTING file
|
||||
@@ -24,4 +25,5 @@ http://mailing-list.libusb.info
|
||||
- Xiaofan Chen <xiaofanc@gmail.com>
|
||||
- Ludovic Rousseau <ludovic.rousseau@gmail.com>
|
||||
- Nathan Hjelm <hjelmn@users.sourceforge.net>
|
||||
- Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
(Please use the mailing list rather than mailing developers directly)
|
||||
|
||||
Vendored
+15
@@ -12,12 +12,18 @@ NETBSD_USB_SRC = os/netbsd_usb.c
|
||||
WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc libusb-1.0.def
|
||||
WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h
|
||||
|
||||
DIST_SUBDIRS =
|
||||
|
||||
EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \
|
||||
$(NETBSD_USB_SRC) $(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \
|
||||
$(POSIX_POLL_SRC) \
|
||||
os/threads_posix.c os/threads_windows.c \
|
||||
os/linux_udev.c os/linux_netlink.c
|
||||
|
||||
dist-hook:
|
||||
cp -r os/haiku $(distdir)/os/haiku
|
||||
rm -rf $(distdir)/os/haiku/autom4te.cache
|
||||
|
||||
if OS_LINUX
|
||||
|
||||
if USE_UDEV
|
||||
@@ -43,6 +49,11 @@ if OS_NETBSD
|
||||
OS_SRC = $(NETBSD_USB_SRC) $(POSIX_POLL_SRC)
|
||||
endif
|
||||
|
||||
if OS_HAIKU
|
||||
OS_SRC = $(POSIX_POLL_SRC)
|
||||
SUBDIRS = os/haiku
|
||||
endif
|
||||
|
||||
if OS_WINDOWS
|
||||
OS_SRC = $(WINDOWS_USB_SRC)
|
||||
|
||||
@@ -71,5 +82,9 @@ libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c strerror.c sync.c \
|
||||
hotplug.h hotplug.c $(THREADS_SRC) $(OS_SRC) \
|
||||
os/poll_posix.h os/poll_windows.h
|
||||
|
||||
if OS_HAIKU
|
||||
libusb_1_0_la_LIBADD = os/haiku/libhaikuusb.la
|
||||
endif
|
||||
|
||||
hdrdir = $(includedir)/libusb-1.0
|
||||
hdr_HEADERS = libusb.h
|
||||
|
||||
Vendored
+192
-53
@@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@@ -16,7 +16,17 @@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
@@ -80,8 +90,6 @@ POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = libusb
|
||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||
$(top_srcdir)/depcomp $(hdr_HEADERS)
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
@@ -89,6 +97,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/libusb/version.h $(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(hdr_HEADERS) $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
@@ -122,7 +131,7 @@ am__uninstall_files_from_dir = { \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hdrdir)"
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libusb_1_0_la_LIBADD =
|
||||
@OS_HAIKU_TRUE@libusb_1_0_la_DEPENDENCIES = os/haiku/libhaikuusb.la
|
||||
am__libusb_1_0_la_SOURCES_DIST = libusbi.h core.c descriptor.c io.c \
|
||||
strerror.c sync.c os/linux_usbfs.h os/darwin_usb.h \
|
||||
os/windows_usb.h os/windows_common.h hotplug.h hotplug.c \
|
||||
@@ -143,17 +152,18 @@ am__objects_5 = os/libusb_1_0_la-netbsd_usb.lo
|
||||
am__objects_6 = os/libusb_1_0_la-openbsd_usb.lo
|
||||
am__objects_7 = os/libusb_1_0_la-poll_windows.lo \
|
||||
os/libusb_1_0_la-windows_usb.lo libusb-1.0.lo
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_FALSE@@OS_OPENBSD_FALSE@@OS_WINDOWS_TRUE@am__objects_8 = $(am__objects_7)
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_FALSE@@OS_OPENBSD_TRUE@am__objects_8 = $(am__objects_6) \
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_FALSE@@OS_OPENBSD_TRUE@ $(am__objects_3)
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_TRUE@am__objects_8 = $(am__objects_5) \
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_TRUE@ $(am__objects_3)
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@am__objects_8 = $(am__objects_4) \
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@ $(am__objects_3) \
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@ os/libusb_1_0_la-linux_netlink.lo
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@am__objects_8 = $(am__objects_4) \
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@ $(am__objects_3) \
|
||||
@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@ os/libusb_1_0_la-linux_udev.lo
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_FALSE@@OS_OPENBSD_FALSE@@OS_WINDOWS_TRUE@am__objects_8 = $(am__objects_7)
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_FALSE@@OS_OPENBSD_TRUE@am__objects_8 = $(am__objects_6) \
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_FALSE@@OS_OPENBSD_TRUE@ $(am__objects_3)
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_TRUE@am__objects_8 = $(am__objects_5) \
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_FALSE@@OS_NETBSD_TRUE@ $(am__objects_3)
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@am__objects_8 = $(am__objects_4) \
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@ $(am__objects_3) \
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@ os/libusb_1_0_la-linux_netlink.lo
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@am__objects_8 = $(am__objects_4) \
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@ $(am__objects_3) \
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@ os/libusb_1_0_la-linux_udev.lo
|
||||
@OS_DARWIN_FALSE@@OS_HAIKU_TRUE@am__objects_8 = $(am__objects_3)
|
||||
@OS_DARWIN_TRUE@am__objects_8 = $(am__objects_2) $(am__objects_3)
|
||||
am_libusb_1_0_la_OBJECTS = libusb_1_0_la-core.lo \
|
||||
libusb_1_0_la-descriptor.lo libusb_1_0_la-io.lo \
|
||||
@@ -203,12 +213,28 @@ am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(libusb_1_0_la_SOURCES)
|
||||
DIST_SOURCES = $(am__libusb_1_0_la_SOURCES_DIST)
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
install-exec-recursive install-html-recursive \
|
||||
install-info-recursive install-pdf-recursive \
|
||||
install-ps-recursive install-recursive installcheck-recursive \
|
||||
installdirs-recursive pdf-recursive ps-recursive \
|
||||
tags-recursive uninstall-recursive
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
HEADERS = $(hdr_HEADERS)
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
am__recursive_targets = \
|
||||
$(RECURSIVE_TARGETS) \
|
||||
$(RECURSIVE_CLEAN_TARGETS) \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
distdir
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
@@ -228,7 +254,33 @@ am__define_uniq_tagged_files = \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
am__relativize = \
|
||||
dir0=`pwd`; \
|
||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||
sed_rest='s,^[^/]*/*,,'; \
|
||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
||||
sed_butlast='s,/*[^/]*$$,,'; \
|
||||
while test -n "$$dir1"; do \
|
||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
||||
if test "$$first" != "."; then \
|
||||
if test "$$first" = ".."; then \
|
||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
||||
else \
|
||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
||||
if test "$$first2" = "$$first"; then \
|
||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
||||
else \
|
||||
dir2="../$$dir2"; \
|
||||
fi; \
|
||||
dir0="$$dir0"/"$$first"; \
|
||||
fi; \
|
||||
fi; \
|
||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
||||
done; \
|
||||
reldir="$$dir2"
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
@@ -279,6 +331,7 @@ NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OS_DARWIN = @OS_DARWIN@
|
||||
OS_HAIKU = @OS_HAIKU@
|
||||
OS_LINUX = @OS_LINUX@
|
||||
OS_NETBSD = @OS_NETBSD@
|
||||
OS_OPENBSD = @OS_OPENBSD@
|
||||
@@ -348,6 +401,7 @@ psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
subdirs = @subdirs@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
@@ -362,6 +416,7 @@ OPENBSD_USB_SRC = os/openbsd_usb.c
|
||||
NETBSD_USB_SRC = os/netbsd_usb.c
|
||||
WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc libusb-1.0.def
|
||||
WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h
|
||||
DIST_SUBDIRS =
|
||||
EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \
|
||||
$(NETBSD_USB_SRC) $(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \
|
||||
$(POSIX_POLL_SRC) \
|
||||
@@ -369,6 +424,7 @@ EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \
|
||||
os/linux_udev.c os/linux_netlink.c
|
||||
|
||||
@OS_DARWIN_TRUE@OS_SRC = $(DARWIN_USB_SRC) $(POSIX_POLL_SRC)
|
||||
@OS_HAIKU_TRUE@OS_SRC = $(POSIX_POLL_SRC)
|
||||
@OS_LINUX_TRUE@@USE_UDEV_FALSE@OS_SRC = $(LINUX_USBFS_SRC) $(POSIX_POLL_SRC) \
|
||||
@OS_LINUX_TRUE@@USE_UDEV_FALSE@ os/linux_netlink.c
|
||||
|
||||
@@ -379,6 +435,7 @@ EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \
|
||||
@OS_OPENBSD_TRUE@OS_SRC = $(OPENBSD_USB_SRC) $(POSIX_POLL_SRC)
|
||||
@OS_WINDOWS_TRUE@OS_SRC = $(WINDOWS_USB_SRC)
|
||||
@OS_DARWIN_TRUE@AM_CFLAGS_EXT = -no-cpp-precomp
|
||||
@OS_HAIKU_TRUE@SUBDIRS = os/haiku
|
||||
@THREADS_POSIX_FALSE@THREADS_SRC = os/threads_windows.h os/threads_windows.c
|
||||
@THREADS_POSIX_TRUE@THREADS_SRC = os/threads_posix.h os/threads_posix.c
|
||||
libusb_1_0_la_CFLAGS = $(AM_CFLAGS)
|
||||
@@ -388,9 +445,10 @@ libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c strerror.c sync.c \
|
||||
hotplug.h hotplug.c $(THREADS_SRC) $(OS_SRC) \
|
||||
os/poll_posix.h os/poll_windows.h
|
||||
|
||||
@OS_HAIKU_TRUE@libusb_1_0_la_LIBADD = os/haiku/libhaikuusb.la
|
||||
hdrdir = $(includedir)/libusb-1.0
|
||||
hdr_HEADERS = libusb.h
|
||||
all: all-am
|
||||
all: all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj .rc
|
||||
@@ -406,7 +464,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libusb/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu libusb/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
@@ -688,14 +745,61 @@ uninstall-hdrHEADERS:
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(hdrdir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run 'make' without going through this Makefile.
|
||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||
$(am__recursive_targets):
|
||||
@fail=; \
|
||||
if $(am__make_keepgoing); then \
|
||||
failcom='fail=yes'; \
|
||||
else \
|
||||
failcom='exit 1'; \
|
||||
fi; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| eval $$failcom; \
|
||||
done; \
|
||||
if test "$$dot_seen" = "no"; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
tags: tags-recursive
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||
include_option=--etags-include; \
|
||||
empty_fix=.; \
|
||||
else \
|
||||
include_option=--include; \
|
||||
empty_fix=; \
|
||||
fi; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test ! -f $$subdir/TAGS || \
|
||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
@@ -708,7 +812,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-am
|
||||
ctags: ctags-recursive
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
@@ -721,7 +825,7 @@ GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-am
|
||||
cscopelist: cscopelist-recursive
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
@@ -770,22 +874,51 @@ distdir: $(DISTFILES)
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
$(am__make_dryrun) \
|
||||
|| test -d "$(distdir)/$$subdir" \
|
||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||
|| exit 1; \
|
||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||
$(am__relativize); \
|
||||
new_distdir=$$reldir; \
|
||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
||||
$(am__relativize); \
|
||||
new_top_distdir=$$reldir; \
|
||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
||||
($(am__cd) $$subdir && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$$new_top_distdir" \
|
||||
distdir="$$new_distdir" \
|
||||
am__remove_distdir=: \
|
||||
am__skip_length_check=: \
|
||||
am__skip_mode_fix=: \
|
||||
distdir) \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
||||
dist-hook
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
check: check-recursive
|
||||
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
|
||||
installdirs:
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hdrdir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
install: install-recursive
|
||||
install-exec: install-exec-recursive
|
||||
install-data: install-data-recursive
|
||||
uninstall: uninstall-recursive
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
installcheck: installcheck-recursive
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
@@ -809,97 +942,103 @@ distclean-generic:
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
clean: clean-recursive
|
||||
|
||||
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
distclean: distclean-recursive
|
||||
-rm -rf ./$(DEPDIR) os/$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
dvi: dvi-recursive
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
html: html-recursive
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
info: info-recursive
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-hdrHEADERS
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
install-dvi: install-dvi-recursive
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am: install-libLTLIBRARIES
|
||||
|
||||
install-html: install-html-am
|
||||
install-html: install-html-recursive
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
install-info: install-info-recursive
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
install-pdf: install-pdf-recursive
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
install-ps: install-ps-recursive
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
maintainer-clean: maintainer-clean-recursive
|
||||
-rm -rf ./$(DEPDIR) os/$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
mostlyclean: mostlyclean-recursive
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
pdf: pdf-recursive
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
ps: ps-recursive
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-hdrHEADERS uninstall-libLTLIBRARIES
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
.MAKE: $(am__recursive_targets) install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||
clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
|
||||
ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-hdrHEADERS install-html \
|
||||
install-html-am install-info install-info-am \
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
|
||||
check-am clean clean-generic clean-libLTLIBRARIES \
|
||||
clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \
|
||||
distclean-compile distclean-generic distclean-libtool \
|
||||
distclean-tags distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-hdrHEADERS \
|
||||
install-html install-html-am install-info install-info-am \
|
||||
install-libLTLIBRARIES install-man install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
installcheck-am installdirs installdirs-am maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags tags-am uninstall uninstall-am uninstall-hdrHEADERS \
|
||||
uninstall-libLTLIBRARIES
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
all: libusb-1.0.la libusb-1.0.dll
|
||||
|
||||
dist-hook:
|
||||
cp -r os/haiku $(distdir)/os/haiku
|
||||
rm -rf $(distdir)/os/haiku/autom4te.cache
|
||||
|
||||
@OS_WINDOWS_TRUE@.rc.lo:
|
||||
@OS_WINDOWS_TRUE@ $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@
|
||||
|
||||
|
||||
Vendored
+218
-100
@@ -56,6 +56,8 @@ const struct usbi_os_backend * const usbi_backend = &netbsd_backend;
|
||||
const struct usbi_os_backend * const usbi_backend = &windows_backend;
|
||||
#elif defined(OS_WINCE)
|
||||
const struct usbi_os_backend * const usbi_backend = &wince_backend;
|
||||
#elif defined(OS_HAIKU)
|
||||
const struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend;
|
||||
#else
|
||||
#error "Unsupported OS"
|
||||
#endif
|
||||
@@ -92,6 +94,10 @@ struct list_head active_contexts_list;
|
||||
* Specification</a> which is available for free download. You can probably
|
||||
* find less verbose introductions by searching the web.
|
||||
*
|
||||
* \section API Application Programming Interface (API)
|
||||
*
|
||||
* See the \ref api page for a complete list of the libusb functions.
|
||||
*
|
||||
* \section features Library features
|
||||
*
|
||||
* - All transfer types supported (control/bulk/interrupt/isochronous)
|
||||
@@ -217,9 +223,6 @@ struct list_head active_contexts_list;
|
||||
* -# If the device is already in the desired configuration, calling
|
||||
* libusb_set_configuration() using the same configuration value will cause
|
||||
* a lightweight device reset. This may not be desirable behaviour.
|
||||
* -# libusb will be unable to change configuration if the device is in
|
||||
* another configuration and other programs or drivers have claimed
|
||||
* interfaces under that configuration.
|
||||
* -# In the case where the desired configuration is already active, libusb
|
||||
* may not even be able to perform a lightweight device reset. For example,
|
||||
* take my USB keyboard with fingerprint reader: I'm interested in driving
|
||||
@@ -228,12 +231,17 @@ struct list_head active_contexts_list;
|
||||
* Because the kernel has claimed an interface, it is not even possible to
|
||||
* perform the lightweight device reset, so libusb_set_configuration() will
|
||||
* fail. (Luckily the device in question only has a single configuration.)
|
||||
* -# libusb will be unable to set a configuration if other programs or
|
||||
* drivers have claimed interfaces. In particular, this means that kernel
|
||||
* drivers must be detached from all the interfaces before
|
||||
* libusb_set_configuration() may succeed.
|
||||
*
|
||||
* One solution to some of the above problems is to consider the currently
|
||||
* active configuration. If the configuration we want is already active, then
|
||||
* we don't have to select any configuration:
|
||||
\code
|
||||
cfg = libusb_get_configuration(dev);
|
||||
cfg = -1;
|
||||
libusb_get_configuration(dev, &cfg);
|
||||
if (cfg != desired)
|
||||
libusb_set_configuration(dev, desired);
|
||||
\endcode
|
||||
@@ -323,6 +331,151 @@ if (cfg != desired)
|
||||
* can infer the context from those objects.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \page api Application Programming Interface
|
||||
*
|
||||
* This is the complete list of libusb functions, structures and
|
||||
* enumerations in alphabetical order.
|
||||
*
|
||||
* \section Functions
|
||||
* - libusb_alloc_streams()
|
||||
* - libusb_alloc_transfer()
|
||||
* - libusb_attach_kernel_driver()
|
||||
* - libusb_bulk_transfer()
|
||||
* - libusb_cancel_transfer()
|
||||
* - libusb_claim_interface()
|
||||
* - libusb_clear_halt()
|
||||
* - libusb_close()
|
||||
* - libusb_control_transfer()
|
||||
* - libusb_control_transfer_get_data()
|
||||
* - libusb_control_transfer_get_setup()
|
||||
* - libusb_cpu_to_le16()
|
||||
* - libusb_detach_kernel_driver()
|
||||
* - libusb_error_name()
|
||||
* - libusb_event_handler_active()
|
||||
* - libusb_event_handling_ok()
|
||||
* - libusb_exit()
|
||||
* - libusb_fill_bulk_stream_transfer()
|
||||
* - libusb_fill_bulk_transfer()
|
||||
* - libusb_fill_control_setup()
|
||||
* - libusb_fill_control_transfer()
|
||||
* - libusb_fill_interrupt_transfer()
|
||||
* - libusb_fill_iso_transfer()
|
||||
* - libusb_free_bos_descriptor()
|
||||
* - libusb_free_config_descriptor()
|
||||
* - libusb_free_container_id_descriptor()
|
||||
* - libusb_free_device_list()
|
||||
* - libusb_free_ss_endpoint_companion_descriptor()
|
||||
* - libusb_free_ss_usb_device_capability_descriptor()
|
||||
* - libusb_free_streams()
|
||||
* - libusb_free_transfer()
|
||||
* - libusb_free_usb_2_0_extension_descriptor()
|
||||
* - libusb_get_active_config_descriptor()
|
||||
* - libusb_get_bos_descriptor()
|
||||
* - libusb_get_bus_number()
|
||||
* - libusb_get_config_descriptor()
|
||||
* - libusb_get_config_descriptor_by_value()
|
||||
* - libusb_get_configuration()
|
||||
* - libusb_get_container_id_descriptor()
|
||||
* - libusb_get_descriptor()
|
||||
* - libusb_get_device()
|
||||
* - libusb_get_device_address()
|
||||
* - libusb_get_device_descriptor()
|
||||
* - libusb_get_device_list()
|
||||
* - libusb_get_device_speed()
|
||||
* - libusb_get_iso_packet_buffer()
|
||||
* - libusb_get_iso_packet_buffer_simple()
|
||||
* - libusb_get_max_iso_packet_size()
|
||||
* - libusb_get_max_packet_size()
|
||||
* - libusb_get_next_timeout()
|
||||
* - libusb_get_parent()
|
||||
* - libusb_get_port_number()
|
||||
* - libusb_get_port_numbers()
|
||||
* - libusb_get_ss_endpoint_companion_descriptor()
|
||||
* - libusb_get_ss_usb_device_capability_descriptor()
|
||||
* - libusb_get_string_descriptor()
|
||||
* - libusb_get_string_descriptor_ascii()
|
||||
* - libusb_get_usb_2_0_extension_descriptor()
|
||||
* - libusb_get_version()
|
||||
* - libusb_handle_events()
|
||||
* - libusb_handle_events_completed()
|
||||
* - libusb_handle_events_locked()
|
||||
* - libusb_handle_events_timeout()
|
||||
* - libusb_handle_events_timeout_completed()
|
||||
* - libusb_has_capability()
|
||||
* - libusb_hotplug_deregister_callback()
|
||||
* - libusb_hotplug_register_callback()
|
||||
* - libusb_init()
|
||||
* - libusb_interrupt_transfer()
|
||||
* - libusb_kernel_driver_active()
|
||||
* - libusb_lock_events()
|
||||
* - libusb_lock_event_waiters()
|
||||
* - libusb_open()
|
||||
* - libusb_open_device_with_vid_pid()
|
||||
* - libusb_pollfds_handle_timeouts()
|
||||
* - libusb_ref_device()
|
||||
* - libusb_release_interface()
|
||||
* - libusb_reset_device()
|
||||
* - libusb_set_auto_detach_kernel_driver()
|
||||
* - libusb_set_configuration()
|
||||
* - libusb_set_debug()
|
||||
* - libusb_set_interface_alt_setting()
|
||||
* - libusb_set_iso_packet_lengths()
|
||||
* - libusb_setlocale()
|
||||
* - libusb_set_pollfd_notifiers()
|
||||
* - libusb_strerror()
|
||||
* - libusb_submit_transfer()
|
||||
* - libusb_transfer_get_stream_id()
|
||||
* - libusb_transfer_set_stream_id()
|
||||
* - libusb_try_lock_events()
|
||||
* - libusb_unlock_events()
|
||||
* - libusb_unlock_event_waiters()
|
||||
* - libusb_unref_device()
|
||||
* - libusb_wait_for_event()
|
||||
*
|
||||
* \section Structures
|
||||
* - libusb_bos_descriptor
|
||||
* - libusb_bos_dev_capability_descriptor
|
||||
* - libusb_config_descriptor
|
||||
* - libusb_container_id_descriptor
|
||||
* - \ref libusb_context
|
||||
* - libusb_control_setup
|
||||
* - \ref libusb_device
|
||||
* - libusb_device_descriptor
|
||||
* - \ref libusb_device_handle
|
||||
* - libusb_endpoint_descriptor
|
||||
* - libusb_interface
|
||||
* - libusb_interface_descriptor
|
||||
* - libusb_iso_packet_descriptor
|
||||
* - libusb_pollfd
|
||||
* - libusb_ss_endpoint_companion_descriptor
|
||||
* - libusb_ss_usb_device_capability_descriptor
|
||||
* - libusb_transfer
|
||||
* - libusb_usb_2_0_extension_descriptor
|
||||
* - libusb_version
|
||||
*
|
||||
* \section Enums
|
||||
* - \ref libusb_bos_type
|
||||
* - \ref libusb_capability
|
||||
* - \ref libusb_class_code
|
||||
* - \ref libusb_descriptor_type
|
||||
* - \ref libusb_endpoint_direction
|
||||
* - \ref libusb_error
|
||||
* - \ref libusb_iso_sync_type
|
||||
* - \ref libusb_iso_usage_type
|
||||
* - \ref libusb_log_level
|
||||
* - \ref libusb_request_recipient
|
||||
* - \ref libusb_request_type
|
||||
* - \ref libusb_speed
|
||||
* - \ref libusb_ss_usb_device_capability_attributes
|
||||
* - \ref libusb_standard_request
|
||||
* - \ref libusb_supported_speed
|
||||
* - \ref libusb_transfer_flags
|
||||
* - \ref libusb_transfer_status
|
||||
* - \ref libusb_transfer_type
|
||||
* - \ref libusb_usb_2_0_extension_attributes
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup lib Library initialization/deinitialization
|
||||
* This page details how to initialize and deinitialize libusb. Initialization
|
||||
@@ -533,12 +686,8 @@ struct libusb_device *usbi_alloc_device(struct libusb_context *ctx,
|
||||
|
||||
void usbi_connect_device(struct libusb_device *dev)
|
||||
{
|
||||
libusb_hotplug_message message;
|
||||
ssize_t ret;
|
||||
struct libusb_context *ctx = DEVICE_CTX(dev);
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.event = LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED;
|
||||
message.device = dev;
|
||||
dev->attached = 1;
|
||||
|
||||
usbi_mutex_lock(&dev->ctx->usb_devs_lock);
|
||||
@@ -546,25 +695,17 @@ void usbi_connect_device(struct libusb_device *dev)
|
||||
usbi_mutex_unlock(&dev->ctx->usb_devs_lock);
|
||||
|
||||
/* Signal that an event has occurred for this device if we support hotplug AND
|
||||
* the hotplug pipe is ready. This prevents an event from getting raised during
|
||||
* initial enumeration. */
|
||||
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_pipe[1] > 0) {
|
||||
ret = usbi_write(dev->ctx->hotplug_pipe[1], &message, sizeof(message));
|
||||
if (sizeof (message) != ret) {
|
||||
usbi_err(DEVICE_CTX(dev), "error writing hotplug message");
|
||||
}
|
||||
* the hotplug message list is ready. This prevents an event from getting raised
|
||||
* during initial enumeration. */
|
||||
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) {
|
||||
usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED);
|
||||
}
|
||||
}
|
||||
|
||||
void usbi_disconnect_device(struct libusb_device *dev)
|
||||
{
|
||||
libusb_hotplug_message message;
|
||||
struct libusb_context *ctx = dev->ctx;
|
||||
ssize_t ret;
|
||||
struct libusb_context *ctx = DEVICE_CTX(dev);
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.event = LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT;
|
||||
message.device = dev;
|
||||
usbi_mutex_lock(&dev->lock);
|
||||
dev->attached = 0;
|
||||
usbi_mutex_unlock(&dev->lock);
|
||||
@@ -574,14 +715,11 @@ void usbi_disconnect_device(struct libusb_device *dev)
|
||||
usbi_mutex_unlock(&ctx->usb_devs_lock);
|
||||
|
||||
/* Signal that an event has occurred for this device if we support hotplug AND
|
||||
* the hotplug pipe is ready. This prevents an event from getting raised during
|
||||
* initial enumeration. libusb_handle_events will take care of dereferencing the
|
||||
* device. */
|
||||
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_pipe[1] > 0) {
|
||||
ret = usbi_write(dev->ctx->hotplug_pipe[1], &message, sizeof(message));
|
||||
if (sizeof(message) != ret) {
|
||||
usbi_err(DEVICE_CTX(dev), "error writing hotplug message");
|
||||
}
|
||||
* the hotplug message list is ready. This prevents an event from getting raised
|
||||
* during initial enumeration. libusb_handle_events will take care of dereferencing
|
||||
* the device. */
|
||||
if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) {
|
||||
usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1021,47 +1159,41 @@ void API_EXPORTED libusb_unref_device(libusb_device *dev)
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt the iteration of the event handling thread, so that it picks
|
||||
* up the new fd.
|
||||
* Signal the event pipe so that the event handling thread will be
|
||||
* interrupted to process an internal event.
|
||||
*/
|
||||
void usbi_fd_notification(struct libusb_context *ctx)
|
||||
int usbi_signal_event(struct libusb_context *ctx)
|
||||
{
|
||||
unsigned char dummy = 1;
|
||||
ssize_t r;
|
||||
|
||||
if (ctx == NULL)
|
||||
return;
|
||||
|
||||
/* record that we are messing with poll fds */
|
||||
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
||||
ctx->pollfd_modify++;
|
||||
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
||||
|
||||
/* write some data on control pipe to interrupt event handlers */
|
||||
r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
|
||||
if (r <= 0) {
|
||||
/* write some data on event pipe to interrupt event handlers */
|
||||
r = usbi_write(ctx->event_pipe[1], &dummy, sizeof(dummy));
|
||||
if (r != sizeof(dummy)) {
|
||||
usbi_warn(ctx, "internal signalling write failed");
|
||||
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
||||
ctx->pollfd_modify--;
|
||||
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
||||
return;
|
||||
return LIBUSB_ERROR_IO;
|
||||
}
|
||||
|
||||
/* take event handling lock */
|
||||
libusb_lock_events(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* read the dummy data */
|
||||
r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy));
|
||||
if (r <= 0)
|
||||
/*
|
||||
* Clear the event pipe so that the event handling will no longer be
|
||||
* interrupted.
|
||||
*/
|
||||
int usbi_clear_event(struct libusb_context *ctx)
|
||||
{
|
||||
unsigned char dummy;
|
||||
ssize_t r;
|
||||
|
||||
/* read some data on event pipe to clear it */
|
||||
r = usbi_read(ctx->event_pipe[0], &dummy, sizeof(dummy));
|
||||
if (r != sizeof(dummy)) {
|
||||
usbi_warn(ctx, "internal signalling read failed");
|
||||
return LIBUSB_ERROR_IO;
|
||||
}
|
||||
|
||||
/* we're done with modifying poll fds */
|
||||
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
||||
ctx->pollfd_modify--;
|
||||
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
||||
|
||||
/* Release event handling lock and wake up event waiters */
|
||||
libusb_unlock_events(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \ingroup dev
|
||||
@@ -1125,14 +1257,6 @@ int API_EXPORTED libusb_open(libusb_device *dev,
|
||||
usbi_mutex_unlock(&ctx->open_devs_lock);
|
||||
*handle = _handle;
|
||||
|
||||
/* At this point, we want to interrupt any existing event handlers so
|
||||
* that they realise the addition of the new device's poll fd. One
|
||||
* example when this is desirable is if the user is running a separate
|
||||
* dedicated libusb events handling thread, which is running with a long
|
||||
* or infinite timeout. We want to interrupt that iteration of the loop,
|
||||
* so that it picks up the new fd, and then continues. */
|
||||
usbi_fd_notification(ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1260,8 +1384,7 @@ static void do_close(struct libusb_context *ctx,
|
||||
void API_EXPORTED libusb_close(libusb_device_handle *dev_handle)
|
||||
{
|
||||
struct libusb_context *ctx;
|
||||
unsigned char dummy = 1;
|
||||
ssize_t r;
|
||||
int pending_events;
|
||||
|
||||
if (!dev_handle)
|
||||
return;
|
||||
@@ -1275,37 +1398,29 @@ void API_EXPORTED libusb_close(libusb_device_handle *dev_handle)
|
||||
* thread from doing event handling) because we will be removing a file
|
||||
* descriptor from the polling loop. */
|
||||
|
||||
/* record that we are messing with poll fds */
|
||||
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
||||
ctx->pollfd_modify++;
|
||||
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
||||
|
||||
/* write some data on control pipe to interrupt event handlers */
|
||||
r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
|
||||
if (r <= 0) {
|
||||
usbi_warn(ctx, "internal signalling write failed, closing anyway");
|
||||
do_close(ctx, dev_handle);
|
||||
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
||||
ctx->pollfd_modify--;
|
||||
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
||||
return;
|
||||
}
|
||||
/* Record that we are closing a device.
|
||||
* Only signal an event if there are no prior pending events. */
|
||||
usbi_mutex_lock(&ctx->event_data_lock);
|
||||
pending_events = usbi_pending_events(ctx);
|
||||
ctx->device_close++;
|
||||
if (!pending_events)
|
||||
usbi_signal_event(ctx);
|
||||
usbi_mutex_unlock(&ctx->event_data_lock);
|
||||
|
||||
/* take event handling lock */
|
||||
libusb_lock_events(ctx);
|
||||
|
||||
/* read the dummy data */
|
||||
r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy));
|
||||
if (r <= 0)
|
||||
usbi_warn(ctx, "internal signalling read failed, closing anyway");
|
||||
|
||||
/* Close the device */
|
||||
do_close(ctx, dev_handle);
|
||||
|
||||
/* we're done with modifying poll fds */
|
||||
usbi_mutex_lock(&ctx->pollfd_modify_lock);
|
||||
ctx->pollfd_modify--;
|
||||
usbi_mutex_unlock(&ctx->pollfd_modify_lock);
|
||||
/* We're done with closing this device.
|
||||
* Clear the event pipe if there are no further pending events. */
|
||||
usbi_mutex_lock(&ctx->event_data_lock);
|
||||
ctx->device_close--;
|
||||
pending_events = usbi_pending_events(ctx);
|
||||
if (!pending_events)
|
||||
usbi_clear_event(ctx);
|
||||
usbi_mutex_unlock(&ctx->event_data_lock);
|
||||
|
||||
/* Release event handling lock and wake up event waiters */
|
||||
libusb_unlock_events(ctx);
|
||||
@@ -1413,7 +1528,8 @@ int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev,
|
||||
*
|
||||
* \param dev a device handle
|
||||
* \param configuration the bConfigurationValue of the configuration you
|
||||
* wish to activate, or -1 if you wish to put the device in unconfigured state
|
||||
* wish to activate, or -1 if you wish to put the device in an unconfigured
|
||||
* state
|
||||
* \returns 0 on success
|
||||
* \returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist
|
||||
* \returns LIBUSB_ERROR_BUSY if interfaces are currently claimed
|
||||
@@ -1907,8 +2023,8 @@ int API_EXPORTED libusb_init(libusb_context **context)
|
||||
usbi_dbg("created default context");
|
||||
}
|
||||
|
||||
usbi_dbg("libusb v%d.%d.%d.%d", libusb_version_internal.major, libusb_version_internal.minor,
|
||||
libusb_version_internal.micro, libusb_version_internal.nano);
|
||||
usbi_dbg("libusb v%u.%u.%u.%u%s", libusb_version_internal.major, libusb_version_internal.minor,
|
||||
libusb_version_internal.micro, libusb_version_internal.nano, libusb_version_internal.rc);
|
||||
|
||||
usbi_mutex_init(&ctx->usb_devs_lock, NULL);
|
||||
usbi_mutex_init(&ctx->open_devs_lock, NULL);
|
||||
@@ -1946,8 +2062,10 @@ err_backend_exit:
|
||||
if (usbi_backend->exit)
|
||||
usbi_backend->exit();
|
||||
err_free_ctx:
|
||||
if (ctx == usbi_default_context)
|
||||
if (ctx == usbi_default_context) {
|
||||
usbi_default_context = NULL;
|
||||
default_context_refcnt--;
|
||||
}
|
||||
|
||||
usbi_mutex_static_lock(&active_contexts_lock);
|
||||
list_del (&ctx->list);
|
||||
@@ -2191,8 +2309,8 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,
|
||||
usbi_gettimeofday(&now, NULL);
|
||||
if ((global_debug) && (!has_debug_header_been_displayed)) {
|
||||
has_debug_header_been_displayed = 1;
|
||||
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] <message>\n");
|
||||
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------\n");
|
||||
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] <message>" USBI_LOG_LINE_END);
|
||||
usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------" USBI_LOG_LINE_END);
|
||||
}
|
||||
if (now.tv_usec < timestamp_origin.tv_usec) {
|
||||
now.tv_sec--;
|
||||
|
||||
Vendored
+3
-1
@@ -19,6 +19,8 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@@ -453,7 +455,7 @@ static int parse_configuration(struct libusb_context *ctx,
|
||||
(header.bDescriptorType == LIBUSB_DT_DEVICE))
|
||||
break;
|
||||
|
||||
usbi_dbg("skipping descriptor 0x%x\n", header.bDescriptorType);
|
||||
usbi_dbg("skipping descriptor 0x%x", header.bDescriptorType);
|
||||
buffer += header.bLength;
|
||||
size -= header.bLength;
|
||||
}
|
||||
|
||||
Vendored
+26
-9
@@ -43,7 +43,7 @@
|
||||
*
|
||||
* \page hotplug Device hotplug event notification
|
||||
*
|
||||
* \section intro Introduction
|
||||
* \section hotplug_intro Introduction
|
||||
*
|
||||
* Version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, has added support
|
||||
* for hotplug events on <b>some</b> platforms (you should test if your platform
|
||||
@@ -203,6 +203,30 @@ void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
/* the backend is expected to call the callback for each active transfer */
|
||||
}
|
||||
|
||||
void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
libusb_hotplug_event event)
|
||||
{
|
||||
int pending_events;
|
||||
libusb_hotplug_message *message = calloc(1, sizeof(*message));
|
||||
|
||||
if (!message) {
|
||||
usbi_err(ctx, "error allocating hotplug message");
|
||||
return;
|
||||
}
|
||||
|
||||
message->event = event;
|
||||
message->device = dev;
|
||||
|
||||
/* Take the event data lock and add this message to the list.
|
||||
* Only signal an event if there are no prior pending events. */
|
||||
usbi_mutex_lock(&ctx->event_data_lock);
|
||||
pending_events = usbi_pending_events(ctx);
|
||||
list_add_tail(&message->list, &ctx->hotplug_msgs);
|
||||
if (!pending_events)
|
||||
usbi_signal_event(ctx);
|
||||
usbi_mutex_unlock(&ctx->event_data_lock);
|
||||
}
|
||||
|
||||
int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx,
|
||||
libusb_hotplug_event events, libusb_hotplug_flag flags,
|
||||
int vendor_id, int product_id, int dev_class,
|
||||
@@ -285,8 +309,6 @@ void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx
|
||||
libusb_hotplug_callback_handle handle)
|
||||
{
|
||||
struct libusb_hotplug_callback *hotplug_cb;
|
||||
libusb_hotplug_message message;
|
||||
ssize_t ret;
|
||||
|
||||
/* check for hotplug support */
|
||||
if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
|
||||
@@ -305,12 +327,7 @@ void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx
|
||||
}
|
||||
usbi_mutex_unlock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
/* wakeup handle_events to do the actual free */
|
||||
memset(&message, 0, sizeof(message));
|
||||
ret = usbi_write(ctx->hotplug_pipe[1], &message, sizeof(message));
|
||||
if (sizeof(message) != ret) {
|
||||
usbi_err(ctx, "error writing hotplug message");
|
||||
}
|
||||
usbi_hotplug_notification(ctx, NULL, 0);
|
||||
}
|
||||
|
||||
void usbi_hotplug_deregister_all(struct libusb_context *ctx) {
|
||||
|
||||
Vendored
+8
@@ -69,8 +69,14 @@ struct libusb_hotplug_callback {
|
||||
typedef struct libusb_hotplug_callback libusb_hotplug_callback;
|
||||
|
||||
struct libusb_hotplug_message {
|
||||
/** The hotplug event that occurred */
|
||||
libusb_hotplug_event event;
|
||||
|
||||
/** The device for which this hotplug event occurred */
|
||||
struct libusb_device *device;
|
||||
|
||||
/** List this message is contained in (ctx->hotplug_msgs) */
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
typedef struct libusb_hotplug_message libusb_hotplug_message;
|
||||
@@ -78,5 +84,7 @@ typedef struct libusb_hotplug_message libusb_hotplug_message;
|
||||
void usbi_hotplug_deregister_all(struct libusb_context *ctx);
|
||||
void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
libusb_hotplug_event event);
|
||||
void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
libusb_hotplug_event event);
|
||||
|
||||
#endif
|
||||
|
||||
Vendored
+495
-353
File diff suppressed because it is too large
Load Diff
+2
@@ -80,6 +80,8 @@ EXPORTS
|
||||
libusb_get_parent@4 = libusb_get_parent
|
||||
libusb_get_pollfds
|
||||
libusb_get_pollfds@4 = libusb_get_pollfds
|
||||
libusb_free_pollfds
|
||||
libusb_free_pollfds@4 = libusb_free_pollfds
|
||||
libusb_get_port_number
|
||||
libusb_get_port_number@4 = libusb_get_port_number
|
||||
libusb_get_port_numbers
|
||||
|
||||
Vendored
+11
-10
@@ -54,7 +54,7 @@ typedef unsigned __int32 uint32_t;
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__)
|
||||
#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__)
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
@@ -90,7 +90,7 @@ typedef unsigned __int32 uint32_t;
|
||||
* Under Windows, the selection of available compilers and configurations
|
||||
* means that, unlike other platforms, there is not <em>one true calling
|
||||
* convention</em> (calling convention: the manner in which parameters are
|
||||
* passed to funcions in the generated assembly code).
|
||||
* passed to functions in the generated assembly code).
|
||||
*
|
||||
* Matching the Windows API itself, libusb uses the WINAPI convention (which
|
||||
* translates to the <tt>stdcall</tt> convention) and guarantees that the
|
||||
@@ -138,13 +138,10 @@ typedef unsigned __int32 uint32_t;
|
||||
* #endif
|
||||
* \endcode
|
||||
*
|
||||
* Another feature of LIBUSB_API_VERSION is that it can be used to detect
|
||||
* whether you are compiling against the libusb or the libusb library.
|
||||
*
|
||||
* Internally, LIBUSB_API_VERSION is defined as follows:
|
||||
* (libusb major << 24) | (libusb minor << 16) | (16 bit incremental)
|
||||
*/
|
||||
#define LIBUSB_API_VERSION 0x01000103
|
||||
#define LIBUSB_API_VERSION 0x01000104
|
||||
|
||||
/* The following is kept for compatibility, but will be deprecated in the future */
|
||||
#define LIBUSBX_API_VERSION LIBUSB_API_VERSION
|
||||
@@ -668,8 +665,9 @@ struct libusb_config_descriptor {
|
||||
uint8_t bmAttributes;
|
||||
|
||||
/** Maximum power consumption of the USB device from this bus in this
|
||||
* configuration when the device is fully opreation. Expressed in units
|
||||
* of 2 mA. */
|
||||
* configuration when the device is fully operation. Expressed in units
|
||||
* of 2 mA when the device is operating in high-speed mode and in units
|
||||
* of 8 mA when the device is operating in super-speed mode. */
|
||||
uint8_t MaxPower;
|
||||
|
||||
/** Array of interfaces supported by this configuration. The length of
|
||||
@@ -900,7 +898,6 @@ struct libusb_control_setup {
|
||||
struct libusb_context;
|
||||
struct libusb_device;
|
||||
struct libusb_device_handle;
|
||||
struct libusb_hotplug_callback;
|
||||
|
||||
/** \ingroup lib
|
||||
* Structure providing the version of the libusb runtime
|
||||
@@ -1860,6 +1857,7 @@ typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data);
|
||||
|
||||
const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds(
|
||||
libusb_context *ctx);
|
||||
void LIBUSB_CALL libusb_free_pollfds(const struct libusb_pollfd **pollfds);
|
||||
void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx,
|
||||
libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,
|
||||
void *user_data);
|
||||
@@ -1884,8 +1882,11 @@ typedef int libusb_hotplug_callback_handle;
|
||||
*
|
||||
* Flags for hotplug events */
|
||||
typedef enum {
|
||||
/** Default value when not using any flags. */
|
||||
LIBUSB_HOTPLUG_NO_FLAGS = 0,
|
||||
|
||||
/** Arm the callback and fire it for all matching currently attached devices. */
|
||||
LIBUSB_HOTPLUG_ENUMERATE = 1,
|
||||
LIBUSB_HOTPLUG_ENUMERATE = 1<<0,
|
||||
} libusb_hotplug_flag;
|
||||
|
||||
/** \ingroup hotplug
|
||||
|
||||
Vendored
+106
-29
@@ -21,7 +21,7 @@
|
||||
#ifndef LIBUSBI_H
|
||||
#define LIBUSBI_H
|
||||
|
||||
#include "config.h"
|
||||
#include <config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -32,10 +32,10 @@
|
||||
#ifdef HAVE_POLL_H
|
||||
#include <poll.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MISSING_H
|
||||
#include "missing.h"
|
||||
#include <missing.h>
|
||||
#endif
|
||||
|
||||
#include "libusb.h"
|
||||
#include "version.h"
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
*/
|
||||
#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define DEVICE_DESC_LENGTH 18
|
||||
|
||||
#define USB_MAXENDPOINTS 32
|
||||
@@ -82,6 +86,9 @@ struct list_head {
|
||||
#define list_entry(ptr, type, member) \
|
||||
((type *)((uintptr_t)(ptr) - (uintptr_t)offsetof(type, member)))
|
||||
|
||||
#define list_first_entry(ptr, type, member) \
|
||||
list_entry((ptr)->next, type, member)
|
||||
|
||||
/* Get each entry from a list
|
||||
* pos - A structure pointer has a "member" element
|
||||
* head - list head
|
||||
@@ -144,8 +151,12 @@ static inline void *usbi_reallocf(void *ptr, size_t size)
|
||||
const typeof( ((type *)0)->member ) *mptr = (ptr); \
|
||||
(type *)( (char *)mptr - offsetof(type,member) );})
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef MAX
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0)
|
||||
|
||||
@@ -228,13 +239,15 @@ static inline void usbi_dbg(const char *format, ...)
|
||||
|
||||
extern struct libusb_context *usbi_default_context;
|
||||
|
||||
/* Forward declaration for use in context (fully defined inside poll abstraction) */
|
||||
struct pollfd;
|
||||
|
||||
struct libusb_context {
|
||||
int debug;
|
||||
int debug_fixed;
|
||||
|
||||
/* internal control pipe, used for interrupting event handling when
|
||||
* something needs to modify poll fds. */
|
||||
int ctrl_pipe[2];
|
||||
/* internal event pipe, used for signalling occurrence of an internal event. */
|
||||
int event_pipe[2];
|
||||
|
||||
struct list_head usb_devs;
|
||||
usbi_mutex_t usb_devs_lock;
|
||||
@@ -247,7 +260,6 @@ struct libusb_context {
|
||||
/* A list of registered hotplug callbacks */
|
||||
struct list_head hotplug_cbs;
|
||||
usbi_mutex_t hotplug_cbs_lock;
|
||||
int hotplug_pipe[2];
|
||||
|
||||
/* this is a list of in-flight transfer handles, sorted by timeout
|
||||
* expiration. URBs to timeout the soonest are placed at the beginning of
|
||||
@@ -256,15 +268,6 @@ struct libusb_context {
|
||||
struct list_head flying_transfers;
|
||||
usbi_mutex_t flying_transfers_lock;
|
||||
|
||||
/* list of poll fds */
|
||||
struct list_head pollfds;
|
||||
usbi_mutex_t pollfds_lock;
|
||||
|
||||
/* a counter that is set when we want to interrupt event handling, in order
|
||||
* to modify the poll fd set. and a lock to protect it. */
|
||||
unsigned int pollfd_modify;
|
||||
usbi_mutex_t pollfd_modify_lock;
|
||||
|
||||
/* user callbacks for pollfd changes */
|
||||
libusb_pollfd_added_cb fd_added_cb;
|
||||
libusb_pollfd_removed_cb fd_removed_cb;
|
||||
@@ -281,6 +284,28 @@ struct libusb_context {
|
||||
usbi_mutex_t event_waiters_lock;
|
||||
usbi_cond_t event_waiters_cond;
|
||||
|
||||
/* A lock to protect internal context event data. */
|
||||
usbi_mutex_t event_data_lock;
|
||||
|
||||
/* A counter that is set when we want to interrupt and prevent event handling,
|
||||
* in order to safely close a device. Protected by event_data_lock. */
|
||||
unsigned int device_close;
|
||||
|
||||
/* list and count of poll fds and an array of poll fd structures that is
|
||||
* (re)allocated as necessary prior to polling, and a flag to indicate
|
||||
* when the list of poll fds has changed since the last poll.
|
||||
* Protected by event_data_lock. */
|
||||
struct list_head ipollfds;
|
||||
struct pollfd *pollfds;
|
||||
POLL_NFDS_TYPE pollfds_cnt;
|
||||
unsigned int pollfds_modified;
|
||||
|
||||
/* A list of pending hotplug messages. Protected by event_data_lock. */
|
||||
struct list_head hotplug_msgs;
|
||||
|
||||
/* A list of pending completed transfers. Protected by event_data_lock. */
|
||||
struct list_head completed_transfers;
|
||||
|
||||
#ifdef USBI_TIMERFD_AVAILABLE
|
||||
/* used for timeout handling, if supported by OS.
|
||||
* this timerfd is maintained to trigger on the next pending timeout */
|
||||
@@ -290,6 +315,11 @@ struct libusb_context {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/* Update the following macro if new event sources are added */
|
||||
#define usbi_pending_events(ctx) \
|
||||
((ctx)->device_close || (ctx)->pollfds_modified \
|
||||
|| !list_empty(&(ctx)->hotplug_msgs) || !list_empty(&(ctx)->completed_transfers))
|
||||
|
||||
#ifdef USBI_TIMERFD_AVAILABLE
|
||||
#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0)
|
||||
#else
|
||||
@@ -364,6 +394,7 @@ enum {
|
||||
struct usbi_transfer {
|
||||
int num_iso_packets;
|
||||
struct list_head list;
|
||||
struct list_head completed_list;
|
||||
struct timeval timeout;
|
||||
int transferred;
|
||||
uint32_t stream_id;
|
||||
@@ -377,6 +408,10 @@ struct usbi_transfer {
|
||||
* its completion (presumably there would be races within your OS backend
|
||||
* if this were possible). */
|
||||
usbi_mutex_t lock;
|
||||
|
||||
/* this lock should be held whenever viewing or modifying flags
|
||||
* relating to the transfer state */
|
||||
usbi_mutex_t flags_lock;
|
||||
};
|
||||
|
||||
enum usbi_transfer_flags {
|
||||
@@ -392,8 +427,17 @@ enum usbi_transfer_flags {
|
||||
/* Operation on the transfer failed because the device disappeared */
|
||||
USBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 3,
|
||||
|
||||
/* Set by backend submit_transfer() if the fds in use have been updated */
|
||||
USBI_TRANSFER_UPDATED_FDS = 1 << 4,
|
||||
/* Transfer is currently being submitted */
|
||||
USBI_TRANSFER_SUBMITTING = 1 << 4,
|
||||
|
||||
/* Transfer successfully submitted by backend */
|
||||
USBI_TRANSFER_IN_FLIGHT = 1 << 5,
|
||||
|
||||
/* Completion handler has run */
|
||||
USBI_TRANSFER_COMPLETED = 1 << 6,
|
||||
|
||||
/* The transfer timeout has been handled */
|
||||
USBI_TRANSFER_TIMEOUT_HANDLED = 1 << 7,
|
||||
};
|
||||
|
||||
#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \
|
||||
@@ -434,6 +478,7 @@ void usbi_handle_disconnect(struct libusb_device_handle *handle);
|
||||
int usbi_handle_transfer_completion(struct usbi_transfer *itransfer,
|
||||
enum libusb_transfer_status status);
|
||||
int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer);
|
||||
void usbi_signal_transfer_completion(struct usbi_transfer *transfer);
|
||||
|
||||
int usbi_parse_descriptor(const unsigned char *source, const char *descriptor,
|
||||
void *dest, int host_endian);
|
||||
@@ -444,8 +489,11 @@ int usbi_get_config_index_by_value(struct libusb_device *dev,
|
||||
void usbi_connect_device (struct libusb_device *dev);
|
||||
void usbi_disconnect_device (struct libusb_device *dev);
|
||||
|
||||
int usbi_signal_event(struct libusb_context *ctx);
|
||||
int usbi_clear_event(struct libusb_context *ctx);
|
||||
|
||||
/* Internal abstraction for poll (needs struct usbi_transfer on Windows) */
|
||||
#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD)
|
||||
#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) || defined(OS_HAIKU)
|
||||
#include <unistd.h>
|
||||
#include "os/poll_posix.h"
|
||||
#elif defined(OS_WINDOWS) || defined(OS_WINCE)
|
||||
@@ -474,7 +522,6 @@ struct usbi_pollfd {
|
||||
|
||||
int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events);
|
||||
void usbi_remove_pollfd(struct libusb_context *ctx, int fd);
|
||||
void usbi_fd_notification(struct libusb_context *ctx);
|
||||
|
||||
/* device discovery */
|
||||
|
||||
@@ -765,7 +812,7 @@ struct usbi_os_backend {
|
||||
* This function should not generate any bus I/O and should not block.
|
||||
* Interface claiming is a logical operation that simply ensures that
|
||||
* no other drivers/applications are using the interface, and after
|
||||
* claiming, no other drivers/applicatiosn can use the interface because
|
||||
* claiming, no other drivers/applications can use the interface because
|
||||
* we now "own" it.
|
||||
*
|
||||
* Return:
|
||||
@@ -943,8 +990,14 @@ struct usbi_os_backend {
|
||||
*/
|
||||
void (*clear_transfer_priv)(struct usbi_transfer *itransfer);
|
||||
|
||||
/* Handle any pending events. This involves monitoring any active
|
||||
* transfers and processing their completion or cancellation.
|
||||
/* Handle any pending events on file descriptors. Optional.
|
||||
*
|
||||
* Provide this function when file descriptors directly indicate device
|
||||
* or transfer activity. If your backend does not have such file descriptors,
|
||||
* implement the handle_transfer_completion function below.
|
||||
*
|
||||
* This involves monitoring any active transfers and processing their
|
||||
* completion or cancellation.
|
||||
*
|
||||
* The function is passed an array of pollfd structures (size nfds)
|
||||
* as a result of the poll() system call. The num_ready parameter
|
||||
@@ -972,6 +1025,31 @@ struct usbi_os_backend {
|
||||
int (*handle_events)(struct libusb_context *ctx,
|
||||
struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready);
|
||||
|
||||
/* Handle transfer completion. Optional.
|
||||
*
|
||||
* Provide this function when there are no file descriptors available
|
||||
* that directly indicate device or transfer activity. If your backend does
|
||||
* have such file descriptors, implement the handle_events function above.
|
||||
*
|
||||
* Your backend must tell the library when a transfer has completed by
|
||||
* calling usbi_signal_transfer_completion(). You should store any private
|
||||
* information about the transfer and its completion status in the transfer's
|
||||
* private backend data.
|
||||
*
|
||||
* During event handling, this function will be called on each transfer for
|
||||
* which usbi_signal_transfer_completion() was called.
|
||||
*
|
||||
* For any cancelled transfers, call usbi_handle_transfer_cancellation().
|
||||
* For completed transfers, call usbi_handle_transfer_completion().
|
||||
* For control/bulk/interrupt transfers, populate the "transferred"
|
||||
* element of the appropriate usbi_transfer structure before calling the
|
||||
* above functions. For isochronous transfers, populate the status and
|
||||
* transferred fields of the iso packet descriptors of the transfer.
|
||||
*
|
||||
* Return 0 on success, or a LIBUSB_ERROR code on failure.
|
||||
*/
|
||||
int (*handle_transfer_completion)(struct usbi_transfer *itransfer);
|
||||
|
||||
/* Get time from specified clock. At least two clocks must be implemented
|
||||
by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC.
|
||||
|
||||
@@ -1002,12 +1080,6 @@ struct usbi_os_backend {
|
||||
* usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance.
|
||||
*/
|
||||
size_t transfer_priv_size;
|
||||
|
||||
/* Mumber of additional bytes for os_priv for each iso packet.
|
||||
* Can your backend use this? */
|
||||
/* FIXME: linux can't use this any more. if other OS's cannot either,
|
||||
* then remove this */
|
||||
size_t add_iso_packet_size;
|
||||
};
|
||||
|
||||
extern const struct usbi_os_backend * const usbi_backend;
|
||||
@@ -1018,8 +1090,13 @@ extern const struct usbi_os_backend openbsd_backend;
|
||||
extern const struct usbi_os_backend netbsd_backend;
|
||||
extern const struct usbi_os_backend windows_backend;
|
||||
extern const struct usbi_os_backend wince_backend;
|
||||
extern const struct usbi_os_backend haiku_usb_raw_backend;
|
||||
|
||||
extern struct list_head active_contexts_list;
|
||||
extern usbi_mutex_static_t active_contexts_lock;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+27
-67
@@ -246,7 +246,7 @@ static usb_device_t **darwin_device_from_service (io_service_t service)
|
||||
&score);
|
||||
|
||||
if (kIOReturnSuccess != result || !plugInInterface) {
|
||||
usbi_dbg ("could not set up plugin for service: %s\n", darwin_error_str (result));
|
||||
usbi_dbg ("could not set up plugin for service: %s", darwin_error_str (result));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -279,6 +279,7 @@ static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) {
|
||||
static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) {
|
||||
struct libusb_device *dev = NULL;
|
||||
struct libusb_context *ctx;
|
||||
struct darwin_cached_device *old_device;
|
||||
|
||||
io_service_t device;
|
||||
UInt64 session;
|
||||
@@ -293,6 +294,17 @@ static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) {
|
||||
if (!ret)
|
||||
continue;
|
||||
|
||||
/* we need to match darwin_ref_cached_device call made in darwin_get_cached_device function
|
||||
otherwise no cached device will ever get freed */
|
||||
usbi_mutex_lock(&darwin_cached_devices_lock);
|
||||
list_for_each_entry(old_device, &darwin_cached_devices, list, struct darwin_cached_device) {
|
||||
if (old_device->session == session) {
|
||||
darwin_deref_cached_device (old_device);
|
||||
break;
|
||||
}
|
||||
}
|
||||
usbi_mutex_unlock(&darwin_cached_devices_lock);
|
||||
|
||||
list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {
|
||||
usbi_dbg ("notifying context %p of device disconnect", ctx);
|
||||
|
||||
@@ -973,14 +985,6 @@ static int darwin_open (struct libusb_device_handle *dev_handle) {
|
||||
/* device opened successfully */
|
||||
dpriv->open_count++;
|
||||
|
||||
/* create a file descriptor for notifications */
|
||||
pipe (priv->fds);
|
||||
|
||||
/* set the pipe to be non-blocking */
|
||||
fcntl (priv->fds[1], F_SETFD, O_NONBLOCK);
|
||||
|
||||
usbi_add_pollfd(HANDLE_CTX(dev_handle), priv->fds[0], POLLIN);
|
||||
|
||||
usbi_dbg ("device open for access");
|
||||
|
||||
return 0;
|
||||
@@ -994,7 +998,7 @@ static void darwin_close (struct libusb_device_handle *dev_handle) {
|
||||
|
||||
if (dpriv->open_count == 0) {
|
||||
/* something is probably very wrong if this is the case */
|
||||
usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!\n");
|
||||
usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1024,13 +1028,6 @@ static void darwin_close (struct libusb_device_handle *dev_handle) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* file descriptors are maintained per-instance */
|
||||
usbi_remove_pollfd (HANDLE_CTX (dev_handle), priv->fds[0]);
|
||||
close (priv->fds[1]);
|
||||
close (priv->fds[0]);
|
||||
|
||||
priv->fds[0] = priv->fds[1] = -1;
|
||||
}
|
||||
|
||||
static int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) {
|
||||
@@ -1761,9 +1758,7 @@ static void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) {
|
||||
static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) {
|
||||
struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon;
|
||||
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
||||
struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv;
|
||||
struct darwin_msg_async_io_complete message = {.itransfer = itransfer, .result = result,
|
||||
.size = (UInt32) (uintptr_t) arg0};
|
||||
struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
|
||||
|
||||
usbi_dbg ("an async io operation has completed");
|
||||
|
||||
@@ -1777,8 +1772,11 @@ static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0)
|
||||
(*(cInterface->interface))->WritePipe (cInterface->interface, pipeRef, transfer->buffer, 0);
|
||||
}
|
||||
|
||||
/* send a completion message to the device's file descriptor */
|
||||
write (priv->fds[1], &message, sizeof (message));
|
||||
tpriv->result = result;
|
||||
tpriv->size = (UInt32) (uintptr_t) arg0;
|
||||
|
||||
/* signal the core that this transfer is complete */
|
||||
usbi_signal_transfer_completion(itransfer);
|
||||
}
|
||||
|
||||
static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) {
|
||||
@@ -1807,7 +1805,7 @@ static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_
|
||||
}
|
||||
}
|
||||
|
||||
static void darwin_handle_callback (struct usbi_transfer *itransfer, kern_return_t result, UInt32 io_size) {
|
||||
static int darwin_handle_transfer_completion (struct usbi_transfer *itransfer) {
|
||||
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
||||
struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);
|
||||
int isIsoc = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type;
|
||||
@@ -1818,13 +1816,13 @@ static void darwin_handle_callback (struct usbi_transfer *itransfer, kern_return
|
||||
|
||||
if (!isIsoc && !isBulk && !isControl && !isInterrupt) {
|
||||
usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type);
|
||||
return;
|
||||
return LIBUSB_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
usbi_dbg ("handling %s completion with kernel status %d",
|
||||
isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", result);
|
||||
isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", tpriv->result);
|
||||
|
||||
if (kIOReturnSuccess == result || kIOReturnUnderrun == result) {
|
||||
if (kIOReturnSuccess == tpriv->result || kIOReturnUnderrun == tpriv->result) {
|
||||
if (isIsoc && tpriv->isoc_framelist) {
|
||||
/* copy isochronous results back */
|
||||
|
||||
@@ -1834,48 +1832,11 @@ static void darwin_handle_callback (struct usbi_transfer *itransfer, kern_return
|
||||
lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount;
|
||||
}
|
||||
} else if (!isIsoc)
|
||||
itransfer->transferred += io_size;
|
||||
itransfer->transferred += tpriv->size;
|
||||
}
|
||||
|
||||
/* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */
|
||||
usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, result));
|
||||
}
|
||||
|
||||
static int op_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) {
|
||||
struct darwin_msg_async_io_complete message;
|
||||
POLL_NFDS_TYPE i = 0;
|
||||
ssize_t ret;
|
||||
|
||||
usbi_mutex_lock(&ctx->open_devs_lock);
|
||||
|
||||
for (i = 0; i < nfds && num_ready > 0; i++) {
|
||||
struct pollfd *pollfd = &fds[i];
|
||||
|
||||
usbi_dbg ("checking fd %i with revents = %x", pollfd->fd, pollfd->revents);
|
||||
|
||||
if (!pollfd->revents)
|
||||
continue;
|
||||
|
||||
num_ready--;
|
||||
|
||||
if (pollfd->revents & POLLERR) {
|
||||
/* this probably will never happen so ignore the error an move on. */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* there is only one type of message */
|
||||
ret = read (pollfd->fd, &message, sizeof (message));
|
||||
if (ret < (ssize_t) sizeof (message)) {
|
||||
usbi_dbg ("WARNING: short read on async io completion pipe\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
darwin_handle_callback (message.itransfer, message.result, message.size);
|
||||
}
|
||||
|
||||
usbi_mutex_unlock(&ctx->open_devs_lock);
|
||||
|
||||
return 0;
|
||||
return usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, tpriv->result));
|
||||
}
|
||||
|
||||
static int darwin_clock_gettime(int clk_id, struct timespec *tp) {
|
||||
@@ -1998,12 +1959,11 @@ const struct usbi_os_backend darwin_backend = {
|
||||
.cancel_transfer = darwin_cancel_transfer,
|
||||
.clear_transfer_priv = darwin_clear_transfer_priv,
|
||||
|
||||
.handle_events = op_handle_events,
|
||||
.handle_transfer_completion = darwin_handle_transfer_completion,
|
||||
|
||||
.clock_gettime = darwin_clock_gettime,
|
||||
|
||||
.device_priv_size = sizeof(struct darwin_device_priv),
|
||||
.device_handle_priv_size = sizeof(struct darwin_device_handle_priv),
|
||||
.transfer_priv_size = sizeof(struct darwin_transfer_priv),
|
||||
.add_iso_packet_size = 0,
|
||||
};
|
||||
|
||||
+3
-7
@@ -28,7 +28,7 @@
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
|
||||
/* IOUSBInterfaceInferface */
|
||||
#if defined (kIOUSBInterfaceInterfaceID550)
|
||||
#if defined (kIOUSBInterfaceInterfaceID550) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
|
||||
|
||||
#define usb_interface_t IOUSBInterfaceInterface550
|
||||
#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550
|
||||
@@ -65,7 +65,7 @@
|
||||
#endif
|
||||
|
||||
/* IOUSBDeviceInterface */
|
||||
#if defined (kIOUSBDeviceInterfaceID500)
|
||||
#if defined (kIOUSBDeviceInterfaceID500) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
|
||||
|
||||
#define usb_device_t IOUSBDeviceInterface500
|
||||
#define DeviceInterfaceID kIOUSBDeviceInterfaceID500
|
||||
@@ -130,7 +130,6 @@ struct darwin_device_priv {
|
||||
struct darwin_device_handle_priv {
|
||||
int is_open;
|
||||
CFRunLoopSourceRef cfSource;
|
||||
int fds[2];
|
||||
|
||||
struct darwin_interface {
|
||||
usb_interface_t **interface;
|
||||
@@ -150,11 +149,8 @@ struct darwin_transfer_priv {
|
||||
IOUSBDevRequestTO req;
|
||||
|
||||
/* Bulk */
|
||||
};
|
||||
|
||||
/* structure for signaling io completion */
|
||||
struct darwin_msg_async_io_complete {
|
||||
struct usbi_transfer *itransfer;
|
||||
/* Completion status */
|
||||
IOReturn result;
|
||||
UInt32 size;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
AUTOMAKE_OPTIONS = subdir-objects
|
||||
noinst_LTLIBRARIES = libhaikuusb.la
|
||||
libhaikuusb_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/.. -I$(srcdir)/../.. -I$(srcdir)/../../.. -I$(srcdir)/../../../..
|
||||
libhaikuusb_la_SOURCES = haiku_usb_raw.cpp haiku_usb_backend.cpp haiku_pollfs.cpp haiku_usb_raw.h haiku_usb.h
|
||||
+810
File diff suppressed because it is too large
Load Diff
+1193
File diff suppressed because it is too large
Load Diff
+347
@@ -0,0 +1,347 @@
|
||||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2012-10-14.11; # UTC
|
||||
|
||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent tools from complaining about whitespace usage.
|
||||
IFS=" "" $nl"
|
||||
|
||||
file_conv=
|
||||
|
||||
# func_file_conv build_file lazy
|
||||
# Convert a $build file to $host form and store it in $file
|
||||
# Currently only supports Windows hosts. If the determined conversion
|
||||
# type is listed in (the comma separated) LAZY, no conversion will
|
||||
# take place.
|
||||
func_file_conv ()
|
||||
{
|
||||
file=$1
|
||||
case $file in
|
||||
/ | /[!/]*) # absolute file, and not a UNC file
|
||||
if test -z "$file_conv"; then
|
||||
# lazily determine how to convert abs files
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
file_conv=mingw
|
||||
;;
|
||||
CYGWIN*)
|
||||
file_conv=cygwin
|
||||
;;
|
||||
*)
|
||||
file_conv=wine
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $file_conv/,$2, in
|
||||
*,$file_conv,*)
|
||||
;;
|
||||
mingw/*)
|
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||
;;
|
||||
cygwin/*)
|
||||
file=`cygpath -m "$file" || echo "$file"`
|
||||
;;
|
||||
wine/*)
|
||||
file=`winepath -w "$file" || echo "$file"`
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# func_cl_dashL linkdir
|
||||
# Make cl look for libraries in LINKDIR
|
||||
func_cl_dashL ()
|
||||
{
|
||||
func_file_conv "$1"
|
||||
if test -z "$lib_path"; then
|
||||
lib_path=$file
|
||||
else
|
||||
lib_path="$lib_path;$file"
|
||||
fi
|
||||
linker_opts="$linker_opts -LIBPATH:$file"
|
||||
}
|
||||
|
||||
# func_cl_dashl library
|
||||
# Do a library search-path lookup for cl
|
||||
func_cl_dashl ()
|
||||
{
|
||||
lib=$1
|
||||
found=no
|
||||
save_IFS=$IFS
|
||||
IFS=';'
|
||||
for dir in $lib_path $LIB
|
||||
do
|
||||
IFS=$save_IFS
|
||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.dll.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/$lib.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/lib$lib.a"; then
|
||||
found=yes
|
||||
lib=$dir/lib$lib.a
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS=$save_IFS
|
||||
|
||||
if test "$found" != yes; then
|
||||
lib=$lib.lib
|
||||
fi
|
||||
}
|
||||
|
||||
# func_cl_wrapper cl arg...
|
||||
# Adjust compile command to suit cl
|
||||
func_cl_wrapper ()
|
||||
{
|
||||
# Assume a capable shell
|
||||
lib_path=
|
||||
shared=:
|
||||
linker_opts=
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.[oO][bB][jJ])
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fo"$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fe"$file"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-I)
|
||||
eat=1
|
||||
func_file_conv "$2" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-I*)
|
||||
func_file_conv "${1#-I}" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-l)
|
||||
eat=1
|
||||
func_cl_dashl "$2"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-l*)
|
||||
func_cl_dashl "${1#-l}"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-L)
|
||||
eat=1
|
||||
func_cl_dashL "$2"
|
||||
;;
|
||||
-L*)
|
||||
func_cl_dashL "${1#-L}"
|
||||
;;
|
||||
-static)
|
||||
shared=false
|
||||
;;
|
||||
-Wl,*)
|
||||
arg=${1#-Wl,}
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $arg; do
|
||||
IFS="$save_ifs"
|
||||
linker_opts="$linker_opts $flag"
|
||||
done
|
||||
IFS="$save_ifs"
|
||||
;;
|
||||
-Xlinker)
|
||||
eat=1
|
||||
linker_opts="$linker_opts $2"
|
||||
;;
|
||||
-*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||
func_file_conv "$1"
|
||||
set x "$@" -Tp"$file"
|
||||
shift
|
||||
;;
|
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||
func_file_conv "$1" mingw
|
||||
set x "$@" "$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
if test -n "$linker_opts"; then
|
||||
linker_opts="-link$linker_opts"
|
||||
fi
|
||||
exec "$@" $linker_opts
|
||||
exit 1
|
||||
}
|
||||
|
||||
eat=
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand '-c -o'.
|
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file 'INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user