aboutsummaryrefslogtreecommitdiff
path: root/elksmart-comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'elksmart-comm.c')
-rw-r--r--elksmart-comm.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/elksmart-comm.c b/elksmart-comm.c
index 3aeec34..1e281cc 100644
--- a/elksmart-comm.c
+++ b/elksmart-comm.c
@@ -306,20 +306,25 @@ init_device_from_desc(struct libusb_config_descriptor *desc, struct error **e)
static bool
init_device(libusb_device_handle *device, struct error **e)
{
- struct libusb_config_descriptor *desc = NULL;
- int result =
- libusb_get_active_config_descriptor(libusb_get_device(device), &desc);
- if (result)
+ int result = libusb_kernel_driver_active(device, USB_INTERFACE);
+ if (result == 1) {
+ // macOS for some reason claims the interface and we need to detach it
+ // before the following call to libusb_get_active_config_descriptor().
+ if ((result = libusb_detach_kernel_driver(device, USB_INTERFACE)))
+ return error_set(e, "cannot detach kernel driver: %s",
+ libusb_strerror(result));
+
+ print_debug("detached the kernel driver");
+ } else if (result) {
return error_set(e, "%s", libusb_strerror(result));
+ }
- bool ok = true;
- if ((result = libusb_kernel_driver_active(device, USB_INTERFACE)) == 1)
- ok = error_set(e, "device is claimed by a kernel driver");
- else if (result)
- ok = error_set(e, "%s", libusb_strerror(result));
- else
- ok = init_device_from_desc(desc, e);
+ struct libusb_config_descriptor *desc = NULL;
+ if ((result = libusb_get_active_config_descriptor(
+ libusb_get_device(device), &desc)))
+ return error_set(e, "%s", libusb_strerror(result));
+ bool ok = init_device_from_desc(desc, e);
libusb_free_config_descriptor(desc);
return ok;
}