summaryrefslogtreecommitdiffstats
path: root/src/virt-viewer.c
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2014-06-19 18:32:40 +0200
committerJonathon Jongsma <jjongsma@redhat.com>2015-01-06 15:38:09 -0600
commit5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6 (patch)
tree869a356da4ce2f77cdc2434f84f8419983249875 /src/virt-viewer.c
parentc2eb85c712ba4267202468d8d226d181f0d6bb30 (diff)
downloadvirt-viewer-5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6.tar.gz
virt-viewer-5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6.tar.xz
virt-viewer-5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6.zip
virt-viewer: Don't connect to localhost displays with qemu+tcp://
When connecting to a remote libvirt instance, a VM may only be listening on localhost for SPICE/VNC connections. In such a situation, virt-viewer then tries to connect to localhost, which is not correct as this 'localhost' referred to the remote libvirt host it connected to. This commit adds a couple of tests on the libvirt URI used and the <graphics> listen address to error out in this situation. Resolves: rhbz#1108523
Diffstat (limited to 'src/virt-viewer.c')
-rw-r--r--src/virt-viewer.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/virt-viewer.c b/src/virt-viewer.c
index 51e91c6..59fa257 100644
--- a/src/virt-viewer.c
+++ b/src/virt-viewer.c
@@ -334,6 +334,55 @@ virt_viewer_replace_host(const gchar *host)
return ret;
}
+
+static gboolean
+virt_viewer_is_loopback(const char *host)
+{
+ GInetAddress *addr = NULL;
+ gboolean is_loopback = FALSE;
+
+ g_return_val_if_fail(host != NULL, FALSE);
+
+ addr = g_inet_address_new_from_string(host);
+ if (!addr) /* Parsing error means it was probably a hostname */
+ return (strcmp(host, "localhost") == 0);
+
+ is_loopback = g_inet_address_get_is_loopback(addr);
+ g_object_unref(addr);
+
+ return is_loopback;
+}
+
+
+static gboolean
+virt_viewer_is_reachable(const gchar *host, const char *transport,
+ const char *transport_host)
+{
+ gboolean host_is_loopback;
+ gboolean transport_is_loopback;
+
+ if (!host)
+ return FALSE;
+
+ if (!transport)
+ return TRUE;
+
+ if (strcmp(transport, "ssh") == 0)
+ return TRUE;
+
+ if (strcmp(transport, "unix") == 0)
+ return TRUE;
+
+ host_is_loopback = virt_viewer_is_loopback(host);
+ transport_is_loopback = virt_viewer_is_loopback(transport_host);
+
+ if (transport_is_loopback && host_is_loopback)
+ return TRUE;
+ else
+ return !host_is_loopback;
+}
+
+
static gboolean
virt_viewer_extract_connect_info(VirtViewer *self,
virDomainPtr dom)
@@ -420,6 +469,14 @@ virt_viewer_extract_connect_info(VirtViewer *self,
ghost = replacement_host;
}
+ if (!virt_viewer_is_reachable(ghost, transport, host)) {
+ g_debug("graphics listen '%s' is not reachable from this machine",
+ ghost ? ghost : "");
+ virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"),
+ priv->domkey);
+ goto cleanup;
+ }
+
virt_viewer_app_set_connect_info(app, host, ghost, gport, gtlsport,transport, unixsock, user, port, NULL);
retval = TRUE;