We need this in order to validate XML against schema at one
place, rather than have the same code for validation in different
functions.
I will add '--validate' option to more virsh commands soon and
this makes it easier as virXMLParse() is called in every one I
plan to change.
Signed-off-by: Kristina Hanicova <khanicov(a)redhat.com>
---
src/util/virxml.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 0220c5906f..b896a80460 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -33,6 +33,7 @@
#include "virfile.h"
#include "virstring.h"
#include "virutil.h"
+#include "configmake.h"
#define VIR_FROM_THIS VIR_FROM_XML
@@ -1096,8 +1097,8 @@ catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
* @url: URL of XML document for string parser
* @rootelement: Optional name of the expected root element
* @ctxt: optional pointer to populate with new context pointer
- * @schemafile: unused
- * @validate: unused
+ * @schemafile: optional name of the file the parsed XML will be validated against
+ * @validate: if true, the XML will be validated against schema in @schemafile
*
* Parse XML document provided either as a file or a string. The function
* guarantees that the XML document contains a root element.
@@ -1114,8 +1115,8 @@ virXMLParseHelper(int domcode,
const char *url,
const char *rootelement,
xmlXPathContextPtr *ctxt,
- const char *schemafile G_GNUC_UNUSED,
- bool validate G_GNUC_UNUSED)
+ const char *schemafile,
+ bool validate)
{
struct virParserData private;
g_autoptr(xmlParserCtxt) pctxt = NULL;
@@ -1181,6 +1182,15 @@ virXMLParseHelper(int domcode,
(*ctxt)->node = rootnode;
}
+ if (validate && schemafile != NULL) {
+ g_autofree char *schema = virFileFindResource(schemafile,
+ abs_top_srcdir
"/docs/schemas",
+ PKGDATADIR "/schemas");
+ if (!schema ||
+ (virXMLValidateAgainstSchema(schema, xml) < 0))
+ return NULL;
+ }
+
return g_steal_pointer(&xml);
}
--
2.31.1