diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3e81013915..23733973b6 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7688,6 +7688,8 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, char *type = virXMLPropString(node, "type"); char *address = virXMLPropString(node, "address"); char *network = virXMLPropString(node, "network"); + char *fromConfig = virXMLPropString(node, "fromConfig"); + int tmp; if (!type) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -7724,6 +7726,17 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, network = NULL; } + if (fromConfig && + flags & VIR_DOMAIN_XML_INTERNAL_STATUS) { + if (virStrToLong_i(fromConfig, NULL, 10, &tmp) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid fromConfig value: %s"), + fromConfig); + goto error; + } + def->fromConfig = tmp != 0; + } + ret = 0; error: if (ret < 0) @@ -7731,6 +7744,7 @@ error: VIR_FREE(type); VIR_FREE(address); VIR_FREE(network); + VIR_FREE(fromConfig); return ret; } @@ -15365,6 +15379,11 @@ virDomainGraphicsListenDefFormat(virBufferPtr buf, virDomainGraphicsListenDefPtr def, unsigned int flags) { + /* If generating migratable XML, skip listen address + * dragged in from config file */ + if ((flags & VIR_DOMAIN_XML_MIGRATABLE) && def->fromConfig) + return; + virBufferAddLit(buf, " type) { @@ -15386,6 +15405,9 @@ virDomainGraphicsListenDefFormat(virBufferPtr buf, virBufferEscapeString(buf, " network='%s'", def->network); } + if (flags & VIR_DOMAIN_XML_INTERNAL_STATUS) + virBufferAsprintf(buf, " fromConfig='%d'", def->fromConfig); + virBufferAddLit(buf, "/>\n"); } @@ -15412,6 +15434,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf, for (i = 0; i < def->nListens; i++) { if (virDomainGraphicsListenGetType(def, i) == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) { + if (flags & VIR_DOMAIN_XML_MIGRATABLE && + def->listens[i].fromConfig) + continue; listenAddr = virDomainGraphicsListenGetAddress(def, i); break; } @@ -15531,6 +15556,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (virDomainGraphicsListenGetType(def, i) == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE) continue; + if (flags & VIR_DOMAIN_XML_MIGRATABLE && + def->listens[i].fromConfig) + continue; if (!children) { virBufferAddLit(buf, ">\n"); children = true; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index b8edb1e80c..5b159aca78 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1420,6 +1420,7 @@ struct _virDomainGraphicsListenDef { int type; /* enum virDomainGraphicsListenType */ char *address; char *network; + bool fromConfig; /* true if the @address is config file originated */ }; struct _virDomainGraphicsDef { diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c412ea257f..5a0f18b24b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3486,6 +3486,7 @@ int qemuProcessStart(virConnectPtr conn, VIR_SHRINK_N(graphics->listens, graphics->nListens, 1); goto cleanup; } + graphics->listens[0].fromConfig = true; } } }