diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c6be791876..e6be9e0bb3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2092,6 +2092,7 @@ virUUIDParse; # util/virxml.h virXMLChildElementCount; +virXMLNodeToString; virXMLParseHelper; virXMLPickShellSafeComment; virXMLPropString; diff --git a/src/util/virxml.c b/src/util/virxml.c index f652ee0fad..6d1a2e9395 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -895,3 +895,36 @@ virXMLChildElementCount(xmlNodePtr node) } return ret; } + + +/** + * virXMLNodeToString: convert an XML node ptr to an XML string + * + * Returns the XML string of the document or NULL on error. + * The caller has to free the string. + */ +char * +virXMLNodeToString(xmlDocPtr doc, + xmlNodePtr node) +{ + xmlBufferPtr xmlbuf = NULL; + char *ret = NULL; + + if (!(xmlbuf = xmlBufferCreate())) { + virReportOOMError(); + return NULL; + } + + if (xmlNodeDump(xmlbuf, doc, node, 0, 1) == 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to convert the XML node tree")); + goto cleanup; + } + + ignore_value(VIR_STRDUP(ret, (const char *)xmlBufferContent(xmlbuf))); + +cleanup: + xmlBufferFree(xmlbuf); + + return ret; +} diff --git a/src/util/virxml.h b/src/util/virxml.h index 364288dd55..bb340699ba 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -163,4 +163,6 @@ int virXMLSaveFile(const char *path, const char *warnCommand, const char *xml); +char *virXMLNodeToString(xmlDocPtr doc, xmlNodePtr node); + #endif /* __VIR_XML_H__ */