Currently, if domain's graphic has no listenAddr set we provide
the one from qemu.conf. However, we must make this transient to
not overwrite future changes to the config file. Moreover, we
have to store this into domain state XML so we remain consistent
on eventual config file edits.
---
Since users will never see new 'driverListenAddress' attribute
I don't think update of RNG schema is necessary.
src/conf/domain_conf.c | 14 ++++++++++++++
src/conf/domain_conf.h | 6 ++++++
src/qemu/qemu_command.c | 18 ++++++++++++++++--
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4651765..29fa215 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -909,6 +909,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
for (ii = 0; ii < def->nListens; ii++)
virDomainGraphicsListenDefClear(&def->listens[ii]);
VIR_FREE(def->listens);
+ VIR_FREE(def->driverListenAddress);
VIR_FREE(def);
}
@@ -5976,6 +5977,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
int nListens;
xmlNodePtr *listenNodes = NULL;
char *listenAddr = NULL;
+ char *driverListenAddress = NULL;
xmlNodePtr save = ctxt->node;
if (VIR_ALLOC(def) < 0) {
@@ -5999,6 +6001,12 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
goto error;
}
+ if (flags & VIR_DOMAIN_XML_INTERNAL_STATUS) {
+ driverListenAddress = virXMLPropString(node, "driverListenAddress");
+ if (driverListenAddress)
+ def->driverListenAddress = driverListenAddress;
+ }
+
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC ||
def->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP ||
def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
@@ -12323,9 +12331,15 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
break;
}
}
+ if (!listenAddr && !(flags & VIR_DOMAIN_XML_INACTIVE))
+ listenAddr = def->driverListenAddress;
virBufferAsprintf(buf, " <graphics type='%s'", type);
+ if (flags & VIR_DOMAIN_XML_INTERNAL_STATUS &&
def->driverListenAddress)
+ virBufferAsprintf(buf, " driverListenAddress='%s'",
+ def->driverListenAddress);
+
switch (def->type) {
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
if (def->data.vnc.socket) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3712785..6ad48fd 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1273,6 +1273,12 @@ struct _virDomainGraphicsDef {
* simplify parsing code.*/
size_t nListens;
virDomainGraphicsListenDefPtr listens;
+
+ /* In qemu driver if none of 'listens' contain usable listen address,
+ * the one from qemu.conf file is taken. However, we cannot store it
+ * into inactive XML as it would discard all future changes made to
+ * the config file. */
+ char * driverListenAddress;
};
enum virDomainRedirdevBus {
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 6549f57..9878a66 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5496,8 +5496,15 @@ qemuBuildCommandLine(virConnectPtr conn,
break;
}
- if (!listenAddr)
+ if (!listenAddr) {
listenAddr = driver->vncListen;
+ if (listenAddr &&
+ !(def->graphics[0]->driverListenAddress =
+ strdup(listenAddr))) {
+ virReportOOMError();
+ goto error;
+ }
+ }
escapeAddr = strchr(listenAddr, ':') != NULL;
if (escapeAddr)
@@ -5647,8 +5654,15 @@ qemuBuildCommandLine(virConnectPtr conn,
break;
}
- if (!listenAddr)
+ if (!listenAddr) {
listenAddr = driver->spiceListen;
+ if (listenAddr &&
+ !(def->graphics[0]->driverListenAddress =
+ strdup(listenAddr))) {
+ virReportOOMError();
+ goto error;
+ }
+ }
if (listenAddr)
virBufferAsprintf(&opt, ",addr=%s", listenAddr);
--
1.7.8.5