Refactor version detection into a function. Handle versions of form X.Y.Z as well as X.Y. Don't do workarounds for old kernels if version cannot be detected.
Clarify that a return value of zero means no packet was available.
Not sure how this got missed.
Executables should have never been in the repo to begin with.
Signed-off-by: Mario Kleiner <email@example.com>
"GNU Public License" does not exist. It is called "GNU General Public License", "GNU GPL" or simply "GPL".
On Mac OS X 10.8.x (Mountain Lion), if a device is connected, opened, then closed, then unplugged, subsequent calls to hid_enumerate() will still list the device (even though it's been unplugged). If the device is plugged in again, a second instance will show up in the list and often it will be impossible to open either. Github user TamToucan figured out that in hid_enumerate() if a call is made to IOHIDManagerSetDeviceMatching() before the call to IOHIDManagerCopyDevices() that this will clear the problem. Thanks to TamToucan for figuring this out.
Some build system dependencies were missing from the documentation.
This makes HIDAPI less noisy when used a git submodule. Signed-off-by: Spencer Oliver <firstname.lastname@example.org>
While triaging libusb bugs, I took an indepth look at: libusbx/libusbx#25 This has lead me to the conclusion that there are 2 issues with hidapi's libusb code wrt waiting for the transfer cancellation on read_thread() exit: 1) There is a race where hid_close() can successfully cancel the transfer after a read_callback() has submitted it but before read_thread() checks shutdown_thread. If this race is hit, then the libusb_cancel_transfer() in read_thread() will fail, causing read_thread() to not call libusb_handle_events() to complete the cancelled transfer. hid_close() will then free the transfer, and if later on libusb_handle_events() gets called on the same context, it will try to complete the now freed transfer. This is what I believe leads to the segfault described in libusbx/libusbx#25 2) hidapi uses one read_thread() per hid_device, so if there are multiple hid_devices then there are multiple threads calling libusb_handle_events(), in this case there is no guarantee that a single libusb_handle_events() call will successfully lead to the cancelled transfer being completed. If the transfer completion is already handled by another read_thread() and there are no other events, then the libusb_handle_events() call will hang, and thus the pthread_join() and thus hidapi_close() will hang. As number 2 is a generic problem found in more libusb apps, libusb has gotten a new API called libusb_handle_events_completed(), which takes an extra pointer to an int, whose contents must be set to nonzero on completion by the callback, which allows waiting for the completion of a specific transfer in a race-free manner. This patch switches the waiting for the transfer's final completion to using libusb_handle_events_completed(), thereby fixing both issues. Note the while is necessary since libusb_handle_events_completed(), like libusb_handle_events(), will return as soon as it has handled *any* event. The difference with libusb_handle_events_completed() is that once it has all the necessary internal libusb locks, it checks the contents of the completed parameter, and will bail if that has become nonzero without waiting for further events. Signed-off-by: Hans de Goede <email@example.com>
Create a new free_hid_device() function which takes care of all the resources in hid_device which may need to be freed/released. Reported-by: Johan Lindh <firstname.lastname@example.org>
Unregister from IOHIDManager instead of IOHIDDevice. Thanks to github user tomsor for noticing this.
It appears that calls to read() when in non-blocking mode will not set errno to other than EAGAIN when the a device has been disconnected. Note that this is the same errno code set when there is simply no data to return. Make it so that poll() is used, in non-blocking mode, to check the status of the device. In blocking mode though, poll() is not needed.
Some composite devices do not have bDeviceClass set to LIBUSB_CLASS_PER_INTERFACE and were ignored when enumerating HID devices. Ignore checking the bDeviceClass as we will be checking interface bInterfaceClass later anyway. Signed-off-by: Spencer Oliver <email@example.com>
Return NULL from hid_enumerate() and hid_open_path() if hid_init() fails.
Remove spaces and tabs at end of lines.
Passing product_id=0 will match any product of a given vendor. This patch makes it also possible to use vendor_id=0 to match any vendor for a given product id. Windows code added to Ludovic's patch by Alan Ott.
Improve logic of report length field handling for empty fields. Add column headers for data and length fields. Add documentation statement about length fields. Increase window size. Add message boxes when invalid values are entered. memset() buffers to zero.
Windows platforms return errors When you do not specify the proper buffer size and length.
Changed for readability, as I think this is what was intended by the author.
In get_device_string() serial_number_utf8 and product_name_utf8 could end up not getting freed if certain errors occurred.
Non-blocking I/O can cause read() to return EINPROGRESS in addition to EAGAIN. Handle this case.
Using locations makes the path the same for each run of a HIDAPI based program. This is useful for opening devices which don't have a serial number, and where multiple devices of the same type are attached to the system at once. This references pull request #78.
There were errors regarding the length of strings in conversion from CFString to wchar_t. Thanks to github user nikolajsheller for pointing this out in pull request #80.
Use kIOHIDOptionsTypeSeizeDevice instead of kIOHIDOptionsTypeNone to avoid interferences with other applications trying to use the HID device at the same time.
Use hid_init() in hidtest/hidtest.cpp
- use hid_init()/hid_exit() - include windows.h only on Windows
hid.c: In function 'uses_numbered_reports': hid.c:126:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] hid.c:143:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
linux/hid.c:83:13: warning: function declaration isn't a prototype [-Wstrict-prototypes] linux/hid.c: In function 'new_hid_device': linux/hid.c:83:13: warning: old-style function definition [-Wold-style-definition]