Once it's plugged in, listenNetwork will be an optional replacement for the "listen" attribute. While listen can be a host name or IP address, listenNetwork names one of the networks managed by libvirt (with virNetwork*()/visrh net-*). --- docs/schemas/domain.rng | 33 ++++++++--- src/conf/domain_conf.c | 60 +++++++++++++++++-- src/conf/domain_conf.h | 3 + .../qemuxml2argv-graphics-listenNetwork.xml | 30 ++++++++++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-listenNetwork.xml diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 07c63bd..42f3eb2 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -1241,9 +1241,14 @@ </attribute> </optional> <optional> - <attribute name="listen"> - <ref name="addrIPorName"/> - </attribute> + <choice> + <attribute name="listen"> + <ref name="addrIPorName"/> + </attribute> + <attribute name="listenNetwork"> + <text/> + </attribute> + </choice> </optional> </group> <group> @@ -1300,9 +1305,14 @@ </attribute> </optional> <optional> - <attribute name="listen"> - <ref name="addrIPorName"/> - </attribute> + <choice> + <attribute name="listen"> + <ref name="addrIPorName"/> + </attribute> + <attribute name="listenNetwork"> + <text/> + </attribute> + </choice> </optional> <optional> <attribute name="passwd"> @@ -1461,9 +1471,14 @@ </attribute> </optional> <optional> - <attribute name="listen"> - <ref name="addrIPorName"/> - </attribute> + <choice> + <attribute name="listen"> + <ref name="addrIPorName"/> + </attribute> + <attribute name="listenNetwork"> + <text/> + </attribute> + </choice> </optional> </group> <group> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 4c58633..035b743 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -633,6 +633,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def) switch (def->type) { case VIR_DOMAIN_GRAPHICS_TYPE_VNC: VIR_FREE(def->data.vnc.listenAddr); + VIR_FREE(def->data.vnc.listenNetwork); VIR_FREE(def->data.vnc.socket); VIR_FREE(def->data.vnc.keymap); virDomainGraphicsAuthDefClear(&def->data.vnc.auth); @@ -645,6 +646,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def) case VIR_DOMAIN_GRAPHICS_TYPE_RDP: VIR_FREE(def->data.rdp.listenAddr); + VIR_FREE(def->data.rdp.listenNetwork); break; case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: @@ -653,6 +655,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def) case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: VIR_FREE(def->data.spice.listenAddr); + VIR_FREE(def->data.spice.listenNetwork); VIR_FREE(def->data.spice.keymap); virDomainGraphicsAuthDefClear(&def->data.spice.auth); break; @@ -4061,14 +4064,23 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, unsigned int flags) VIR_FREE(autoport); } - def->data.vnc.listenAddr = virXMLPropString(node, "listen"); def->data.vnc.socket = virXMLPropString(node, "socket"); def->data.vnc.keymap = virXMLPropString(node, "keymap"); - if (def->data.vnc.listenAddr && - !def->data.vnc.listenAddr[0]) + def->data.vnc.listenAddr = virXMLPropString(node, "listen"); + if (def->data.vnc.listenAddr && !def->data.vnc.listenAddr[0]) VIR_FREE(def->data.vnc.listenAddr); + def->data.vnc.listenNetwork = virXMLPropString(node, "listenNetwork"); + if (def->data.vnc.listenNetwork && !def->data.vnc.listenNetwork[0]) + VIR_FREE(def->data.vnc.listenNetwork); + + if (def->data.vnc.listenAddr && def->data.vnc.listenNetwork) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Both listen and listenNetwork given in graphics element")); + goto error; + } + if (virDomainGraphicsAuthDefParseXML(node, &def->data.vnc.auth, def->type) < 0) goto error; @@ -4138,6 +4150,17 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, unsigned int flags) if (def->data.rdp.listenAddr && !def->data.rdp.listenAddr[0]) VIR_FREE(def->data.rdp.listenAddr); + + def->data.rdp.listenNetwork = virXMLPropString(node, "listenNetwork"); + if (def->data.rdp.listenNetwork && !def->data.rdp.listenNetwork[0]) + VIR_FREE(def->data.rdp.listenNetwork); + + if (def->data.rdp.listenAddr && def->data.rdp.listenNetwork) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Both listen and listenNetwork given in graphics element")); + goto error; + } + } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP) { char *fullscreen = virXMLPropString(node, "fullscreen"); @@ -4199,13 +4222,21 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, unsigned int flags) VIR_FREE(autoport); } - def->data.spice.listenAddr = virXMLPropString(node, "listen"); def->data.spice.keymap = virXMLPropString(node, "keymap"); - - if (def->data.spice.listenAddr && - !def->data.spice.listenAddr[0]) + def->data.spice.listenAddr = virXMLPropString(node, "listen"); + if (def->data.spice.listenAddr && !def->data.spice.listenAddr[0]) VIR_FREE(def->data.spice.listenAddr); + def->data.spice.listenNetwork = virXMLPropString(node, "listenNetwork"); + if (def->data.spice.listenNetwork && !def->data.spice.listenNetwork[0]) + VIR_FREE(def->data.spice.listenNetwork); + + if (def->data.spice.listenAddr && def->data.spice.listenNetwork) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Both listen and listenNetwork given in graphics element")); + goto error; + } + if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth, def->type) < 0) goto error; @@ -9431,6 +9462,11 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (def->data.vnc.listenAddr) virBufferAsprintf(buf, " listen='%s'", def->data.vnc.listenAddr); + + if (def->data.vnc.listenNetwork) { + virBufferAsprintf(buf, " listenNetwork='%s'", + def->data.vnc.listenNetwork); + } } if (def->data.vnc.keymap) @@ -9472,6 +9508,11 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (def->data.rdp.listenAddr) virBufferAsprintf(buf, " listen='%s'", def->data.rdp.listenAddr); + if (def->data.rdp.listenNetwork) { + virBufferAsprintf(buf, " listenNetwork='%s'", + def->data.rdp.listenNetwork); + } + break; case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: @@ -9500,6 +9541,11 @@ virDomainGraphicsDefFormat(virBufferPtr buf, virBufferAsprintf(buf, " listen='%s'", def->data.spice.listenAddr); + if (def->data.spice.listenNetwork) { + virBufferAsprintf(buf, " listenNetwork='%s'", + def->data.spice.listenNetwork); + } + if (def->data.spice.keymap) virBufferEscapeString(buf, " keymap='%s'", def->data.spice.keymap); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9e9db41..7f05084 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -768,6 +768,7 @@ struct _virDomainGraphicsDef { int port; unsigned int autoport :1; char *listenAddr; + char *listenNetwork; char *keymap; char *socket; virDomainGraphicsAuthDef auth; @@ -780,6 +781,7 @@ struct _virDomainGraphicsDef { struct { int port; char *listenAddr; + char *listenNetwork; unsigned int autoport :1; unsigned int replaceUser :1; unsigned int multiUser :1; @@ -792,6 +794,7 @@ struct _virDomainGraphicsDef { int port; int tlsPort; char *listenAddr; + char *listenNetwork; char *keymap; virDomainGraphicsAuthDef auth; unsigned int autoport :1; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-listenNetwork.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-listenNetwork.xml new file mode 100644 index 0000000..f7757f1 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-listenNetwork.xml @@ -0,0 +1,30 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <currentMemory>219100</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='5903' autoport='no' listenNetwork='Bobsnetwork'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + </video> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 6b1fbf5..e8b5ece 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -139,6 +139,7 @@ mymain(void) DO_TEST("disk-drive-cache-v1-wb"); DO_TEST("disk-drive-cache-v1-none"); DO_TEST("disk-scsi-device"); + DO_TEST("graphics-listenNetwork"); DO_TEST("graphics-vnc"); DO_TEST("graphics-vnc-sasl"); DO_TEST("graphics-vnc-tls"); -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list