[Spice-devel] [PATCH v7 05/10] win-usbredir: Only match USB devices by VID:PID when WinUsb used

Dmitry Fleytman dmitry at daynix.com
Thu Feb 11 16:04:49 UTC 2016


In other cases match devices by BUS:ADDR.

This commit introduces use_usbclerk flag which is set TRUE
unconditionally for Windows builds for now. Next patches
will introduce UsbDk backend integrartion which will set
this flag in accordance to UsbDk presence on the system.

Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>
---
 src/usb-device-manager.c | 80 ++++++++++++++++++++++++++----------------------
 1 file changed, 43 insertions(+), 37 deletions(-)

diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index 69ad467..9a3df97 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -124,6 +124,7 @@ struct _SpiceUsbDeviceManagerPrivate {
 #ifdef G_OS_WIN32
     SpiceWinUsbDriver     *installer;
 #endif
+    gboolean               use_usbclerk;
 #endif
     GPtrArray *devices;
     GPtrArray *channels;
@@ -221,6 +222,9 @@ static void spice_usb_device_manager_init(SpiceUsbDeviceManager *self)
     priv = SPICE_USB_DEVICE_MANAGER_GET_PRIVATE(self);
     self->priv = priv;
 
+#if defined(G_OS_WIN32) && defined(USE_USBREDIR)
+    priv->use_usbclerk = TRUE;
+#endif
     priv->channels = g_ptr_array_new();
 #ifdef USE_USBREDIR
     priv->devices  = g_ptr_array_new_with_free_func((GDestroyNotify)
@@ -678,13 +682,15 @@ static gboolean spice_usb_device_manager_get_udev_bus_n_address(
 
     *bus = *address = 0;
 
-#ifndef G_OS_WIN32
-    bus_str = g_udev_device_get_property(udev, "BUSNUM");
-    address_str = g_udev_device_get_property(udev, "DEVNUM");
-#else /* Windows -- request vid:pid instead */
-    bus_str = g_udev_device_get_property(udev, "VID");
-    address_str = g_udev_device_get_property(udev, "PID");
-#endif
+    if (manager->priv->use_usbclerk) {
+       /* Windows WinUsb/UsbClerk -- request vid:pid instead */
+        bus_str = g_udev_device_get_property(udev, "VID");
+        address_str = g_udev_device_get_property(udev, "PID");
+    } else {
+       /* Linux or UsbDk backend on Windows*/
+        bus_str = g_udev_device_get_property(udev, "BUSNUM");
+        address_str = g_udev_device_get_property(udev, "DEVNUM");
+    }
     if (bus_str)
         *bus = atoi(bus_str);
     if (address_str)
@@ -823,13 +829,17 @@ static void spice_usb_device_manager_auto_connect_cb(GObject      *gobject,
     spice_usb_device_unref(device);
 }
 
-#ifndef G_OS_WIN32 /* match functions for Linux -- match by bus.addr */
 static gboolean
 spice_usb_device_manager_device_match(SpiceUsbDeviceManager *self, SpiceUsbDevice *device,
                                       const int bus, const int address)
 {
-    return (spice_usb_device_get_busnum(device) == bus &&
-            spice_usb_device_get_devaddr(device) == address);
+   if (self->priv->use_usbclerk) {
+        return (spice_usb_device_get_vid(device) == bus &&
+                spice_usb_device_get_pid(device) == address);
+    } else {
+        return (spice_usb_device_get_busnum(device) == bus &&
+                spice_usb_device_get_devaddr(device) == address);
+    }
 }
 
 #ifdef USE_GUDEV
@@ -837,32 +847,21 @@ static gboolean
 spice_usb_device_manager_libdev_match(SpiceUsbDeviceManager *self, libusb_device *libdev,
                                       const int bus, const int address)
 {
-    return (libusb_get_bus_number(libdev) == bus &&
-            libusb_get_device_address(libdev) == address);
-}
-#endif
-
-#else /* Win32 -- match functions for Windows -- match by vid:pid */
-static gboolean
-spice_usb_device_manager_device_match(SpiceUsbDeviceManager *self, SpiceUsbDevice *device,
-                                      const int vid, const int pid)
-{
-    return (spice_usb_device_get_vid(device) == vid &&
-            spice_usb_device_get_pid(device) == pid);
-}
+    if (self->priv->use_usbclerk) {
+        /* WinUSB -- match functions for Windows -- match by vid:pid */
+        int vid, pid;
 
-static gboolean
-spice_usb_device_manager_libdev_match(SpiceUsbDeviceManager *self, libusb_device *libdev,
-                                      const int vid, const int pid)
-{
-    int vid2, pid2;
-
-    if (!spice_usb_device_manager_get_libdev_vid_pid(libdev, &vid2, &pid2)) {
-        return FALSE;
+        if (!spice_usb_device_manager_get_libdev_vid_pid(libdev, &vid, &pid)) {
+            return FALSE;
+        }
+        return (bus == vid && address == pid);
+    } else {
+        /* match functions for Linux/UsbDk -- match by bus.addr */
+        return (libusb_get_bus_number(libdev) == bus &&
+                libusb_get_device_address(libdev) == address);
     }
-    return (vid == vid2 && pid == pid2);
 }
-#endif /* of Win32 -- match functions */
+#endif
 
 static SpiceUsbDevice*
 spice_usb_device_manager_find_device(SpiceUsbDeviceManager *self,
@@ -1911,14 +1910,21 @@ spice_usb_manager_device_equal_libdev(SpiceUsbDeviceManager *manager,
                                       SpiceUsbDevice *device,
                                       libusb_device  *libdev)
 {
-    int vid, pid;
+    int busnum, devaddr;
 
     if ((device == NULL) || (libdev == NULL))
         return FALSE;
 
-    vid = spice_usb_device_get_vid(device);
-    pid = spice_usb_device_get_pid(device);
-    return spice_usb_device_manager_libdev_match(manager, libdev, vid, pid);
+    if (manager->priv->use_usbclerk) {
+        busnum = spice_usb_device_get_vid(device);
+        devaddr = spice_usb_device_get_pid(device);
+    } else {
+        busnum = spice_usb_device_get_busnum(device);
+        devaddr = spice_usb_device_get_devaddr(device);
+    }
+
+    return spice_usb_device_manager_libdev_match(manager, libdev,
+                                                 busnum, devaddr);
 }
 #endif
 
-- 
2.5.0



More information about the Spice-devel mailing list