src/conf/domain_conf.c | 35 ++++++++++++++++++++++++++---------
src/conf/domain_conf.h | 6 ++++++
2 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b7a342bb91..3154c07a86 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -21517,10 +21517,11 @@ virDomainDefParseNode(xmlDocPtr xml,
virDomainDefPtr def = NULL;
virDomainDefPtr ret = NULL;
- if (!virXMLNodeNameEqual(root, "domain")) {
+ if ((!virXMLNodeNameEqual(root, "domain")) &&
+ (!virXMLNodeNameEqual(root, "inactiveDomain"))) {
virReportError(VIR_ERR_XML_ERROR,
_("unexpected root element <%s>, "
- "expecting <domain>"),
+ "expecting <domain> or <inactiveDomain>"),
root->name);
goto cleanup;
}
@@ -28277,17 +28278,29 @@ virDomainDefFormatFeatures(virBufferPtr buf,
return virXMLFormatElement(buf, "features", NULL, &childBuf);
}
-
-/* This internal version appends to an existing buffer
- * (possibly with auto-indent), rather than flattening
- * to string.
- * Return -1 on failure. */
int
virDomainDefFormatInternal(virDomainDefPtr def,
virCapsPtr caps,
unsigned int flags,
virBufferPtr buf,
virDomainXMLOptionPtr xmlopt)
+{
+ return virDomainDefFormatInternalSetRootName(def, caps, flags, buf,
+ xmlopt, "domain");
+}
+
+
+/* This internal version appends to an existing buffer
+ * (possibly with auto-indent), rather than flattening
+ * to string.
+ * Return -1 on failure. */
+int
+virDomainDefFormatInternalSetRootName(virDomainDefPtr def,
+ virCapsPtr caps,
+ unsigned int flags,
+ virBufferPtr buf,
+ virDomainXMLOptionPtr xmlopt,
+ const char *rootname)
{
unsigned char *uuid;
char uuidstr[VIR_UUID_STRING_BUFLEN];
@@ -28312,7 +28325,11 @@ virDomainDefFormatInternal(virDomainDefPtr def,
if (def->id == -1)
flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE;
- virBufferAsprintf(buf, "<domain type='%s'", type);
+ if (!rootname || (STRNEQ(rootname, "domain") &&
+ STRNEQ(rootname, "inactiveDomain")))
+ goto error;
+
+ virBufferAsprintf(buf, "<%s type='%s'", rootname, type);
if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE))
virBufferAsprintf(buf, " id='%d'", def->id);
if (def->namespaceData && def->ns.format)
@@ -28794,7 +28811,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virDomainSEVDefFormat(buf, def->sev);
virBufferAdjustIndent(buf, -2);
- virBufferAddLit(buf, "</domain>\n");
+ virBufferAsprintf(buf, "</%s>\n", rootname);
if (virBufferCheckError(buf) < 0)
goto error;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 33cef5b75c..af1335cc16 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3073,6 +3073,12 @@ int virDomainDefFormatInternal(virDomainDefPtr def,
unsigned int flags,
virBufferPtr buf,
virDomainXMLOptionPtr xmlopt);
+int virDomainDefFormatInternalSetRootName(virDomainDefPtr def,
+ virCapsPtr caps,
+ unsigned int flags,
+ virBufferPtr buf,
+ virDomainXMLOptionPtr xmlopt,
+ const char *rootname);
int virDomainDiskSourceFormat(virBufferPtr buf,
virStorageSourcePtr src,