summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Fleytman <dmitry@daynix.com>2016-02-11 18:04:49 +0200
committerJonathon Jongsma <jjongsma@redhat.com>2016-03-24 11:00:01 -0500
commitbb42f8a41d7b6a9aec7744f15d8fab2e0d38687b (patch)
tree8d353520d5b5cb203a8752ec74ed188fd774519d
parentd6551c43d2e4ae627235e99a79b061e1dec9a4d5 (diff)
win-usbredir: Only match USB devices by VID:PID when WinUsb used
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@daynix.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
-rw-r--r--src/usb-device-manager.c80
1 files changed, 43 insertions, 37 deletions
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index a6b5e51..d719b03 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -122,6 +122,7 @@ struct _SpiceUsbDeviceManagerPrivate {
#ifdef G_OS_WIN32
SpiceWinUsbDriver *installer;
#endif
+ gboolean use_usbclerk;
#endif
GPtrArray *devices;
GPtrArray *channels;
@@ -219,6 +220,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,
@@ -1900,14 +1899,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