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;
 }
openSUSE Build Service is sponsored by