linux_udev: Log error code on pthread_create failure

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
hotplug: ensure udev monitor fd is non-blocking

Some older versions of udev do not automatically set the udev
monitor fd to non-blocking mode. This patch ensures that this is
always set.

HdG: Get flags then or in O_NONBLOCK and set them, rather then setting flags
to only O_NONBLOCK.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
libusb_get_bos_descriptor: Don't log an error on devices without a BOS

An error of LIBUSB_ERROR_PIPE simply means the device has no BOS, so don't
log an error to the console for this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
linux_udev: Join the hotplug-event-thread when we stop event monitoring

To ensure that it is stopped before we continue (and if later libusb
gets re-initialized start another thread).

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
linux_udev: Don't free the udev_monitor while the event thread may still use it

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
POSIX: Set usbi_pipe to non-blocking by oring O_NONBLOCK to fd flags.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
linux_udev: Fix spelling of guarantee in comment

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
libusb: Add auto-detach-kernel-driver functionality

Add auto-detach-kernel-driver functionality, and a
libusb_set_auto_detach_kernel_driver() function.

Note that I went with a libusb_set_auto_detach_kernel_driver() function,
rather then with a libusb_enable_auto_detach_kernel_driver(), so that apps
can also disable it again. This is necessary to handle 2 corner cases:

1) When an app wants to do a libusb_set_configuration after claiming 1 or
more interfaces, it needs to first release the interface(s), and in this
case libusb_release_interface() should *not* (re-)attach the kernel driver

2) Some usb classes use multiple interfaces for one function, ie usb-audio
devices do this. In this case attaching the driver will fail until all
interfaces are released, so the app should first release all interfaces, and
only then (re-)attach the kernel driver.

auto-detach-kernel-driver functionality is still useful for these apps, since
doing libusb_detach_kernel_driver() followed by libusb_claim_interface() in
2 separate calls is inherently racy, but they need to be able to disable the
auto-detach functionality before releasing interfaces to be able to properly
handle the 2 described corner cases.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
linux_usbfs: Add support for new disconnect-and-claim ioctl

Currently the linux_usbfs detach_kernel_driver_and_claim() helper function
makes 3 system calls:
1) IOCTL_USBFS_GETDRIVER, to check the driver is not usbfs
2) IOCTL_USBFS_DISCONNECT
3) IOCTL_USBFS_CLAIMINTF

Between each of these calls the state of the interface can change, and
things might not work as expected when it does, iow this is inherently racy.

To fix this a new IOCTL_USBFS_DISCONNECT_CLAIM ioctl has been added to the
kernel a while back, which does all 3 in one. This patch adds support for
this ioctl, with a fall back to the old method for kernels lacking this new
ioctl.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
linux_usbfs: Work around a driver binding race in reset handling

I've been seeing these intermittent failures to reclaim an interface after
a device reset. After much debugging and inserting sleeps in strategic
places to make the race window larger I've found the following race:
1) A user is running some software using libusbx which will automatically
   detect, and "bind" to, any newly plugged in USB-devices. For example
   a virtual machine viewer with automatic USB-redirection
2) The user plugs in a new usb-storage device
3) The usb-storage driver is not yet loaded, udev spawns
   "modprobe usb-storage", this blocks on disk-io
4) The libusbx app opens the device, claims all interfaces, does a device-reset
5) While the IOCTL_USBFS_RESET is running the modprobe completes
6) The driver registration blocks on an USB lock held by the reset code path
7) When the reset finishes the driver registration completes and the driver
   binds itself to the device, before IOCTL_USBFS_RESET returns to userspace
8) libusbx tries to re-claim all interfaces it had claimed before the reset
9) libusbx fails as usb-storage is now bound to it

This patch works around this issue by simply unbinding the driver for all
interfaces which were claimed before the reset. Normally this is a no-op as
no driver (other then usbfs) can be bound for claimed interfaces before the
reset.

This patch also improves the error logging, and makes libusb_device_reset
properly return an error when re-claiming fails.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
examples: use libusb_set_auto_detach_kernel_driver()

What better way to show how useful libusb_set_auto_detach_kernel_driver() is,
then to use it in our examples?

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Fix several -Wconversion warnings from GCC inside the static inline functions.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Core: fix compiler warning in libusb_setlocale()

Hello,

A small patch for:

strerror.c: In function 'libusb_setlocale':
strerror.c:148: warning: comparison between signed and unsigned
strerror.c:152: warning: comparison between signed and unsigned

--
 Dr. Ludovic Rousseau

From a4144845845cd0a06fb9074ba2d6669ece3a5b1a Mon Sep 17 00:00:00 2001
From: Ludovic Rousseau <ludovic.rousseau+github@gmail.com>
Date: Wed, 19 Jun 2013 13:16:31 +0200
Subject: [PATCH] Core: fix compiler warning in libusb_setlocale()

strerror.c: In function 'libusb_setlocale':
strerror.c:148: warning: comparison between signed and unsigned
strerror.c:152: warning: comparison between signed and unsigned

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Core: fix another compiler warning in libusb_setlocale()

* VS2012 (64 bit) produces the following in strerror.c(156):
  warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
Linux: Fix get_kernel_driver_active() when another app has claimed the interface

When another app has claimed the interface, IOCTL_USBFS_GETDRIVER will
succeed and report a driver of "usbfs" being attached.

Since this is not a regular kernel-driver (and detach_kernel_driver does
not detach it), get_kernel_driver_active() should return 0 in this case.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Use Android logging when building on Android

Closes #101

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Revert "Core: Don't wait for completion if cancel_transfer failed"

This reverts commit 2f5023c41d3176e56bf0abc521b7c5f8b1ac4664. 2f5023c4
was an attempt to fix: https://github.com/libusbx/libusbx/issues/76

As seen in: http://libusbx.1081486.n5.nabble.com/Libusbx-devel-libusb-interrupt-transfer-does-not-return-in-case-of-error-td626.html

[372849.680990] [0000275b] libusbx: error [reap_for_handle] reap failed error -1 errno=14
[372849.681752] [0000275b] libusbx: error [handle_events] backend handle_events failed with error -1
[372850.680466] [0000275b] libusbx: warning [handle_timeout] async cancel failed -5 errno=22

The problem begins with reap_for_handle failing with errno == 14, which is
EFAULT. So the real problem is the application passing in an invalid (or too
short) buffer, and thus is an application bug.

The fix masks this problem, but causes the problem of calling
libusb_transfer_free() on a non finished transfer, so it is no good.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Conflicts:
	AUTHORS
	libusb/version_nano.h
sync.c: Do not free an incompleted transfer

Before this patch the code in sync.c would free an incomplete transfer
when libusb_handle_events_completed exits with an error twice in a row.

But we should never free an incomplete transfer, otherwise we may end up
referencing free-ed memory later on.

This patch simply logs an error and keeps on trying until the transfer
completes.

Note that if libusb_handle_events_completed keeps throwing an error the
entire time, without ever completing the transfer, this patch effectively
replaces a potential crash / unspecified behavior, with an endless loop
and logging a ton of errors making clear what is going on.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
sync.c: Remove code duplication

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
autogen.sh: Honor NOCONFIGURE=1

See http://people.gnome.org/~walters/docs/build-api.txt

Hdg: I know this may seem unnecessary since we also have bootstrap.sh, but
the Gnome people are doing continues build testing of Gnome + dependencies
and having all autogen.sh scripts support NOCONFIGURE=1 makes live easier for
them. Note that in return we get "free" continues build-testing and patches
and / or a heads up when we break things.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>