linux: Filter hotplug events by DEVTYPE of "usb_device"
authorChris Dickens <christopher.a.dickens@gmail.com>
Fri, 18 Sep 2015 05:27:20 +0000 (22:27 -0700)
committerChris Dickens <christopher.a.dickens@gmail.com>
Sun, 20 Sep 2015 21:48:33 +0000 (14:48 -0700)
Many different hotplug events can occur for the "usb" subsystem
(e.g. attaching/detaching a class driver), but libusb only needs
to care about events where the device type is "usb_device". All
other events cause needless attempts to lookup the device address,
which will fail as the paths for such events do not correspond to
actual USB device nodes.

Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
libusb/os/linux_netlink.c
libusb/os/linux_udev.c
libusb/version_nano.h

index 7a305616dcfd9bffaae98569f389f4203b8f7c9b..72d3589e541d45169e734152ee14abe24eade4f0 100644 (file)
@@ -222,6 +222,13 @@ static int linux_netlink_parse(char *buffer, size_t len, int *detached, const ch
                return -1;
        }
 
+       /* check that this is an actual usb device */
+       tmp = netlink_message_parse(buffer, len, "DEVTYPE");
+       if (NULL == tmp || 0 != strcmp(tmp, "usb_device")) {
+               /* not usb. ignore */
+               return -1;
+       }
+
        tmp = netlink_message_parse(buffer, len, "BUSNUM");
        if (NULL == tmp) {
                /* no bus number. try "DEVICE" */
index 6577240f174293c9167dd879e348157d48590479..b63db98429ae4fa97447e9cb9d17b298d3af2b86 100644 (file)
@@ -69,7 +69,7 @@ int linux_udev_start_event_monitor(void)
                goto err_free_ctx;
        }
 
-       r = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", 0);
+       r = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", "usb_device");
        if (r) {
                usbi_err(NULL, "could not initialize udev monitor filter for \"usb\" subsystem");
                goto err_free_monitor;
@@ -266,6 +266,7 @@ int linux_udev_scan_devices(struct libusb_context *ctx)
        }
 
        udev_enumerate_add_match_subsystem(enumerator, "usb");
+       udev_enumerate_add_match_property(enumerator, "DEVTYPE", "usb_device");
        udev_enumerate_scan_devices(enumerator);
        devices = udev_enumerate_get_list_entry(enumerator);
 
index 3adf53e2967caef5e3bb86a622b0924807a46812..112b99fc4c4186da261564ccab26733ada789c47 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11007
+#define LIBUSB_NANO 11008