[Libvir] PATCH: Make QEMU driver honour 'listen' flag for VNC

Daniel P. Berrange berrange at redhat.com
Mon Jul 23 18:06:25 UTC 2007


In QEMU 0.9.0 or later it is possible to tell QEMU to only listen on a
particular IP address. THis patch adapts the code so that it honours the
'listen' attribute on the <graphics> tag if using QEMU >= 0.9.0. It also
re-enables the tests for this capability that I temporarily disabled.

 src/qemu_conf.c                                       |   37 +++++++++++++-----
 src/qemu_conf.h                                       |    1 
 tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args |    2 
 tests/qemuxml2argvtest.c                              |    4 -
 tests/qemuxml2xmltest.c                               |    2 
 5 files changed, 32 insertions(+), 14 deletions(-)

Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
Index: src/qemu_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.c,v
retrieving revision 1.5
diff -u -p -r1.5 qemu_conf.c
--- src/qemu_conf.c	18 Jul 2007 21:47:47 -0000	1.5
+++ src/qemu_conf.c	23 Jul 2007 18:02:31 -0000
@@ -1197,14 +1197,23 @@ static struct qemud_vm_def *qemudParseXM
         def->graphicsType = QEMUD_GRAPHICS_NONE;
     } else if ((prop = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "type"))) {
         if (!strcmp((char *)prop, "vnc")) {
+            xmlChar *vncport, *vnclisten;
             def->graphicsType = QEMUD_GRAPHICS_VNC;
-            prop = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "port");
-            if (prop) {
+            vncport = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "port");
+            if (vncport) {
                 conv = NULL;
-                def->vncPort = strtoll((const char*)prop, &conv, 10);
+                def->vncPort = strtoll((const char*)vncport, &conv, 10);
             } else {
                 def->vncPort = -1;
             }
+            vnclisten = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "listen");
+            if (vnclisten && *vnclisten)
+                strncpy(def->vncListen, (char *)vnclisten, BR_INET_ADDR_MAXLEN-1);
+            else
+                strcpy(def->vncListen, "127.0.0.1");
+            def->vncListen[BR_INET_ADDR_MAXLEN-1] = '\0';
+            xmlFree(vncport);
+            xmlFree(vnclisten);
         } else if (!strcmp((char *)prop, "sdl")) {
             def->graphicsType = QEMUD_GRAPHICS_SDL;
         } else {
@@ -1700,18 +1709,21 @@ int qemudBuildCommandLine(virConnectPtr 
     }
 
     if (vm->def->graphicsType == QEMUD_GRAPHICS_VNC) {
-        char port[10];
+        char vncdisplay[BR_INET_ADDR_MAXLEN+20];
         int ret;
-        ret = snprintf(port, sizeof(port),
-                       ((driver->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) ?
-                        ":%d" : "%d"),
-                       vm->def->vncActivePort - 5900);
-        if (ret < 0 || ret >= (int)sizeof(port))
+        if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON)
+            ret = snprintf(vncdisplay, sizeof(vncdisplay), "%s:%d",
+                           vm->def->vncListen,
+                           vm->def->vncActivePort - 5900);
+        else
+            ret = snprintf(vncdisplay, sizeof(vncdisplay), "%d",
+                           vm->def->vncActivePort - 5900);
+        if (ret < 0 || ret >= (int)sizeof(vncdisplay))
             goto error;
 
         if (!((*argv)[++n] = strdup("-vnc")))
             goto no_memory;
-        if (!((*argv)[++n] = strdup(port)))
+        if (!((*argv)[++n] = strdup(vncdisplay)))
             goto no_memory;
     } else if (vm->def->graphicsType == QEMUD_GRAPHICS_NONE) {
         if (!((*argv)[++n] = strdup("-nographic")))
@@ -2931,6 +2943,11 @@ char *qemudGenerateXML(virConnectPtr con
                               qemudIsActiveVM(vm) && live ? def->vncActivePort : def->vncPort) < 0)
             goto no_memory;
 
+        if (def->vncListen[0] &&
+            virBufferVSprintf(buf, " listen='%s'",
+                              def->vncListen) < 0)
+            goto no_memory;
+
         if (virBufferAdd(buf, "/>\n", -1) < 0)
             goto no_memory;
         break;
Index: src/qemu_conf.h
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.h,v
retrieving revision 1.4
diff -u -p -r1.4 qemu_conf.h
--- src/qemu_conf.h	18 Jul 2007 21:08:22 -0000	1.4
+++ src/qemu_conf.h	23 Jul 2007 18:02:31 -0000
@@ -186,6 +186,7 @@ struct qemud_vm_def {
     int graphicsType;
     int vncPort;
     int vncActivePort;
+    char vncListen[BR_INET_ADDR_MAXLEN];
 
     int ndisks;
     struct qemud_vm_disk_def *disks;
Index: tests/qemuxml2argvtest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/qemuxml2argvtest.c,v
retrieving revision 1.1
diff -u -p -r1.1 qemuxml2argvtest.c
--- tests/qemuxml2argvtest.c	18 Jul 2007 21:34:22 -0000	1.1
+++ tests/qemuxml2argvtest.c	23 Jul 2007 18:02:31 -0000
@@ -146,11 +146,11 @@ main(int argc, char **argv)
                     1, testCompareXMLToArgvHelper, "disk-many") < 0)
         ret = -1;
 
-    if (0 && virtTestRun("QEMU XML-2-ARGV Graphics VNC",
+    if (virtTestRun("QEMU XML-2-ARGV Graphics VNC",
                     1, testCompareXMLToArgvHelper, "graphics-vnc") < 0)
         ret = -1;
 
-    if (0 && virtTestRun("QEMU XML-2-ARGV Graphics SDL",
+    if (virtTestRun("QEMU XML-2-ARGV Graphics SDL",
                     1, testCompareXMLToArgvHelper, "graphics-sdl") < 0)
         ret = -1;
 
Index: tests/qemuxml2xmltest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/qemuxml2xmltest.c,v
retrieving revision 1.1
diff -u -p -r1.1 qemuxml2xmltest.c
--- tests/qemuxml2xmltest.c	18 Jul 2007 21:34:22 -0000	1.1
+++ tests/qemuxml2xmltest.c	23 Jul 2007 18:02:31 -0000
@@ -111,7 +111,7 @@ main(int argc, char **argv)
                     1, testCompareXMLToXMLHelper, "disk-many") < 0)
         ret = -1;
 
-    if (0 && virtTestRun("QEMU XML-2-ARGV Graphics VNC",
+    if (virtTestRun("QEMU XML-2-ARGV Graphics VNC",
                     1, testCompareXMLToXMLHelper, "graphics-vnc") < 0)
         ret = -1;
 
Index: tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args
===================================================================
RCS file: /data/cvs/libvirt/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args,v
retrieving revision 1.1
diff -u -p -r1.1 qemuxml2argv-graphics-sdl.args
--- tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args	18 Jul 2007 21:34:22 -0000	1.1
+++ tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.args	23 Jul 2007 18:02:31 -0000
@@ -1 +1 @@
-/usr/bin/qemu -M pc -m 214 -smp 1 -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -usb -sdl
\ No newline at end of file
+/usr/bin/qemu -M pc -m 214 -smp 1 -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -usb
\ No newline at end of file


More information about the libvir-list mailing list