mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #8070 from leoetlino/usb-fixes
Update and patch libusb to fix USB issues
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
libusb/android
|
||||
libusb/appveyor*
|
||||
libusb/doc
|
||||
libusb/examples
|
||||
libusb/msvc/*
|
||||
!libusb/msvc/config.h
|
||||
libusb/tests
|
||||
libusb/Xcode
|
||||
Vendored
+49
@@ -0,0 +1,49 @@
|
||||
language: c
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
dist: trusty
|
||||
sudo: required
|
||||
compiler: gcc
|
||||
- os: linux
|
||||
dist: trusty
|
||||
sudo: required
|
||||
compiler: clang
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
compiler: gcc
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
compiler: clang
|
||||
- os: osx
|
||||
osx_image: xcode7.1
|
||||
compiler: gcc
|
||||
- os: osx
|
||||
osx_image: xcode7.1
|
||||
compiler: clang
|
||||
- os: osx
|
||||
osx_image: beta-xcode6.2
|
||||
compiler: gcc
|
||||
- os: osx
|
||||
osx_image: beta-xcode6.2
|
||||
compiler: clang
|
||||
|
||||
addons:
|
||||
homebrew:
|
||||
update: true
|
||||
brewfile: true
|
||||
apt:
|
||||
packages:
|
||||
- autoconf
|
||||
- automake
|
||||
- libtool
|
||||
- m4
|
||||
- libudev-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
script:
|
||||
- ./autogen.sh && make clean && make
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./travis-autogen.sh --disable-udev && make clean && make ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then cd Xcode && xcodebuild -project libusb.xcodeproj ; fi
|
||||
Vendored
+32
-2
@@ -8,14 +8,19 @@ 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>
|
||||
Copyright © 2013-2018 Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
|
||||
Other contributors:
|
||||
Adrian Bunk
|
||||
Akshay Jaggi
|
||||
Alan Ott
|
||||
Alan Stern
|
||||
Alex Vatchenko
|
||||
Andrew Fernandes
|
||||
Andy Chunyu
|
||||
Andy McFadden
|
||||
Angus Gratton
|
||||
Anil Nair
|
||||
Anthony Clay
|
||||
Antonio Ospite
|
||||
Artem Egorkine
|
||||
@@ -23,12 +28,17 @@ Aurelien Jarno
|
||||
Bastien Nocera
|
||||
Bei Zhang
|
||||
Benjamin Dobell
|
||||
Brent Rector
|
||||
Carl Karsten
|
||||
Christophe Zeitouny
|
||||
Colin Walters
|
||||
Dave Camarillo
|
||||
David Engraf
|
||||
David Moore
|
||||
Davidlohr Bueso
|
||||
Dmitry Fleytman
|
||||
Doug Johnston
|
||||
Evan Hunter
|
||||
Federico Manzan
|
||||
Felipe Balbi
|
||||
Florian Albrechtskirchinger
|
||||
@@ -41,23 +51,34 @@ Hans Ulrich Niedermann
|
||||
Hector Martin
|
||||
Hoi-Ho Chan
|
||||
Ilya Konstantinov
|
||||
Jakub Klama
|
||||
James Hanko
|
||||
Jeffrey Nichols
|
||||
Johann Richard
|
||||
John Sheu
|
||||
Jonathon Jongsma
|
||||
Joost Muller
|
||||
Josh Gao
|
||||
Joshua Blake
|
||||
Justin Bischoff
|
||||
KIMURA Masaru
|
||||
Karsten Koenig
|
||||
Konrad Rzepecki
|
||||
Kuangye Guo
|
||||
Lars Kanis
|
||||
Lars Wirzenius
|
||||
Lei Chen
|
||||
Luca Longinotti
|
||||
Marcus Meissner
|
||||
Markus Heidelberg
|
||||
Martin Ettl
|
||||
Martin Koegler
|
||||
Matthew Stapleton
|
||||
Matthias Bolte
|
||||
Michel Zou
|
||||
Mike Frysinger
|
||||
Mikhail Gusarov
|
||||
Morgan Leborgne
|
||||
Moritz Fischer
|
||||
Ларионов Даниил
|
||||
Nicholas Corgan
|
||||
@@ -66,10 +87,17 @@ Orin Eman
|
||||
Paul Fertser
|
||||
Pekka Nikander
|
||||
Rob Walker
|
||||
Romain Vimont
|
||||
Roman Kalashnikov
|
||||
Sameeh Jubran
|
||||
Sean McBride
|
||||
Sebastian Pipping
|
||||
Sergey Serb
|
||||
Simon Haggett
|
||||
Simon Newton
|
||||
Stefan Agner
|
||||
Stefan Tauner
|
||||
Steinar H. Gunderson
|
||||
Thomas Röfer
|
||||
Tim Hutt
|
||||
Tim Roberts
|
||||
@@ -81,9 +109,11 @@ Uri Lublin
|
||||
Vasily Khoruzhick
|
||||
Vegard Storheil Eriksen
|
||||
Venkatesh Shukla
|
||||
Vianney le Clément de Saint-Marcq
|
||||
Victor Toso
|
||||
Vitali Lovich
|
||||
William Skellenger
|
||||
Xiaofan Chen
|
||||
Zoltán Kovács
|
||||
Роман Донченко
|
||||
parafin
|
||||
xantares
|
||||
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
brew 'automake'
|
||||
brew 'libtool'
|
||||
brew 'autoconf'
|
||||
brew 'm4'
|
||||
Vendored
+35
@@ -1,6 +1,41 @@
|
||||
For detailed information about the changes below, please see the git log or
|
||||
visit: http://log.libusb.info
|
||||
|
||||
2019-04-05: v1.0.23 (in progress)
|
||||
* Add German translation (#446)
|
||||
* Add Hungarian translation (#493)
|
||||
* Android: Improved support for Android
|
||||
* configure.ac: Fix detection of clock_gettime library (#439)
|
||||
* Darwin(macOS): Switch from using ResetDevice to USBDeviceReEnumerate (#455)
|
||||
* Darwin(macOS): Remove code that changed the device class used (#428)
|
||||
* Darwin(macOS): Reduce hotplug timeout to 1ms (from 5s)
|
||||
* New API libusb_set_log_cb() to redirect global and per context log
|
||||
messages to the provided log handling function
|
||||
* New API libusb_wrap_sys_device to allow the user to specify the
|
||||
usb device to use.
|
||||
* Solaris: Break infinite recursion in backend clock_gettime
|
||||
* Solaris: Enable timerfd on sunos when available
|
||||
* Windows: Add support for isochronous transfers with WinUSB
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2018-03-24: v1.0.22:
|
||||
* New libusb_set_option() API
|
||||
* Fix transfer timeout not being cleared upon resubmission
|
||||
* Report super speed plus devices on modern Linux and macOS
|
||||
* Darwin: Improve support for macOS Sierra and High Sierra
|
||||
* Darwin: SDK fixes and improvements
|
||||
* Linux: Let initialization succeed when no devices are present
|
||||
* Linux: Mark internal file descriptors with CLOEXEC flag
|
||||
* Solaris: Add support for attach/detach kernel driver
|
||||
* Windows: Add dynamic UsbDk backend selection
|
||||
* Windows: Add isochronous transfer support via libusbK
|
||||
* Windows: Add Visual Studio 2017 support
|
||||
* Windows: Fix enumeration problems on Windows 8 and later
|
||||
* Windows: Major rework of poll() emulation
|
||||
* Windows: Numerous HID API fixes
|
||||
* Windows: Support cancelation of individual transfers (Vista and later)
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2016-10-01: v1.0.21:
|
||||
* Core: Refactor code related to transfer flags and timeout handling
|
||||
* Darwin: Ignore root hub simulation devices
|
||||
|
||||
Vendored
-7
@@ -1,7 +0,0 @@
|
||||
Dolphin-specific changes (as of 2016-11-20)
|
||||
-------------------------------------------
|
||||
|
||||
- removed all toplevel directories save msvc/ & libusb/
|
||||
- removed all files save AUTHORS, Changelog, COPYING, INSTALL, NEWS,
|
||||
PORTING, README and TODO
|
||||
- patched the VS project file to insert dolphin-specific props
|
||||
Vendored
+73
@@ -0,0 +1,73 @@
|
||||
Installation Instructions for Windows
|
||||
*************************************
|
||||
|
||||
If you are compiling for MinGW or cygwin, please refer to the INSTALL file.
|
||||
|
||||
If you are using Microsoft Visual Studio:
|
||||
- Open the relevant solution file in /msvc:
|
||||
libusb.dsw for MSVC6, libusb_2005.sln for Visual Studio 2005 or 2008,
|
||||
libusb_2010.sln for Visual Studio 2010,
|
||||
libusb_2012.sln for Visual Studio 2012 or later,
|
||||
libusb_wince.sln for Windows CE support in Visual Studio 2005.
|
||||
- If you want to debug the library, uncomment the ENABLE_DEBUG_LOGGING define
|
||||
in msvc\config.h
|
||||
- Select your configuration and compile the project
|
||||
|
||||
Note that if you are using Visual Studio Express, you may have to install the
|
||||
Windows SDK to be able to compile the 64 bit version of the library.
|
||||
|
||||
If you are using the freely available Windows DDK/WDK (Driver Development Kit)
|
||||
- If you want to debug the library, uncomment the ENABLE_DEBUG_LOGGING define
|
||||
in msvc\config.h
|
||||
- Open one of the relevant Free Build or Checked Build prompt for your target
|
||||
platform
|
||||
- Navigate to the msvc\ directory where the ddk_build.cmd file is located, and
|
||||
run 'ddk_build'
|
||||
- To produce a DLL rather than a static library, use: 'ddk_build DLL'
|
||||
- To produce a static library that uses LIBCMT[d] instead of MSVCRT[d] (/MT[d]
|
||||
vs /MD[d] in Visual Studio) use: 'ddk_build /MT'
|
||||
|
||||
Note that using the Windows DDK, it is possible to compile both the 32 and 64
|
||||
bit versions of the library.
|
||||
|
||||
If you are building for Windows CE then you will need the Windows CE Standard 5.00 SDK.
|
||||
|
||||
Destination directories
|
||||
***********************
|
||||
|
||||
The 32 bit binaries compiled either from Visual Studio or the DDK are placed in
|
||||
a Win32\ directory at the root of the library
|
||||
The 64 bit binaries are placed in an x64\ directory
|
||||
Windows CE binaries are placed in one of the following directories, depending
|
||||
on the target processor: ARMV4I, MIPSII, MIPSII_FP, MIPSIV, MIPSIV_FP, SH4 or x86.
|
||||
|
||||
|
||||
Troubleshooting
|
||||
***************
|
||||
|
||||
If the compilation process complains about missing libraries, ensure that the
|
||||
default library paths for your project points to the relevant directories.
|
||||
If needed, these libraries can be obtained by installing either the latest
|
||||
Windows SDK or the DDK (Links provided at the end of this file).
|
||||
|
||||
For Windows CE it is necessary to install the CE USB Kernel Wrapper driver for
|
||||
libusb to function on a device.
|
||||
|
||||
Links
|
||||
*****
|
||||
|
||||
Additional information related to the Windows backend:
|
||||
http://windows.libusb.info
|
||||
|
||||
Latest Windows Driver (Development) Kit (WDK):
|
||||
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=36a2630f-5d56-43b5-b996-7633f2ec14ff
|
||||
|
||||
Latest Microsoft Windows SDK:
|
||||
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505
|
||||
|
||||
Windows CE Standard 5.00 SDK:
|
||||
http://www.microsoft.com/en-gb/download/details.aspx?id=17310
|
||||
|
||||
Windows CE USB Kernel Wrapper Driver:
|
||||
https://github.com/RealVNC/CEUSBKWrapper
|
||||
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
DISTCLEANFILES = libusb-1.0.pc
|
||||
EXTRA_DIST = TODO PORTING msvc libusb/libusb-1.0.def libusb/version_nano.h \
|
||||
examples/getopt/getopt.c examples/getopt/getopt1.c examples/getopt/getopt.h \
|
||||
android Xcode
|
||||
SUBDIRS = libusb doc
|
||||
|
||||
if BUILD_EXAMPLES
|
||||
SUBDIRS += examples
|
||||
endif
|
||||
|
||||
if BUILD_TESTS
|
||||
SUBDIRS += tests
|
||||
endif
|
||||
|
||||
pkgconfigdir=$(libdir)/pkgconfig
|
||||
pkgconfig_DATA=libusb-1.0.pc
|
||||
|
||||
.PHONY: dist-up
|
||||
|
||||
reldir = .release/$(distdir)
|
||||
dist-up: dist
|
||||
rm -rf $(reldir)
|
||||
mkdir -p $(reldir)
|
||||
cp $(distdir).tar.bz2 $(reldir)
|
||||
rsync -rv $(reldir) frs.sourceforge.net:/home/frs/project/l/li/libusb/libusb-1.0/
|
||||
rm -rf $(reldir)
|
||||
Vendored
-33
@@ -1,33 +0,0 @@
|
||||
# libusb
|
||||
|
||||
[](https://travis-ci.org/libusb/libusb)
|
||||
[](https://ci.appveyor.com/project/LudovicRousseau/libusb)
|
||||
[](https://scan.coverity.com/projects/libusb-libusb)
|
||||
|
||||
libusb is a library for USB device access from Linux, Mac OS X,
|
||||
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](COPYING)).
|
||||
|
||||
libusb is abstracted internally in such a way that it can hopefully
|
||||
be ported to other operating systems. Please see the [PORTING](PORTING)
|
||||
file for more information.
|
||||
|
||||
libusb homepage:
|
||||
http://libusb.info/
|
||||
|
||||
Developers will wish to consult the API documentation:
|
||||
http://api.libusb.info
|
||||
|
||||
Use the mailing list for questions, comments, etc:
|
||||
http://mailing-list.libusb.info
|
||||
|
||||
- Pete Batard <pete@akeo.ie>
|
||||
- Hans de Goede <hdegoede@redhat.com>
|
||||
- Xiaofan Chen <xiaofanc@gmail.com>
|
||||
- Ludovic Rousseau <ludovic.rousseau@gmail.com>
|
||||
- Nathan Hjelm <hjelmn@cs.unm.edu>
|
||||
- Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
|
||||
(Please use the mailing list rather than mailing developers directly)
|
||||
+1
@@ -0,0 +1 @@
|
||||
README.md
|
||||
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
Notes related to git compilation:
|
||||
--------------------------------
|
||||
|
||||
If you retrieved the libusb repository from git and are using a gcc based
|
||||
toolchain, be mindful that you should have the autotools installed (autoconf,
|
||||
automake) and will need to run either ./autogen.sh or ./bootstrap.sh to produce
|
||||
the configure file.
|
||||
|
||||
The difference between autogen.sh and bootstrap.sh is that the former invokes
|
||||
configure with a default set of options, and will therefore generate a Makefile,
|
||||
whereas the latter does not invoke configure at all. If using autogen.sh, note
|
||||
that you can also append options, that will be passed as is to configure.
|
||||
|
||||
OS X-specific notes:
|
||||
-------------------
|
||||
|
||||
Starting with Xcode 4.3, neither Xcode.app nor the Xcode 'command line tools'
|
||||
includes autotools and so running either autogen.sh or bootstrap.sh will result
|
||||
in the message:
|
||||
|
||||
libtoolize or glibtoolize was not found! Please install libtool.
|
||||
|
||||
To proceed, you must find and install it from somewhere.
|
||||
|
||||
Alternatively, you can use the Xcode project at Xcode/libusb.xcodeproj.
|
||||
|
||||
Notes related to submitting new developments:
|
||||
--------------------------------------------
|
||||
|
||||
If you submit a new development to libusb (eg: new backend), that is unlikely
|
||||
to fit in a couple of small patches, we would kindly suggest that you create a
|
||||
public account on github, if you don't have one already, and then fork a new
|
||||
libusb repository under this account from https://github.com/libusb/libusb.
|
||||
|
||||
Then you can create a git branch for your work, that we will be able to better
|
||||
reference and test.
|
||||
|
||||
We also suggest that, if you are planning to bring in a large development, you
|
||||
try to involve the libusb community early by letting the mailing list know, as
|
||||
you may find that other people might be eager to help you out.
|
||||
See http://mailing-list.libusb.info for details on how to join the mailing list.
|
||||
Vendored
+32
@@ -0,0 +1,32 @@
|
||||
# libusb
|
||||
|
||||
[](https://travis-ci.org/libusb/libusb)
|
||||
[](https://ci.appveyor.com/project/LudovicRousseau/libusb)
|
||||
[](https://scan.coverity.com/projects/libusb-libusb)
|
||||
|
||||
libusb is a library for USB device access from Linux, macOS,
|
||||
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](COPYING)).
|
||||
|
||||
libusb is abstracted internally in such a way that it can hopefully
|
||||
be ported to other operating systems. Please see the [PORTING](PORTING)
|
||||
file for more information.
|
||||
|
||||
libusb homepage:
|
||||
http://libusb.info/
|
||||
|
||||
Developers will wish to consult the API documentation:
|
||||
http://api.libusb.info
|
||||
|
||||
Use the mailing list for questions, comments, etc:
|
||||
http://mailing-list.libusb.info
|
||||
|
||||
- Hans de Goede <hdegoede@redhat.com>
|
||||
- Xiaofan Chen <xiaofanc@gmail.com>
|
||||
- Ludovic Rousseau <ludovic.rousseau@gmail.com>
|
||||
- Nathan Hjelm <hjelmn@cs.unm.edu>
|
||||
- Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
|
||||
(Please use the mailing list rather than mailing developers directly)
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
./bootstrap.sh
|
||||
if test -z "$NOCONFIGURE"; then
|
||||
exec ./configure --enable-examples-build --enable-tests-build "$@"
|
||||
fi
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
if ! test -d m4 ; then
|
||||
mkdir m4
|
||||
fi
|
||||
autoreconf -ivf || exit 1
|
||||
Vendored
+332
@@ -0,0 +1,332 @@
|
||||
dnl These m4 macros are whitespace sensitive and break if moved around much.
|
||||
m4_define([LU_VERSION_H], m4_include([libusb/version.h]))
|
||||
m4_define([LU_DEFINE_VERSION_ATOM],
|
||||
[m4_define([$1], m4_bregexp(LU_VERSION_H,
|
||||
[^#define\s*$1\s*\([0-9]*\).*], [\1]))])
|
||||
m4_define([LU_DEFINE_VERSION_RC_ATOM],
|
||||
[m4_define([$1], m4_bregexp(LU_VERSION_H,
|
||||
[^#define\s*$1\s*"\(-rc[0-9]*\)".*], [\1]))])
|
||||
dnl The m4_bregexp() returns (only) the numbers following the #define named
|
||||
dnl in the first macro parameter. m4_define() then defines the name for use
|
||||
dnl in AC_INIT.
|
||||
|
||||
LU_DEFINE_VERSION_ATOM([LIBUSB_MAJOR])
|
||||
LU_DEFINE_VERSION_ATOM([LIBUSB_MINOR])
|
||||
LU_DEFINE_VERSION_ATOM([LIBUSB_MICRO])
|
||||
LU_DEFINE_VERSION_RC_ATOM([LIBUSB_RC])
|
||||
|
||||
AC_INIT([libusb],[LIBUSB_MAJOR[.]LIBUSB_MINOR[.]LIBUSB_MICRO[]LIBUSB_RC],[libusb-devel@lists.sourceforge.net],[libusb],[http://libusb.info])
|
||||
|
||||
# Library versioning
|
||||
# These numbers should be tweaked on every release. Read carefully:
|
||||
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||
# http://sourceware.org/autobook/autobook/autobook_91.html
|
||||
lt_current=2
|
||||
lt_revision=0
|
||||
lt_age=1
|
||||
LTLDFLAGS="-version-info ${lt_current}:${lt_revision}:${lt_age}"
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
|
||||
AC_CONFIG_SRCDIR([libusb/core.c])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
LT_INIT
|
||||
LT_LANG([Windows Resource])
|
||||
AC_C_INLINE
|
||||
AM_PROG_CC_C_O
|
||||
AC_DEFINE([_GNU_SOURCE], 1, [Use GNU extensions])
|
||||
|
||||
LTLDFLAGS="${LTLDFLAGS} -no-undefined"
|
||||
|
||||
AC_MSG_CHECKING([operating system])
|
||||
|
||||
dnl on linux-android platform, some functions are in different places
|
||||
case $host in
|
||||
*-linux-android*)
|
||||
AC_MSG_RESULT([This is a Linux-Android system])
|
||||
is_backend_android=yes
|
||||
;;
|
||||
*)
|
||||
is_backend_android=no
|
||||
esac
|
||||
|
||||
case $host in
|
||||
*-linux* | *-uclinux*)
|
||||
AC_MSG_RESULT([Linux])
|
||||
backend=linux
|
||||
threads=posix
|
||||
;;
|
||||
*-darwin*)
|
||||
AC_MSG_RESULT([Darwin/Mac OS X])
|
||||
backend=darwin
|
||||
threads=posix
|
||||
;;
|
||||
*-openbsd*)
|
||||
AC_MSG_RESULT([OpenBSD])
|
||||
backend=openbsd
|
||||
threads=posix
|
||||
;;
|
||||
*-netbsd*)
|
||||
AC_MSG_RESULT([NetBSD])
|
||||
backend=netbsd
|
||||
threads=posix
|
||||
;;
|
||||
*-mingw* | *msys*)
|
||||
AC_MSG_RESULT([Windows])
|
||||
backend=windows
|
||||
threads=windows
|
||||
create_import_lib=yes
|
||||
AM_CFLAGS="${AM_CFLAGS} -fno-omit-frame-pointer"
|
||||
;;
|
||||
*-cygwin*)
|
||||
AC_MSG_RESULT([Cygwin (using Windows backend)])
|
||||
backend=windows
|
||||
threads=posix
|
||||
;;
|
||||
*-haiku*)
|
||||
AC_MSG_RESULT([Haiku])
|
||||
backend=haiku
|
||||
threads=posix
|
||||
;;
|
||||
*-solaris*)
|
||||
AC_MSG_RESULT([SunOS])
|
||||
backend=sunos
|
||||
threads=posix
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([unsupported operating system $host])
|
||||
esac
|
||||
|
||||
case $backend in
|
||||
linux)
|
||||
AC_DEFINE(OS_LINUX, 1, [Linux backend])
|
||||
AC_SUBST(OS_LINUX)
|
||||
AC_SEARCH_LIBS([clock_gettime], [rt], [], [], [-pthread])
|
||||
AC_ARG_ENABLE([udev],
|
||||
[AC_HELP_STRING([--enable-udev], [use udev for device enumeration and hotplug support (recommended) [default=yes]])],
|
||||
[], [enable_udev=yes])
|
||||
if test "x$enable_udev" = xyes ; then
|
||||
# system has udev. use it or fail!
|
||||
AC_CHECK_HEADERS([libudev.h], [], [AC_MSG_ERROR([udev support requested but libudev header not installed])])
|
||||
AC_CHECK_LIB([udev], [udev_new], [], [AC_MSG_ERROR([udev support requested but libudev not installed])])
|
||||
AC_DEFINE(USE_UDEV, 1, [Use udev for device enumeration/hotplug])
|
||||
else
|
||||
AC_CHECK_HEADERS([asm/types.h], [], [])
|
||||
AC_CHECK_HEADERS([sys/socket.h linux/netlink.h], [], [AC_MSG_ERROR([Linux netlink headers not found])], [
|
||||
#ifdef HAVE_ASM_TYPES_H
|
||||
#include <asm/types.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
])
|
||||
fi
|
||||
AC_SUBST(USE_UDEV)
|
||||
|
||||
if test "x$is_backend_android" != xyes; then
|
||||
THREAD_CFLAGS="-pthread"
|
||||
LIBS="${LIBS} -pthread"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADERS([poll.h])
|
||||
AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
|
||||
;;
|
||||
darwin)
|
||||
AC_DEFINE(OS_DARWIN, 1, [Darwin backend])
|
||||
AC_SUBST(OS_DARWIN)
|
||||
LIBS="-lobjc -Wl,-framework,IOKit -Wl,-framework,CoreFoundation"
|
||||
LTLDFLAGS="${LTLDFLAGS} -Wl,-prebind"
|
||||
AC_CHECK_HEADERS([poll.h])
|
||||
AC_CHECK_TYPE([nfds_t],
|
||||
[AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])],
|
||||
[AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[type of second poll() argument])],
|
||||
[#include <poll.h>])
|
||||
;;
|
||||
openbsd)
|
||||
AC_DEFINE(OS_OPENBSD, 1, [OpenBSD backend])
|
||||
AC_SUBST(OS_OPENBSD)
|
||||
THREAD_CFLAGS="-pthread"
|
||||
LIBS="-pthread"
|
||||
AC_CHECK_HEADERS([poll.h])
|
||||
AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
|
||||
;;
|
||||
sunos)
|
||||
AC_DEFINE(OS_SUNOS, 1, [SunOS backend])
|
||||
AC_SUBST(OS_SUNOS)
|
||||
THREAD_CFLAGS="-pthread"
|
||||
LIBS="-pthread -ldevinfo"
|
||||
AC_CHECK_HEADERS([poll.h])
|
||||
AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
|
||||
;;
|
||||
netbsd)
|
||||
AC_DEFINE(OS_NETBSD, 1, [NetBSD backend])
|
||||
AC_SUBST(OS_NETBSD)
|
||||
THREAD_CFLAGS="-pthread"
|
||||
LIBS="-pthread"
|
||||
AC_CHECK_HEADERS([poll.h])
|
||||
AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
|
||||
;;
|
||||
windows)
|
||||
AC_DEFINE(OS_WINDOWS, 1, [Windows backend])
|
||||
AC_SUBST(OS_WINDOWS)
|
||||
LIBS=""
|
||||
LTLDFLAGS="${LTLDFLAGS} -avoid-version -Wl,--add-stdcall-alias"
|
||||
AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[type of second poll() argument])
|
||||
AC_DEFINE([WINVER], 0x0501, [Oldest Windows version supported])
|
||||
AC_DEFINE([_WIN32_WINNT], 0x0501, [Oldest Windows version supported])
|
||||
;;
|
||||
haiku)
|
||||
AC_DEFINE(OS_HAIKU, 1, [Haiku backend])
|
||||
AC_SUBST(OS_HAIKU)
|
||||
LIBS="${LIBS} -lbe"
|
||||
AC_CHECK_HEADERS([poll.h])
|
||||
AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(LIBS)
|
||||
|
||||
AM_CONDITIONAL(OS_LINUX, test "x$backend" = xlinux)
|
||||
AM_CONDITIONAL(OS_DARWIN, test "x$backend" = xdarwin)
|
||||
AM_CONDITIONAL(OS_OPENBSD, test "x$backend" = xopenbsd)
|
||||
AM_CONDITIONAL(OS_SUNOS, test "x$backend" = xsunos)
|
||||
AM_CONDITIONAL(OS_NETBSD, test "x$backend" = xnetbsd)
|
||||
AM_CONDITIONAL(OS_WINDOWS, test "x$backend" = xwindows)
|
||||
AM_CONDITIONAL(OS_HAIKU, test "x$backend" = xhaiku)
|
||||
AM_CONDITIONAL(THREADS_POSIX, test "x$threads" = xposix)
|
||||
AM_CONDITIONAL(CREATE_IMPORT_LIB, test "x$create_import_lib" = xyes)
|
||||
AM_CONDITIONAL(USE_UDEV, test "x$enable_udev" = xyes)
|
||||
if test "x$threads" = xposix; then
|
||||
AC_DEFINE(THREADS_POSIX, 1, [Use POSIX Threads])
|
||||
fi
|
||||
|
||||
# timerfd
|
||||
AC_CHECK_HEADER([sys/timerfd.h], [timerfd_h=1], [timerfd_h=0])
|
||||
AC_ARG_ENABLE([timerfd],
|
||||
[AS_HELP_STRING([--enable-timerfd],
|
||||
[use timerfd for timing [default=auto]])],
|
||||
[use_timerfd=$enableval], [use_timerfd=auto])
|
||||
|
||||
if test "x$use_timerfd" = xyes -a "x$timerfd_h" = x0; then
|
||||
AC_MSG_ERROR([timerfd header not available; glibc 2.9+ required])
|
||||
fi
|
||||
|
||||
AC_CHECK_DECLS([TFD_NONBLOCK, TFD_CLOEXEC], [tfd_hdr_ok=yes], [tfd_hdr_ok=no], [#include <sys/timerfd.h>])
|
||||
if test "x$use_timerfd" = xyes -a "x$tfd_hdr_ok" = xno; then
|
||||
AC_MSG_ERROR([timerfd header not usable; glibc 2.9+ required])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([whether to use timerfd for timing])
|
||||
if test "x$use_timerfd" = xno; then
|
||||
AC_MSG_RESULT([no (disabled by user)])
|
||||
else
|
||||
if test "x$timerfd_h" = x1 -a "x$tfd_hdr_ok" = xyes; then
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE(USBI_TIMERFD_AVAILABLE, 1, [timerfd headers available])
|
||||
else
|
||||
AC_MSG_RESULT([no (header not available)])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS([pipe2])
|
||||
AC_CHECK_TYPES([struct timespec])
|
||||
|
||||
# Message logging
|
||||
AC_ARG_ENABLE([log], [AS_HELP_STRING([--disable-log], [disable all logging])],
|
||||
[log_enabled=$enableval],
|
||||
[log_enabled=yes])
|
||||
if test "x$log_enabled" != xno; then
|
||||
AC_DEFINE([ENABLE_LOGGING], 1, [Message logging])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([debug-log], [AS_HELP_STRING([--enable-debug-log],
|
||||
[start with debug message logging enabled [default=no]])],
|
||||
[debug_log_enabled=$enableval],
|
||||
[debug_log_enabled=no])
|
||||
if test "x$debug_log_enabled" != xno; then
|
||||
AC_DEFINE([ENABLE_DEBUG_LOGGING], 1, [Start with debug message logging enabled])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([system-log], [AS_HELP_STRING([--enable-system-log],
|
||||
[output logging messages to system wide log, if supported by the OS [default=no]])],
|
||||
[system_log_enabled=$enableval],
|
||||
[system_log_enabled=no])
|
||||
if test "x$system_log_enabled" != xno; then
|
||||
AC_DEFINE([USE_SYSTEM_LOGGING_FACILITY], 1, [Enable output to system log])
|
||||
|
||||
# Check if syslog is available in standard C library
|
||||
AC_CHECK_HEADERS(syslog.h)
|
||||
AC_CHECK_FUNC([syslog], [have_syslog=yes], [have_syslog=no])
|
||||
if test "x$have_syslog" != xno; then
|
||||
AC_DEFINE([HAVE_SYSLOG_FUNC], 1, [syslog() function available])
|
||||
fi
|
||||
fi
|
||||
|
||||
# Examples build
|
||||
AC_ARG_ENABLE([examples-build], [AS_HELP_STRING([--enable-examples-build],
|
||||
[build example applications [default=no]])],
|
||||
[build_examples=$enableval],
|
||||
[build_examples=no])
|
||||
AM_CONDITIONAL(BUILD_EXAMPLES, test "x$build_examples" != xno)
|
||||
|
||||
# Tests build
|
||||
AC_ARG_ENABLE([tests-build], [AS_HELP_STRING([--enable-tests-build],
|
||||
[build test applications [default=no]])],
|
||||
[build_tests=$enableval],
|
||||
[build_tests=no])
|
||||
AM_CONDITIONAL(BUILD_TESTS, test "x$build_tests" != xno)
|
||||
|
||||
# headers not available on all platforms but required on others
|
||||
AC_CHECK_HEADERS([sys/time.h])
|
||||
|
||||
# sigaction not available on MinGW
|
||||
AC_CHECK_FUNC([sigaction], [have_sigaction=yes], [have_sigaction=no])
|
||||
AM_CONDITIONAL(HAVE_SIGACTION, test "x$have_sigaction" = xyes)
|
||||
|
||||
# check for -fvisibility=hidden compiler support (GCC >= 3.4)
|
||||
saved_cflags="$CFLAGS"
|
||||
# -Werror required for cygwin
|
||||
CFLAGS="$CFLAGS -Werror -fvisibility=hidden"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
|
||||
[VISIBILITY_CFLAGS="-fvisibility=hidden"
|
||||
AC_DEFINE([DEFAULT_VISIBILITY], [__attribute__((visibility("default")))], [Default visibility])],
|
||||
[VISIBILITY_CFLAGS=""
|
||||
AC_DEFINE([DEFAULT_VISIBILITY], [], [Default visibility])],
|
||||
])
|
||||
CFLAGS="$saved_cflags"
|
||||
|
||||
# check for -Wno-pointer-sign compiler support (GCC >= 4)
|
||||
saved_cflags="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Wno-pointer-sign"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
|
||||
nopointersign_cflags="-Wno-pointer-sign", nopointersign_cflags="")
|
||||
CFLAGS="$saved_cflags"
|
||||
|
||||
# check for -std=gnu99 compiler support
|
||||
saved_cflags="$CFLAGS"
|
||||
CFLAGS="-std=gnu99"
|
||||
AC_MSG_CHECKING([whether CC supports -std=gnu99])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
|
||||
[AC_MSG_RESULT([yes])]
|
||||
[AM_CFLAGS="${AM_CFLAGS} -std=gnu99"],
|
||||
[AC_MSG_RESULT([no])]
|
||||
)
|
||||
CFLAGS="$saved_cflags"
|
||||
|
||||
AM_CFLAGS="${AM_CFLAGS} -Wall -Wundef -Wunused -Wstrict-prototypes -Werror-implicit-function-declaration $nopointersign_cflags -Wshadow ${THREAD_CFLAGS} ${VISIBILITY_CFLAGS}"
|
||||
|
||||
AC_SUBST(AM_CFLAGS)
|
||||
AC_SUBST(LTLDFLAGS)
|
||||
|
||||
AC_CONFIG_FILES([libusb-1.0.pc])
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_CONFIG_FILES([libusb/Makefile])
|
||||
AC_CONFIG_FILES([examples/Makefile])
|
||||
AC_CONFIG_FILES([tests/Makefile])
|
||||
AC_CONFIG_FILES([doc/Makefile])
|
||||
AC_CONFIG_FILES([doc/doxygen.cfg])
|
||||
AC_OUTPUT
|
||||
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: libusb-1.0
|
||||
Description: C API for USB device access from Linux, Mac OS X, Windows, OpenBSD/NetBSD and Solaris userspace
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -lusb-1.0
|
||||
Libs.private: @LIBS@
|
||||
Cflags: -I${includedir}/libusb-1.0
|
||||
Vendored
+9
-7
@@ -13,10 +13,12 @@ DARWIN_USB_SRC = os/darwin_usb.h os/darwin_usb.c
|
||||
OPENBSD_USB_SRC = os/openbsd_usb.c
|
||||
NETBSD_USB_SRC = os/netbsd_usb.c
|
||||
SUNOS_USB_SRC = os/sunos_usb.c os/sunos_usb.h
|
||||
WINDOWS_COMMON_SRC = os/windows_nt_common.h os/windows_nt_common.c \
|
||||
os/windows_common.h libusb-1.0.rc libusb-1.0.def
|
||||
WINDOWS_USB_SRC = os/windows_winusb.h os/windows_winusb.c os/windows_usbdk.h \
|
||||
os/windows_usbdk.c $(COMMON_WINDOWS_SRC)
|
||||
WINDOWS_USB_SRC = libusb-1.0.def libusb-1.0.rc \
|
||||
os/windows_common.h \
|
||||
os/windows_nt_common.h os/windows_nt_common.c \
|
||||
os/windows_nt_shared_types.h \
|
||||
os/windows_usbdk.h os/windows_usbdk.c \
|
||||
os/windows_winusb.h os/windows_winusb.c
|
||||
WINCE_USB_SRC = os/wince_usb.h os/wince_usb.c
|
||||
HAIKU_USB_SRC = os/haiku_usb.h os/haiku_usb_backend.cpp \
|
||||
os/haiku_usb_raw.h os/haiku_usb_raw.cpp os/haiku_pollfs.cpp
|
||||
@@ -25,8 +27,8 @@ EXTRA_DIST = $(POSIX_POLL_SRC) $(POSIX_THREADS_SRC) \
|
||||
$(WINDOWS_POLL_SRC) $(WINDOWS_THREADS_SRC) \
|
||||
$(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) \
|
||||
$(OPENBSD_USB_SRC) $(NETBSD_USB_SRC) \
|
||||
$(WINDOWS_COMMON_SRC) $(WINDOWS_USB_SRC) $(WINDOWS_USBDK_SRC) \
|
||||
$(WINCE_USB_SRC) $(HAIKU_USB_SRC) \
|
||||
$(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \
|
||||
$(HAIKU_USB_SRC) \
|
||||
os/linux_udev.c os/linux_netlink.c
|
||||
|
||||
if OS_LINUX
|
||||
@@ -63,7 +65,7 @@ libusb_1_0_la_LIBADD = libusb_haiku.la
|
||||
endif
|
||||
|
||||
if OS_WINDOWS
|
||||
OS_SRC = $(WINDOWS_USB_SRC) $(WINDOWS_COMMON_SRC)
|
||||
OS_SRC = $(WINDOWS_USB_SRC)
|
||||
|
||||
.rc.lo:
|
||||
$(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@
|
||||
|
||||
Vendored
+432
-251
File diff suppressed because it is too large
Load Diff
Vendored
+27
-25
@@ -62,7 +62,7 @@ int usbi_parse_descriptor(const unsigned char *source, const char *descriptor,
|
||||
if (host_endian) {
|
||||
memcpy(dp, sp, 2);
|
||||
} else {
|
||||
w = (sp[1] << 8) | sp[0];
|
||||
w = (uint16_t)((sp[1] << 8) | sp[0]);
|
||||
*((uint16_t *)dp) = w;
|
||||
}
|
||||
sp += 2;
|
||||
@@ -74,8 +74,8 @@ int usbi_parse_descriptor(const unsigned char *source, const char *descriptor,
|
||||
if (host_endian) {
|
||||
memcpy(dp, sp, 4);
|
||||
} else {
|
||||
d = (sp[3] << 24) | (sp[2] << 16) |
|
||||
(sp[1] << 8) | sp[0];
|
||||
d = (uint32_t)((sp[3] << 24) | (sp[2] << 16) |
|
||||
(sp[1] << 8) | sp[0]);
|
||||
*((uint32_t *)dp) = d;
|
||||
}
|
||||
sp += 4;
|
||||
@@ -168,13 +168,13 @@ static int parse_endpoint(struct libusb_context *ctx,
|
||||
/* Copy any unknown descriptors into a storage area for drivers */
|
||||
/* to later parse */
|
||||
len = (int)(buffer - begin);
|
||||
if (!len) {
|
||||
if (len <= 0) {
|
||||
endpoint->extra = NULL;
|
||||
endpoint->extra_length = 0;
|
||||
return parsed;
|
||||
}
|
||||
|
||||
extra = malloc(len);
|
||||
extra = malloc((size_t)len);
|
||||
endpoint->extra = extra;
|
||||
if (!extra) {
|
||||
endpoint->extra_length = 0;
|
||||
@@ -230,7 +230,7 @@ static int parse_interface(libusb_context *ctx,
|
||||
(struct libusb_interface_descriptor *) usb_interface->altsetting;
|
||||
altsetting = usbi_reallocf(altsetting,
|
||||
sizeof(struct libusb_interface_descriptor) *
|
||||
(usb_interface->num_altsetting + 1));
|
||||
((size_t)usb_interface->num_altsetting + 1));
|
||||
if (!altsetting) {
|
||||
r = LIBUSB_ERROR_NO_MEM;
|
||||
goto err;
|
||||
@@ -307,8 +307,8 @@ static int parse_interface(libusb_context *ctx,
|
||||
/* Copy any unknown descriptors into a storage area for */
|
||||
/* drivers to later parse */
|
||||
len = (int)(buffer - begin);
|
||||
if (len) {
|
||||
ifp->extra = malloc(len);
|
||||
if (len > 0) {
|
||||
ifp->extra = malloc((size_t)len);
|
||||
if (!ifp->extra) {
|
||||
r = LIBUSB_ERROR_NO_MEM;
|
||||
goto err;
|
||||
@@ -333,7 +333,7 @@ static int parse_interface(libusb_context *ctx,
|
||||
goto err;
|
||||
if (r == 0) {
|
||||
ifp->bNumEndpoints = (uint8_t)i;
|
||||
break;;
|
||||
break;
|
||||
}
|
||||
|
||||
buffer += r;
|
||||
@@ -453,10 +453,10 @@ static int parse_configuration(struct libusb_context *ctx,
|
||||
/* Copy any unknown descriptors into a storage area for */
|
||||
/* drivers to later parse */
|
||||
len = (int)(buffer - begin);
|
||||
if (len) {
|
||||
if (len > 0) {
|
||||
/* FIXME: We should realloc and append here */
|
||||
if (!config->extra_length) {
|
||||
config->extra = malloc(len);
|
||||
config->extra = malloc((size_t)len);
|
||||
if (!config->extra) {
|
||||
r = LIBUSB_ERROR_NO_MEM;
|
||||
goto err;
|
||||
@@ -492,7 +492,7 @@ static int raw_desc_to_config(struct libusb_context *ctx,
|
||||
{
|
||||
struct libusb_config_descriptor *_config = malloc(sizeof(*_config));
|
||||
int r;
|
||||
|
||||
|
||||
if (!_config)
|
||||
return LIBUSB_ERROR_NO_MEM;
|
||||
|
||||
@@ -504,7 +504,7 @@ static int raw_desc_to_config(struct libusb_context *ctx,
|
||||
} else if (r > 0) {
|
||||
usbi_warn(ctx, "still %d bytes of descriptor data left", r);
|
||||
}
|
||||
|
||||
|
||||
*config = _config;
|
||||
return LIBUSB_SUCCESS;
|
||||
}
|
||||
@@ -513,7 +513,7 @@ int usbi_device_cache_descriptor(libusb_device *dev)
|
||||
{
|
||||
int r, host_endian = 0;
|
||||
|
||||
r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor,
|
||||
r = usbi_backend.get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor,
|
||||
&host_endian);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@@ -572,7 +572,7 @@ int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev,
|
||||
int host_endian = 0;
|
||||
int r;
|
||||
|
||||
r = usbi_backend->get_active_config_descriptor(dev, tmp,
|
||||
r = usbi_backend.get_active_config_descriptor(dev, tmp,
|
||||
LIBUSB_DT_CONFIG_SIZE, &host_endian);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@@ -587,7 +587,7 @@ int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev,
|
||||
if (!buf)
|
||||
return LIBUSB_ERROR_NO_MEM;
|
||||
|
||||
r = usbi_backend->get_active_config_descriptor(dev, buf,
|
||||
r = usbi_backend.get_active_config_descriptor(dev, buf,
|
||||
_config.wTotalLength, &host_endian);
|
||||
if (r >= 0)
|
||||
r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config);
|
||||
@@ -625,7 +625,7 @@ int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev,
|
||||
if (config_index >= dev->num_configurations)
|
||||
return LIBUSB_ERROR_NOT_FOUND;
|
||||
|
||||
r = usbi_backend->get_config_descriptor(dev, config_index, tmp,
|
||||
r = usbi_backend.get_config_descriptor(dev, config_index, tmp,
|
||||
LIBUSB_DT_CONFIG_SIZE, &host_endian);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@@ -640,7 +640,7 @@ int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev,
|
||||
if (!buf)
|
||||
return LIBUSB_ERROR_NO_MEM;
|
||||
|
||||
r = usbi_backend->get_config_descriptor(dev, config_index, buf,
|
||||
r = usbi_backend.get_config_descriptor(dev, config_index, buf,
|
||||
_config.wTotalLength, &host_endian);
|
||||
if (r >= 0)
|
||||
r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config);
|
||||
@@ -663,7 +663,7 @@ int usbi_get_config_index_by_value(struct libusb_device *dev,
|
||||
for (i = 0; i < dev->num_configurations; i++) {
|
||||
unsigned char tmp[6];
|
||||
int host_endian;
|
||||
int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp),
|
||||
int r = usbi_backend.get_config_descriptor(dev, i, tmp, sizeof(tmp),
|
||||
&host_endian);
|
||||
if (r < 0) {
|
||||
*idx = -1;
|
||||
@@ -702,8 +702,8 @@ int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev,
|
||||
int r, idx, host_endian;
|
||||
unsigned char *buf = NULL;
|
||||
|
||||
if (usbi_backend->get_config_descriptor_by_value) {
|
||||
r = usbi_backend->get_config_descriptor_by_value(dev,
|
||||
if (usbi_backend.get_config_descriptor_by_value) {
|
||||
r = usbi_backend.get_config_descriptor_by_value(dev,
|
||||
bConfigurationValue, &buf, &host_endian);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@@ -1060,7 +1060,8 @@ int API_EXPORTED libusb_get_ss_usb_device_capability_descriptor(
|
||||
* It is safe to call this function with a NULL ss_usb_device_cap
|
||||
* parameter, in which case the function simply returns.
|
||||
*
|
||||
* \param ss_usb_device_cap the USB 2.0 Extension descriptor to free
|
||||
* \param ss_usb_device_cap the SuperSpeed USB Device Capability descriptor
|
||||
* to free
|
||||
*/
|
||||
void API_EXPORTED libusb_free_ss_usb_device_capability_descriptor(
|
||||
struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap)
|
||||
@@ -1117,7 +1118,7 @@ int API_EXPORTED libusb_get_container_id_descriptor(struct libusb_context *ctx,
|
||||
* It is safe to call this function with a NULL container_id parameter,
|
||||
* in which case the function simply returns.
|
||||
*
|
||||
* \param container_id the USB 2.0 Extension descriptor to free
|
||||
* \param container_id the Container ID descriptor to free
|
||||
*/
|
||||
void API_EXPORTED libusb_free_container_id_descriptor(
|
||||
struct libusb_container_id_descriptor *container_id)
|
||||
@@ -1163,7 +1164,7 @@ int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_ha
|
||||
if (r < 4)
|
||||
return LIBUSB_ERROR_IO;
|
||||
|
||||
langid = tbuf[2] | (tbuf[3] << 8);
|
||||
langid = (uint16_t)(tbuf[2] | (tbuf[3] << 8));
|
||||
|
||||
r = libusb_get_string_descriptor(dev_handle, desc_index, langid, tbuf,
|
||||
sizeof(tbuf));
|
||||
@@ -1176,7 +1177,8 @@ int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_ha
|
||||
if (tbuf[0] > r)
|
||||
return LIBUSB_ERROR_IO;
|
||||
|
||||
for (di = 0, si = 2; si < tbuf[0]; si += 2) {
|
||||
di = 0;
|
||||
for (si = 2; si < tbuf[0]; si += 2) {
|
||||
if (di >= (length - 1))
|
||||
break;
|
||||
|
||||
|
||||
Vendored
+73
-50
@@ -154,36 +154,30 @@ int main (void) {
|
||||
\endcode
|
||||
*/
|
||||
|
||||
static int usbi_hotplug_match_cb (struct libusb_context *ctx,
|
||||
static int usbi_hotplug_match_cb(struct libusb_context *ctx,
|
||||
struct libusb_device *dev, libusb_hotplug_event event,
|
||||
struct libusb_hotplug_callback *hotplug_cb)
|
||||
{
|
||||
/* Handle lazy deregistration of callback */
|
||||
if (hotplug_cb->needs_free) {
|
||||
/* Free callback */
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!(hotplug_cb->events & event)) {
|
||||
if (!(hotplug_cb->flags & event)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->vendor_id &&
|
||||
if ((hotplug_cb->flags & USBI_HOTPLUG_VENDOR_ID_VALID) &&
|
||||
hotplug_cb->vendor_id != dev->device_descriptor.idVendor) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->product_id &&
|
||||
if ((hotplug_cb->flags & USBI_HOTPLUG_PRODUCT_ID_VALID) &&
|
||||
hotplug_cb->product_id != dev->device_descriptor.idProduct) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->dev_class &&
|
||||
if ((hotplug_cb->flags & USBI_HOTPLUG_DEV_CLASS_VALID) &&
|
||||
hotplug_cb->dev_class != dev->device_descriptor.bDeviceClass) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return hotplug_cb->cb (ctx, dev, event, hotplug_cb->user_data);
|
||||
return hotplug_cb->cb(ctx, dev, event, hotplug_cb->user_data);
|
||||
}
|
||||
|
||||
void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
@@ -195,8 +189,13 @@ void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
usbi_mutex_lock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) {
|
||||
if (hotplug_cb->flags & USBI_HOTPLUG_NEEDS_FREE) {
|
||||
/* process deregistration in usbi_hotplug_deregister() */
|
||||
continue;
|
||||
}
|
||||
|
||||
usbi_mutex_unlock(&ctx->hotplug_cbs_lock);
|
||||
ret = usbi_hotplug_match_cb (ctx, dev, event, hotplug_cb);
|
||||
ret = usbi_hotplug_match_cb(ctx, dev, event, hotplug_cb);
|
||||
usbi_mutex_lock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
if (ret) {
|
||||
@@ -206,15 +205,13 @@ void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,
|
||||
}
|
||||
|
||||
usbi_mutex_unlock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
/* 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));
|
||||
struct libusb_hotplug_message *message = calloc(1, sizeof(*message));
|
||||
|
||||
if (!message) {
|
||||
usbi_err(ctx, "error allocating hotplug message");
|
||||
@@ -240,59 +237,70 @@ int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx,
|
||||
libusb_hotplug_callback_fn cb_fn, void *user_data,
|
||||
libusb_hotplug_callback_handle *callback_handle)
|
||||
{
|
||||
libusb_hotplug_callback *new_callback;
|
||||
static int handle_id = 1;
|
||||
|
||||
/* check for hotplug support */
|
||||
if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
|
||||
return LIBUSB_ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
struct libusb_hotplug_callback *new_callback;
|
||||
|
||||
/* check for sane values */
|
||||
if ((LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) ||
|
||||
if ((!events || (~(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) & events)) ||
|
||||
(flags && (~LIBUSB_HOTPLUG_ENUMERATE & flags)) ||
|
||||
(LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) ||
|
||||
(LIBUSB_HOTPLUG_MATCH_ANY != product_id && (~0xffff & product_id)) ||
|
||||
(LIBUSB_HOTPLUG_MATCH_ANY != dev_class && (~0xff & dev_class)) ||
|
||||
!cb_fn) {
|
||||
return LIBUSB_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
/* check for hotplug support */
|
||||
if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
|
||||
return LIBUSB_ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
USBI_GET_CONTEXT(ctx);
|
||||
|
||||
new_callback = (libusb_hotplug_callback *)calloc(1, sizeof (*new_callback));
|
||||
new_callback = calloc(1, sizeof(*new_callback));
|
||||
if (!new_callback) {
|
||||
return LIBUSB_ERROR_NO_MEM;
|
||||
}
|
||||
|
||||
new_callback->ctx = ctx;
|
||||
new_callback->vendor_id = vendor_id;
|
||||
new_callback->product_id = product_id;
|
||||
new_callback->dev_class = dev_class;
|
||||
new_callback->flags = flags;
|
||||
new_callback->events = events;
|
||||
new_callback->flags = (uint8_t)events;
|
||||
if (LIBUSB_HOTPLUG_MATCH_ANY != vendor_id) {
|
||||
new_callback->flags |= USBI_HOTPLUG_VENDOR_ID_VALID;
|
||||
new_callback->vendor_id = (uint16_t)vendor_id;
|
||||
}
|
||||
if (LIBUSB_HOTPLUG_MATCH_ANY != product_id) {
|
||||
new_callback->flags |= USBI_HOTPLUG_PRODUCT_ID_VALID;
|
||||
new_callback->product_id = (uint16_t)product_id;
|
||||
}
|
||||
if (LIBUSB_HOTPLUG_MATCH_ANY != dev_class) {
|
||||
new_callback->flags |= USBI_HOTPLUG_DEV_CLASS_VALID;
|
||||
new_callback->dev_class = (uint8_t)dev_class;
|
||||
}
|
||||
new_callback->cb = cb_fn;
|
||||
new_callback->user_data = user_data;
|
||||
new_callback->needs_free = 0;
|
||||
|
||||
usbi_mutex_lock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
/* protect the handle by the context hotplug lock. it doesn't matter if the same handle
|
||||
* is used for different contexts only that the handle is unique for this context */
|
||||
new_callback->handle = handle_id++;
|
||||
/* protect the handle by the context hotplug lock */
|
||||
new_callback->handle = ctx->next_hotplug_cb_handle++;
|
||||
|
||||
/* handle the unlikely case of overflow */
|
||||
if (ctx->next_hotplug_cb_handle < 0)
|
||||
ctx->next_hotplug_cb_handle = 1;
|
||||
|
||||
list_add(&new_callback->list, &ctx->hotplug_cbs);
|
||||
|
||||
usbi_mutex_unlock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
usbi_dbg("new hotplug cb %p with handle %d", new_callback, new_callback->handle);
|
||||
|
||||
if (flags & LIBUSB_HOTPLUG_ENUMERATE) {
|
||||
int i, len;
|
||||
if ((flags & LIBUSB_HOTPLUG_ENUMERATE) && (events & LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED)) {
|
||||
ssize_t i, len;
|
||||
struct libusb_device **devs;
|
||||
|
||||
len = (int) libusb_get_device_list(ctx, &devs);
|
||||
len = libusb_get_device_list(ctx, &devs);
|
||||
if (len < 0) {
|
||||
libusb_hotplug_deregister_callback(ctx,
|
||||
new_callback->handle);
|
||||
return len;
|
||||
return (int)len;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
@@ -311,10 +319,11 @@ int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx,
|
||||
return LIBUSB_SUCCESS;
|
||||
}
|
||||
|
||||
void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx,
|
||||
void API_EXPORTED libusb_hotplug_deregister_callback(struct libusb_context *ctx,
|
||||
libusb_hotplug_callback_handle callback_handle)
|
||||
{
|
||||
struct libusb_hotplug_callback *hotplug_cb;
|
||||
int deregistered = 0;
|
||||
|
||||
/* check for hotplug support */
|
||||
if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
|
||||
@@ -323,28 +332,42 @@ void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx
|
||||
|
||||
USBI_GET_CONTEXT(ctx);
|
||||
|
||||
usbi_dbg("deregister hotplug cb %d", callback_handle);
|
||||
|
||||
usbi_mutex_lock(&ctx->hotplug_cbs_lock);
|
||||
list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list,
|
||||
struct libusb_hotplug_callback) {
|
||||
list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) {
|
||||
if (callback_handle == hotplug_cb->handle) {
|
||||
/* Mark this callback for deregistration */
|
||||
hotplug_cb->needs_free = 1;
|
||||
hotplug_cb->flags |= USBI_HOTPLUG_NEEDS_FREE;
|
||||
deregistered = 1;
|
||||
}
|
||||
}
|
||||
usbi_mutex_unlock(&ctx->hotplug_cbs_lock);
|
||||
|
||||
usbi_hotplug_notification(ctx, NULL, 0);
|
||||
if (deregistered) {
|
||||
int pending_events;
|
||||
|
||||
usbi_mutex_lock(&ctx->event_data_lock);
|
||||
pending_events = usbi_pending_events(ctx);
|
||||
ctx->event_flags |= USBI_EVENT_HOTPLUG_CB_DEREGISTERED;
|
||||
if (!pending_events)
|
||||
usbi_signal_event(ctx);
|
||||
usbi_mutex_unlock(&ctx->event_data_lock);
|
||||
}
|
||||
}
|
||||
|
||||
void usbi_hotplug_deregister_all(struct libusb_context *ctx) {
|
||||
void usbi_hotplug_deregister(struct libusb_context *ctx, int forced)
|
||||
{
|
||||
struct libusb_hotplug_callback *hotplug_cb, *next;
|
||||
|
||||
usbi_mutex_lock(&ctx->hotplug_cbs_lock);
|
||||
list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list,
|
||||
struct libusb_hotplug_callback) {
|
||||
list_del(&hotplug_cb->list);
|
||||
free(hotplug_cb);
|
||||
list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) {
|
||||
if (forced || (hotplug_cb->flags & USBI_HOTPLUG_NEEDS_FREE)) {
|
||||
usbi_dbg("freeing hotplug cb %p with handle %d", hotplug_cb,
|
||||
hotplug_cb->handle);
|
||||
list_del(&hotplug_cb->list);
|
||||
free(hotplug_cb);
|
||||
}
|
||||
}
|
||||
|
||||
usbi_mutex_unlock(&ctx->hotplug_cbs_lock);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user