[Spice-devel] [PATCHv3 spice-gtk 13/14] channel: add spice_channel_get_error()

Christophe Fergeau cfergeau at redhat.com
Tue Mar 11 05:05:46 PDT 2014


Hey,

On Mon, Feb 17, 2014 at 10:35:52PM +0100, Marc-André Lureau wrote:
> Add a function to retrieve the last GError from a channel, this may be
> useful to provide additional error details to the client.
> ---
>  doc/reference/spice-gtk-sections.txt |  1 +
>  gtk/map-file                         |  1 +
>  gtk/spice-channel-priv.h             |  1 +
>  gtk/spice-channel.c                  | 30 +++++++++++++++++++++++++++---
>  gtk/spice-channel.h                  |  2 ++
>  gtk/spice-glib-sym-file              |  1 +
>  gtk/spice-session-priv.h             |  2 +-
>  gtk/spice-session.c                  |  6 +++---
>  gtk/spicy.c                          |  6 ++++++
>  9 files changed, 43 insertions(+), 7 deletions(-)
> 
> diff --git a/doc/reference/spice-gtk-sections.txt b/doc/reference/spice-gtk-sections.txt
> index 411ca0e..9f0cf67 100644
> diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
> index 1b8ec10..a9c1076 100644
> --- a/gtk/spice-channel.c
> +++ b/gtk/spice-channel.c
>  static void *spice_channel_coroutine(void *data)
> @@ -2257,15 +2280,16 @@ static void *spice_channel_coroutine(void *data)
>  
>  
>  reconnect:
> -    c->conn = spice_session_channel_open_host(c->session, channel, &c->tls);
> +    c->conn = spice_session_channel_open_host(c->session, channel, &c->tls, &c->error);
>      if (c->conn == NULL) {
> -        if (!c->tls) {
> +        if (!c->error && !c->tls) {

This bit...

>              CHANNEL_DEBUG(channel, "trying with TLS port");
>              c->tls = true; /* FIXME: does that really work with provided fd */
>              goto reconnect;
>          } else {
>              CHANNEL_DEBUG(channel, "Connect error");
>              emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_CONNECT);
> +            g_clear_error(&c->error);
>              goto cleanup;
>          }
>      }
> diff --git a/gtk/spice-session.c b/gtk/spice-session.c
> index 19057bf..5e76b5f 100644
> --- a/gtk/spice-session.c
> +++ b/gtk/spice-session.c
> @@ -1845,8 +1845,8 @@ GSocketConnection* spice_session_channel_open_host(SpiceSession *session, SpiceC
>  #endif
>  
>      if (open_host.error != NULL) {
> -        g_warning("open host: %s", open_host.error->message);
> -        g_clear_error(&open_host.error);
> +        SPICE_DEBUG("open host: %s", open_host.error->message);
> +        g_propagate_error(error, open_host.error);

... and this bit are causing fallback to using a TLS connection to fail.
I've tested with -spice tls-port=5911,... on qemu command line, and
remote-viewer spice://localhost?port=5910&tls-port=5911 to start
remote-viewer. remote-viewer first tries to connect to the non-tls port
which fails with G_IO_ERROR_CONNECTION_REFUSED, and then we report the
error back to the user rather than falling back to TLS.

I'd go with something like

diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
index 632a286..56e1075 100644
--- a/gtk/spice-channel.c
+++ b/gtk/spice-channel.c
@@ -2276,7 +2276,17 @@ static void *spice_channel_coroutine(void *data)
 reconnect:
     c->conn = spice_session_channel_open_host(c->session, channel,
&c->tls, &c->error);
     if (c->conn == NULL) {
-        if (!c->error && !c->tls) {
+        gint tls_port;
+        g_object_get(G_OBJECT(c->session),
+                     "tls-port", &tls_port,
+                     NULL);
+        if (!c->tls && tls_port) {
+            if (c->error) {
+                CHANNEL_DEBUG(channel,
+                              "Ignoring connection error ('%s'), retrying
with TLS",
+                              c->error->message);
+                g_clear_error(&c->error);
+            }
             CHANNEL_DEBUG(channel, "trying with TLS port");
             c->tls = true; /* FIXME: does that really work with provided
fd */
             goto reconnect;

This avoids potentially losing the non-TLS error if remote-viewer is
started with only a non-TLS port. However, this will lose non-TLS
connection errors when starting QEMU with just a non-TLS port and starting
remote-viewer with both TLS and non-TLS ports.

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20140311/a6ad710a/attachment-0001.pgp>


More information about the Spice-devel mailing list