File vnc-listen.patch of Package virt-viewer
Index: virt-viewer-0.2.0/src/viewer.c
===================================================================
--- virt-viewer-0.2.0.orig/src/viewer.c
+++ virt-viewer-0.2.0/src/viewer.c
@@ -660,7 +660,7 @@ static int viewer_matches_domain(VirtVie
return 0;
}
-static char * viewer_extract_vnc_port(virDomainPtr dom)
+static char * viewer_extract_vnc_port(virDomainPtr dom, char **host)
{
char *xmldesc = virDomainGetXMLDesc(dom, 0);
xmlDocPtr xml = NULL;
@@ -673,6 +673,14 @@ static char * viewer_extract_vnc_port(vi
if (!pctxt || !pctxt->sax)
goto error;
+ obj = xmlXPathEval((const xmlChar *)"string(/domain/devices/graphics[@type='vnc']/@listen)", ctxt);
+ if (obj && obj->type == XPATH_STRING &&
+ obj->stringval && obj->stringval[0]) {
+ *host = strdup((const char*)obj->stringval);
+ xmlXPathFreeObject(obj);
+ obj = NULL;
+ }
+
xml = xmlCtxtReadDoc(pctxt, (const xmlChar *)xmldesc, "domain.xml", NULL,
XML_PARSE_NOENT | XML_PARSE_NONET |
XML_PARSE_NOWARNING);
@@ -832,18 +840,26 @@ static int viewer_activate(VirtViewer *v
char *host = NULL;
char *transport = NULL;
char *user = NULL;
+ char *vnchost = NULL;
int port, fd = -1;
int ret = -1;
if (viewer->active)
goto cleanup;
- if ((vncport = viewer_extract_vnc_port(dom)) == NULL)
+ if ((vncport = viewer_extract_vnc_port(dom, &vnchost)) == NULL)
+ {
+ free(vnchost);
+ vnchost = NULL;
goto cleanup;
+ }
if (viewer_extract_host(viewer->uri, &host, &transport, &user, &port) < 0)
goto cleanup;
+ if (vnchost == NULL)
+ vnchost = strdup("127.0.0.1");
+
DEBUG_LOG("Remote host is %s and transport %s user %s",
host, transport ? transport : "", user ? user : "");
@@ -859,7 +875,7 @@ static int viewer_activate(VirtViewer *v
if (fd >= 0) {
vnc_display_open_fd(VNC_DISPLAY(viewer->vnc), fd);
} else {
- vnc_display_open_host(VNC_DISPLAY(viewer->vnc), host, vncport);
+ vnc_display_open_host(VNC_DISPLAY(viewer->vnc), vnchost, vncport);
}
viewer_set_status(viewer, "Connecting to VNC server");