[Spice-devel] [PATCH 2/5] windows: fix device matching for non-WinUSB configurations
Kirill Moizik
kirill at daynix.com
Thu May 28 03:24:01 PDT 2015
From: Pavel Gurvich <pavel at daynix.com>
Match USB devices by bus addresses instead of VID/PID.
This makes system distinguish between similar devices plugged into
different USB ports.
Signed-off-by: Pavel Gurvich <pavel at daynix.com>
Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>
---
gtk/usb-device-manager.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c
index e1f03e2..7739337 100644
--- a/gtk/usb-device-manager.c
+++ b/gtk/usb-device-manager.c
@@ -668,10 +668,10 @@ static gboolean spice_usb_device_manager_get_udev_bus_n_address(
*bus = *address = 0;
-#ifndef G_OS_WIN32
+#ifndef USE_WINUSB
bus_str = g_udev_device_get_property(udev, "BUSNUM");
address_str = g_udev_device_get_property(udev, "DEVNUM");
-#else /* Windows -- request vid:pid instead */
+#else /* WinUSB -- request vid:pid instead */
bus_str = g_udev_device_get_property(udev, "VID");
address_str = g_udev_device_get_property(udev, "PID");
#endif
@@ -811,7 +811,7 @@ 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 */
+#ifndef USE_WINUSB /* match functions for non-WinUSB -- match by bus.addr */
static gboolean
spice_usb_device_manager_device_match(SpiceUsbDevice *device,
const int bus, const int address)
@@ -830,7 +830,7 @@ spice_usb_device_manager_libdev_match(libusb_device *libdev,
}
#endif
-#else /* Win32 -- match functions for Windows -- match by vid:pid */
+#else /* WinUSB -- match functions for WinUSB -- match by vid:pid */
static gboolean
spice_usb_device_manager_device_match(SpiceUsbDevice *device,
const int vid, const int pid)
@@ -1861,6 +1861,7 @@ spice_usb_device_equal_libdev(SpiceUsbDevice *device,
return info->libdev == libdev;
}
#else /* Windows -- compare vid:pid of device and libdev */
+#ifdef USE_WINUSB
static gboolean
spice_usb_device_equal_libdev(SpiceUsbDevice *device,
libusb_device *libdev)
@@ -1879,7 +1880,26 @@ spice_usb_device_equal_libdev(SpiceUsbDevice *device,
return ((vid1 == vid2) && (pid1 == pid2));
}
-#endif
+#else /* non-WinUSB -- compare bus:port of device and libdev */
+static gboolean
+spice_usb_device_equal_libdev(SpiceUsbDevice *device,
+ libusb_device *libdev)
+{
+ int busnum1, devaddr1, busnum2, devaddr2;
+
+ if ((device == NULL) || (libdev == NULL))
+ return FALSE;
+
+ busnum1 = spice_usb_device_get_busnum(device);
+ devaddr1 = spice_usb_device_get_devaddr(device);
+
+ busnum2 = libusb_get_bus_number(libdev);
+ devaddr2 = libusb_get_device_address(libdev);
+
+ return ((busnum1 == busnum2) && (devaddr1 == devaddr2));
+}
+#endif /* end of USE_WINUSB*/
+#endif /* end of G_OS_WIN32*/
/*
* Caller must libusb_unref_device the libusb_device returned by this function.
@@ -1906,9 +1926,14 @@ spice_usb_device_manager_device_to_libdev(SpiceUsbDeviceManager *self,
g_return_val_if_fail(self->priv != NULL, NULL);
g_return_val_if_fail(self->priv->context != NULL, NULL);
- /* On windows we match by vid / pid, since the address may change */
+#ifdef USE_WINUSB
+ /* For WinUSB we match by vid / pid, since the address may change */
bus = spice_usb_device_get_vid(device);
addr = spice_usb_device_get_pid(device);
+#else
+ bus = spice_usb_device_get_busnum(device);
+ addr = spice_usb_device_get_devaddr(device);
+#endif
libusb_get_device_list(self->priv->context, &devlist);
if (!devlist)
--
2.1.0
More information about the Spice-devel
mailing list