File vnc-listen.patch of Package virt-viewer
Index: virt-viewer-0.0.3/src/main.c
===================================================================
--- virt-viewer-0.0.3.orig/src/main.c
+++ virt-viewer-0.0.3/src/main.c
@@ -617,7 +617,7 @@ static virDomainPtr viewer_lookup_domain
return dom;
}
-static int viewer_extract_vnc_graphics(virDomainPtr dom, char **port)
+static int viewer_extract_vnc_graphics(virDomainPtr dom, char **host, char **port)
{
char *xmldesc = virDomainGetXMLDesc(dom, 0);
xmlDocPtr xml = NULL;
@@ -641,6 +641,14 @@ static int viewer_extract_vnc_graphics(v
if (!ctxt)
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;
+ }
+
obj = xmlXPathEval((const xmlChar *)"string(/domain/devices/graphics[@type='vnc']/@port)", ctxt);
if (!obj || obj->type != XPATH_STRING || !obj->stringval || !obj->stringval[0])
goto error;
@@ -786,6 +794,7 @@ viewer_start (const char *uri, const cha
virConnectPtr conn = NULL;
virDomainPtr dom = NULL;
char *host = NULL;
+ char *vnchost = NULL;
char *vncport = NULL;
char *transport = NULL;
char *user = NULL;
@@ -813,13 +822,16 @@ viewer_start (const char *uri, const cha
} while (!dom);
do {
- viewer_extract_vnc_graphics(dom, &vncport);
+ viewer_extract_vnc_graphics(dom, &vnchost, &vncport);
if (!vncport && !waitvnc) {
fprintf(stderr, "unable to find vnc graphics for %s\n", name);
return 4;
}
- if (!vncport)
+ if (!vncport) {
usleep(300*1000);
+ free(vnchost);
+ vnchost = NULL;
+ }
} while (!vncport);
tmpname = virDomainGetName(dom);
if (tmpname != NULL) {
@@ -828,6 +840,9 @@ viewer_start (const char *uri, const cha
virDomainFree(dom);
virConnectClose(conn);
+ if (vnchost == NULL)
+ vnchost = strdup("127.0.0.1");
+
if (viewer_extract_host(uri, &host, &transport, &user, &port) < 0) {
fprintf(stderr, "unable to determine hostname for URI %s\n", uri);
return 5;
@@ -850,7 +865,7 @@ viewer_start (const char *uri, const cha
if (fd >= 0)
vnc_display_open_fd(VNC_DISPLAY(vnc), fd);
else
- vnc_display_open_host(VNC_DISPLAY(vnc), host, vncport);
+ vnc_display_open_host(VNC_DISPLAY(vnc), vnchost, vncport);
return 0;
}