[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