Friday, 24 June
2016
Fri, 24 Jun
'16
10:33 a.m.
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