File vnc-listen.patch of Package virt-viewer

Index: virt-viewer-0.2.1/src/viewer.c
===================================================================
--- virt-viewer-0.2.1.orig/src/viewer.c
+++ virt-viewer-0.2.1/src/viewer.c
@@ -696,7 +696,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;
@@ -709,6 +709,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);
@@ -868,15 +876,18 @@ 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) {
 		viewer_simple_message_dialog(viewer->window, _("Cannot determine the VNC port for the guest %s"),
 					     viewer->domkey);
+		free(vnchost);
+		vnchost = NULL;
 		goto cleanup;
 	}
 
@@ -886,6 +897,9 @@ static int viewer_activate(VirtViewer *v
 		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 : "");
 
@@ -901,7 +915,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");
openSUSE Build Service is sponsored by