]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virxml: Introduce and use virXMLFormatMetadata()
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 25 May 2021 09:21:02 +0000 (11:21 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 25 May 2021 11:17:22 +0000 (13:17 +0200)
So far, we have to places where we format <metadata/> into XMLs:
domain and network. Bot places share the same code. Move it into
a helper function and just call it from those places.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/conf/domain_conf.c
src/conf/network_conf.c
src/libvirt_private.syms
src/util/virxml.c
src/util/virxml.h

index 4f78b7b43dbbf8c071f9192cd05dd2a78f1eb747..413c44ac61b0139f939d51d170b1198d0b94b0f6 100644 (file)
@@ -27806,27 +27806,8 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def,
     virBufferEscapeString(buf, "<description>%s</description>\n",
                           def->description);
 
-    if (def->metadata) {
-        g_autoptr(xmlBuffer) xmlbuf = NULL;
-        int oldIndentTreeOutput = xmlIndentTreeOutput;
-
-        /* Indentation on output requires that we previously set
-         * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
-         * spaces per level of indentation of intermediate elements,
-         * but no leading indentation before the starting element.
-         * Thankfully, libxml maps what looks like globals into
-         * thread-local uses, so we are thread-safe.  */
-        xmlIndentTreeOutput = 1;
-        xmlbuf = virXMLBufferCreate();
-
-        if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
-                        virBufferGetIndent(buf) / 2, 1) < 0) {
-            xmlIndentTreeOutput = oldIndentTreeOutput;
-            return -1;
-        }
-        virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf));
-        xmlIndentTreeOutput = oldIndentTreeOutput;
-    }
+    if (virXMLFormatMetadata(buf, def->metadata) < 0)
+        return -1;
 
     if (virDomainDefHasMemoryHotplug(def)) {
         virBufferAsprintf(buf,
index a9eadff29c029ae7f701a11ca1a4b529a4efd72b..b10ff5c7a8f17d86c9f7896da3d2e40103daaa0f 100644 (file)
@@ -2486,27 +2486,8 @@ virNetworkDefFormatBuf(virBuffer *buf,
     virUUIDFormat(uuid, uuidstr);
     virBufferAsprintf(buf, "<uuid>%s</uuid>\n", uuidstr);
 
-    if (def->metadata) {
-        g_autoptr(xmlBuffer) xmlbuf = NULL;
-        int oldIndentTreeOutput = xmlIndentTreeOutput;
-
-        /* Indentation on output requires that we previously set
-         * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
-         * spaces per level of indentation of intermediate elements,
-         * but no leading indentation before the starting element.
-         * Thankfully, libxml maps what looks like globals into
-         * thread-local uses, so we are thread-safe.  */
-        xmlIndentTreeOutput = 1;
-        xmlbuf = virXMLBufferCreate();
-
-        if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
-                        virBufferGetIndent(buf) / 2, 1) < 0) {
-            xmlIndentTreeOutput = oldIndentTreeOutput;
-            return -1;
-        }
-        virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf));
-        xmlIndentTreeOutput = oldIndentTreeOutput;
-    }
+    if (virXMLFormatMetadata(buf, def->metadata) < 0)
+        return -1;
 
     if (def->forward.type != VIR_NETWORK_FORWARD_NONE) {
         const char *dev = NULL;
index e1aef5267ee5b688dda81a9d9b75781cdcc8c6f0..37515f80ecece4bd9c96dad5da11a2e19f5cbbf7 100644 (file)
@@ -3555,6 +3555,7 @@ virXMLCheckIllegalChars;
 virXMLExtractNamespaceXML;
 virXMLFormatElement;
 virXMLFormatElementEmpty;
+virXMLFormatMetadata;
 virXMLNewNode;
 virXMLNodeContentString;
 virXMLNodeNameEqual;
index 8dcece704aba0dc20a19b89a5b74fd2ba728e24b..062a5402f6f1297182b75a3cbe21483a3796d66f 100644 (file)
@@ -1707,6 +1707,49 @@ virXMLFormatElement(virBuffer *buf,
 }
 
 
+/**
+ * virXMLFormatMetadata:
+ * @buf: the parent buffer where the element will be placed
+ * @metadata: pointer to metadata node
+ *
+ * Helper to format metadata element. If @metadata is NULL then
+ * this function is a NOP.
+ *
+ * Returns: 0 on success,
+ *         -1 otherwise.
+ */
+int
+virXMLFormatMetadata(virBuffer *buf,
+                     xmlNodePtr metadata)
+{
+    g_autoptr(xmlBuffer) xmlbuf = NULL;
+    int oldIndentTreeOutput = xmlIndentTreeOutput;
+
+    if (!metadata)
+        return 0;
+
+    /* Indentation on output requires that we previously set
+     * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
+     * spaces per level of indentation of intermediate elements,
+     * but no leading indentation before the starting element.
+     * Thankfully, libxml maps what looks like globals into
+     * thread-local uses, so we are thread-safe.  */
+    xmlIndentTreeOutput = 1;
+    xmlbuf = virXMLBufferCreate();
+
+    if (xmlNodeDump(xmlbuf, metadata->doc, metadata,
+                    virBufferGetIndent(buf) / 2, 1) < 0) {
+        xmlIndentTreeOutput = oldIndentTreeOutput;
+        return -1;
+    }
+
+    virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf));
+    xmlIndentTreeOutput = oldIndentTreeOutput;
+
+    return 0;
+}
+
+
 void
 virXPathContextNodeRestore(virXPathContextNodeSave *save)
 {
index ed02abd2e98d4ff90fa5048b3d982d2fae9cd49c..0bb0d1c118ee43aab94302a4780750c9bffcf32d 100644 (file)
@@ -333,6 +333,9 @@ virXMLFormatElementEmpty(virBuffer *buf,
                          virBuffer *attrBuf,
                          virBuffer *childBuf);
 
+int
+virXMLFormatMetadata(virBuffer *buf,
+                     xmlNodePtr metadata);
 
 struct _virXPathContextNodeSave {
     xmlXPathContextPtr ctxt;