New NO_DEVICE_DISCOVERY option to replace WEAK_AUTHORITY option
authorTormod Volden <debian.tormod@gmail.com>
Tue, 15 Jun 2021 20:33:45 +0000 (22:33 +0200)
committerNathan Hjelm <hjelmn@google.com>
Fri, 9 Jul 2021 03:53:46 +0000 (21:53 -0600)
The option disables device enumeration (and hotplug, which depends on
enumeration). Since this has a much broader usage scope than "weak
authority", give the option a name reflecting what it does.

For now, keep the old option name working as an alias.

Closes #935

Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
Signed-off-by: Nathan Hjelm <hjelmn@google.com>
libusb/core.c
libusb/libusb.h
libusb/os/linux_usbfs.c
libusb/version_nano.h

index 054bc6ae5c8a2eab84444c37e345ae06d7b5ba46..0cdc960c9d61cd7d7bd3d839824674072effd337 100644 (file)
@@ -1205,8 +1205,10 @@ void API_EXPORTED libusb_unref_device(libusb_device *dev)
  * handle for the underlying device. The handle allows you to use libusb to
  * perform I/O on the device in question.
  *
- * Must call libusb_set_option(NULL, LIBUSB_OPTION_WEAK_AUTHORITY)
- * before libusb_init if don't have authority to access the usb device directly.
+ * Call libusb_set_option(NULL, LIBUSB_OPTION_NO_DEVICE_DISCOVERY) before
+ * libusb_init() if you want to skip enumeration of USB devices. In particular,
+ * this might be needed on Android if you don't have authority to access USB
+ * devices in general.
  *
  * On Linux, the system device handle must be a valid file descriptor opened
  * on the device node.
@@ -2219,6 +2221,7 @@ int API_EXPORTED libusb_set_option(libusb_context *ctx,
 
                /* Handle all backend-specific options here */
        case LIBUSB_OPTION_USE_USBDK:
+       case LIBUSB_OPTION_NO_DEVICE_DISCOVERY:
        case LIBUSB_OPTION_WEAK_AUTHORITY:
                if (usbi_backend.set_option)
                        return usbi_backend.set_option(ctx, option, ap);
index c9581133c067a933fe17989e3b52b82f1cc3405d..5ea699f99d1921a24c85b57aa03429b8e0a66346 100644 (file)
@@ -2098,20 +2098,30 @@ enum libusb_option {
         */
        LIBUSB_OPTION_USE_USBDK = 1,
 
-       /** Flag that libusb has weak authority.
+       /** Do not scan for devices
         *
         * With this option set, libusb will skip scanning devices in
-        * libusb_init().
+        * libusb_init(). Must be set before calling libusb_init().
+        *
+        * Hotplug functionality will also be deactivated.
         *
-        * This option should be set before calling libusb_init(), otherwise
-        * libusb_init() might fail. The option is typically needed on Android
-        * and used together with libusb_wrap_sys_device().
+        * The option is useful in combination with libusb_wrap_sys_device(),
+        * which can access a device directly without prior device scanning.
+        *
+        * This is typically needed on Android, where access to USB devices
+        * is limited.
         *
         * Only valid on Linux.
         */
-       LIBUSB_OPTION_WEAK_AUTHORITY = 2,
+       LIBUSB_OPTION_NO_DEVICE_DISCOVERY = 2,
+
+       /** Flag that libusb has weak authority.
+        *
+        * (Deprecated) alias for LIBUSB_OPTION_NO_DEVICE_DISCOVERY
+        */
+       LIBUSB_OPTION_WEAK_AUTHORITY = 3,
 
-       LIBUSB_OPTION_MAX = 3
+       LIBUSB_OPTION_MAX = 4
 };
 
 int LIBUSB_CALL libusb_set_option(libusb_context *ctx, enum libusb_option option, ...);
index 944acdb4a57251b0e3d93678115a2d7b84e2006c..c250632fa0be629abd234124f83531299ef1830f 100644 (file)
@@ -96,7 +96,7 @@ static int sysfs_available = -1;
 static int init_count = 0;
 
 /* have no authority to operate usb device directly */
-static int weak_authority = 0;
+static int no_enumeration = 0;
 
 /* Serialize scan-devices, event-thread, and poll */
 usbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER;
@@ -397,7 +397,7 @@ static int op_init(struct libusb_context *ctx)
                }
        }
 
-       if (weak_authority) {
+       if (no_enumeration) {
                return LIBUSB_SUCCESS;
        }
 
@@ -423,7 +423,7 @@ static void op_exit(struct libusb_context *ctx)
 {
        UNUSED(ctx);
 
-       if (weak_authority) {
+       if (no_enumeration) {
                return;
        }
 
@@ -439,9 +439,10 @@ static int op_set_option(struct libusb_context *ctx, enum libusb_option option,
        UNUSED(ctx);
        UNUSED(ap);
 
-       if (option == LIBUSB_OPTION_WEAK_AUTHORITY) {
-               usbi_dbg("set libusb has weak authority");
-               weak_authority = 1;
+       if (option == LIBUSB_OPTION_NO_DEVICE_DISCOVERY ||
+           option == LIBUSB_OPTION_WEAK_AUTHORITY) {
+               usbi_dbg("no enumeration will be performed");
+               no_enumeration = 1;
                return LIBUSB_SUCCESS;
        }
 
index b2f7e4a42dfe6cb343e7bf4b5cd9813f37dc44b3..6be812c5bf389a45ecf146e19180d49d1e69dfe8 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11632
+#define LIBUSB_NANO 11633