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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list