[Spice-devel] [PATCH spice-gtk] channel-usbredir: Handle some more usbredirhost_read_guest_data errors

Hans de Goede hdegoede at redhat.com
Tue Mar 6 10:30:55 PST 2012


Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 configure.ac           |    2 +-
 gtk/channel-usbredir.c |   23 ++++++++++++++++++++---
 gtk/spice-client.h     |    2 ++
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/configure.ac b/configure.ac
index 1d24773..13f33e6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -346,7 +346,7 @@ if test "x$enable_usbredir" = "xno"; then
   have_usbredir="no"
 else
   PKG_CHECK_MODULES([USBREDIR],
-                    [gudev-1.0 libusb-1.0 >= 1.0.9 libusbredirhost >= 0.4 libusbredirparser >= 0.4],
+                    [gudev-1.0 libusb-1.0 >= 1.0.9 libusbredirhost >= 0.4.2 libusbredirparser >= 0.4],
                     [have_usbredir=yes],
                     [have_usbredir=no])
   if test "x$have_usbredir" = "xno" && test "x$enable_usbredir" = "xyes"; then
diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c
index eb81fe5..dec6c4a 100644
--- a/gtk/channel-usbredir.c
+++ b/gtk/channel-usbredir.c
@@ -606,7 +606,7 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in)
     priv->read_buf_size = size;
 
     r = usbredirhost_read_guest_data(priv->host);
-    if (r == usbredirhost_read_device_rejected) {
+    if (r != 0) {
         libusb_device *device = priv->device;
         gchar *desc;
         GError *err;
@@ -615,8 +615,25 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in)
 
         desc = spice_usb_device_get_description((SpiceUsbDevice *)device,
                                                 NULL);
-        err  = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
-                           "%s rejected by host", desc);
+        switch (r) {
+        case usbredirhost_read_parse_error:
+            err = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+                              "usbredir protocol parse error for %s", desc);
+            break;
+        case usbredirhost_read_device_rejected:
+            err = g_error_new(SPICE_CLIENT_ERROR,
+                              SPICE_CLIENT_USB_DEVICE_REJECTED,
+                              "%s rejected by host", desc);
+            break;
+        case usbredirhost_read_device_lost:
+            err = g_error_new(SPICE_CLIENT_ERROR,
+                              SPICE_CLIENT_USB_DEVICE_LOST,
+                              "%s disconnected (fatal IO error)", desc);
+            break;
+        default:
+            err = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+                              "Unknown error (%d) for %s", r, desc);
+        }
         g_free(desc);
 
         SPICE_DEBUG("%s", err->message);
diff --git a/gtk/spice-client.h b/gtk/spice-client.h
index 2d7c622..5c05ebb 100644
--- a/gtk/spice-client.h
+++ b/gtk/spice-client.h
@@ -58,6 +58,8 @@ G_BEGIN_DECLS
 typedef enum
 {
     SPICE_CLIENT_ERROR_FAILED,
+    SPICE_CLIENT_USB_DEVICE_REJECTED,
+    SPICE_CLIENT_USB_DEVICE_LOST,
 } SpiceClientError;
 
 GQuark spice_client_error_quark(void);
-- 
1.7.7.5



More information about the Spice-devel mailing list