[libvirt] [PATCH 1/2] util: new function virXMLNodeSanitizeNamespaces()

Laine Stump laine at laine.org
Fri Jun 24 15:33:50 UTC 2016


This is a generic version of virDomainDefMetadataSanitize() - the same
functionality is now needed for network metadata.
---
 src/libvirt_private.syms |  1 +
 src/util/virxml.c        | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/util/virxml.h        |  2 ++
 3 files changed, 55 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 501c23e..3632148 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2580,6 +2580,7 @@ virUUIDParse;
 # util/virxml.h
 virXMLChildElementCount;
 virXMLExtractNamespaceXML;
+virXMLNodeSanitizeNamespaces;
 virXMLNodeToString;
 virXMLParseHelper;
 virXMLPickShellSafeComment;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index aa97940..37f0817 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -1083,6 +1083,58 @@ virXMLInjectNamespace(xmlNodePtr node,
     return 0;
 }
 
+/**
+ * virXMLNodeSanitizeNamespaces()
+ * @node: Sanitize the namespaces for this node
+ *
+ * This function removes subnodes in node that share the namespace.
+ * The first metadata entry of every duplicate namespace is kept. Additionally
+ * nodes with no namespace are deleted.
+ */
+void
+virXMLNodeSanitizeNamespaces(xmlNodePtr node)
+{
+    xmlNodePtr child;
+    xmlNodePtr next;
+    xmlNodePtr dupl;
+
+    if (!node)
+       return;
+
+    child = node->children;
+    while (child) {
+        /* remove metadata entries that don't have any namespace at all */
+        if (!child->ns || !child->ns->href) {
+            dupl = child;
+            child = child->next;
+
+            xmlUnlinkNode(dupl);
+            xmlFreeNode(dupl);
+            continue;
+        }
+
+        /* check that every other child of @root doesn't share the namespace of
+         * the current one and delete them possibly */
+        next = child->next;
+        while (next) {
+            dupl = NULL;
+
+            if (child->ns && next->ns &&
+                STREQ_NULLABLE((const char *) child->ns->href,
+                               (const char *) next->ns->href))
+                dupl = next;
+
+            next = next->next;
+            if (dupl) {
+                xmlUnlinkNode(dupl);
+                xmlFreeNode(dupl);
+            }
+        }
+        child = child->next;
+    }
+}
+
+
 static void catchRNGError(void *ctx,
                           const char *msg,
                           ...)
diff --git a/src/util/virxml.h b/src/util/virxml.h
index 7a89518..7a0a1da 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -179,6 +179,8 @@ int virXMLInjectNamespace(xmlNodePtr node,
                           const char *uri,
                           const char *key);
 
+void virXMLNodeSanitizeNamespaces(xmlNodePtr node);
+
 struct _virXMLValidator {
     xmlRelaxNGParserCtxtPtr rngParser;
     xmlRelaxNGPtr rng;
-- 
2.5.5




More information about the libvir-list mailing list