diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2026-03-07 07:26:52 +0100 |
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2026-03-07 07:26:52 +0100 |
| commit | 5035750647f1fc8c3588bcc12a11320dff51adaf (patch) | |
| tree | 23037e85979c5c8e834dbaacf44f8211efc0d842 | |
| parent | 8eb738b093d106bf54a2bfc9125dfd4eadb8efad (diff) | |
| download | usb-drivers-master.tar.gz usb-drivers-master.tar.xz usb-drivers-master.zip | |
elksmart-comm: detach any kernel driverHEADorigin/mastermaster
| -rw-r--r-- | elksmart-comm.c | 27 |
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; } |
