Split out all the code initializing the validator
to a separate function.
---
src/libvirt_private.syms | 1 +
src/util/virxml.c | 33 ++++++++++++++++++++++++---------
src/util/virxml.h | 3 +++
3 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 53a7a97..e631c14 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2566,6 +2566,7 @@ virXMLPropString;
virXMLSaveFile;
virXMLValidateAgainstSchema;
virXMLValidatorFree;
+virXMLValidatorInit;
virXPathBoolean;
virXPathInt;
virXPathLong;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 49aed7d..19163db 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -1104,25 +1104,23 @@ static void ignoreRNGError(void *ctx ATTRIBUTE_UNUSED,
{}
-int
-virXMLValidateAgainstSchema(const char *schemafile,
- xmlDocPtr doc)
+virXMLValidatorPtr
+virXMLValidatorInit(const char *schemafile)
{
virXMLValidatorPtr validator = NULL;
- int ret = -1;
if (VIR_ALLOC(validator) < 0)
- return -1;
+ return NULL;
if (VIR_STRDUP(validator->schemafile, schemafile) < 0)
- goto cleanup;
+ goto error;
if (!(validator->rngParser =
xmlRelaxNGNewParserCtxt(validator->schemafile))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to create RNG parser for %s"),
validator->schemafile);
- goto cleanup;
+ goto error;
}
xmlRelaxNGSetParserErrors(validator->rngParser,
@@ -1135,20 +1133,37 @@ virXMLValidateAgainstSchema(const char *schemafile,
_("Unable to parse RNG %s: %s"),
validator->schemafile,
virBufferCurrentContent(&validator->buf));
- goto cleanup;
+ goto error;
}
if (!(validator->rngValid = xmlRelaxNGNewValidCtxt(validator->rng))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to create RNG validation context %s"),
validator->schemafile);
- goto cleanup;
+ goto error;
}
xmlRelaxNGSetValidErrors(validator->rngValid,
catchRNGError,
ignoreRNGError,
&validator->buf);
+ return validator;
+
+ error:
+ virXMLValidatorFree(validator);
+ return NULL;
+}
+
+
+int
+virXMLValidateAgainstSchema(const char *schemafile,
+ xmlDocPtr doc)
+{
+ virXMLValidatorPtr validator = NULL;
+ int ret = -1;
+
+ if (!(validator = virXMLValidatorInit(schemafile)))
+ return -1;
if (xmlRelaxNGValidateDoc(validator->rngValid, doc) != 0) {
virReportError(VIR_ERR_XML_INVALID_SCHEMA,
diff --git a/src/util/virxml.h b/src/util/virxml.h
index 607f063..6d4c991 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -187,6 +187,9 @@ typedef struct _virXMLValidator {
char *schemafile;
} virXMLValidator, *virXMLValidatorPtr;
+virXMLValidatorPtr
+virXMLValidatorInit(const char *schemafile);
+
int
virXMLValidateAgainstSchema(const char *schemafile,
xmlDocPtr xml);
--
2.7.3