From f392432c3effae561aefa223356367116c020cd5 Mon Sep 17 00:00:00 2001 From: pcarana Date: Mon, 27 Jul 2020 20:30:06 -0500 Subject: [PATCH] Send libxml log messages to configured validation log output --- src/common.c | 2 +- src/xml/relax_ng.c | 58 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/common.c b/src/common.c index 2059b9cc..64e2b4e7 100644 --- a/src/common.c +++ b/src/common.c @@ -336,7 +336,7 @@ remove_file(char const *path) errno = 0; error = remove(path); if (error) - return pr_op_errno(errno, "Couldn't delete %s", path); + return pr_val_errno(errno, "Couldn't delete %s", path); return 0; } diff --git a/src/xml/relax_ng.c b/src/xml/relax_ng.c index e99c4599..8e7f0985 100644 --- a/src/xml/relax_ng.c +++ b/src/xml/relax_ng.c @@ -8,9 +8,34 @@ #include "log.h" +#define LOG_MSG_LEN 512 + static xmlRelaxNGPtr schema; static xmlRelaxNGParserCtxtPtr rngparser; +#define VLOG_MSG(level) \ + char log_msg[LOG_MSG_LEN]; \ + va_list args; \ + va_start(args, msg); \ + vsnprintf(log_msg, LOG_MSG_LEN, msg, args); \ + va_end(args); \ + pr_val_##level("%s", log_msg); + +/* + * Log callbacks for libxml errors + */ +static void +relax_ng_log_err(void *ctx, const char *msg, ...) +{ + VLOG_MSG(err) +} + +static void +relax_ng_log_warn(void *ctx, const char *msg, ...) +{ + VLOG_MSG(warn) +} + /* Initialize global schema to parse RRDP files */ int relax_ng_init(void) @@ -21,20 +46,16 @@ relax_ng_init(void) rngparser = xmlRelaxNGNewMemParserCtxt(RRDP_V1_RNG, RRDP_V1_RNG_SIZE); if (rngparser == NULL) { - error = pr_val_err("xmlRelaxNGNewMemParserCtxt() returned NULL"); + error = pr_op_err("XML parser init error: xmlRelaxNGNewMemParserCtxt() returned NULL"); goto cleanup_parser; } schema = xmlRelaxNGParse(rngparser); if (schema == NULL) { - error = pr_val_err("xmlRelaxNGParse() returned NULL"); + error = pr_op_err("XML parser init error: xmlRelaxNGParse() returned NULL"); goto free_parser_ctx; } - /* - * FIXME (now) Use xmlRelaxNGValidityErrorFunc and - * xmlRelaxNGValidityWarningFunc? - */ return 0; free_parser_ctx: xmlRelaxNGFreeParserCtxt(rngparser); @@ -51,6 +72,7 @@ int relax_ng_parse(const char *path, xml_read_cb cb, void *arg) { xmlTextReaderPtr reader; + xmlRelaxNGValidCtxtPtr rngvalidctx; int read; int error; @@ -64,24 +86,42 @@ relax_ng_parse(const char *path, xml_read_cb cb, void *arg) goto free_reader; } + rngvalidctx = xmlRelaxNGNewValidCtxt(schema); + if (rngvalidctx == NULL) { + error = pr_val_err("xmlRelaxNGNewValidCtxt() returned NULL"); + goto free_reader; + } + + xmlRelaxNGSetValidErrors(rngvalidctx, relax_ng_log_err, + relax_ng_log_warn, NULL); + + error = xmlTextReaderRelaxNGValidateCtxt(reader, rngvalidctx, 1); + if (error) { + error = pr_val_err("Invalid XML document"); + goto free_valid_ctx; + } + while ((read = xmlTextReaderRead(reader)) == 1) { error = cb(reader, arg); if (error) - goto free_reader; + goto free_valid_ctx; } if (read < 0) { error = pr_val_err("Error parsing XML document."); - goto free_reader; + goto free_valid_ctx; } if (xmlTextReaderIsValid(reader) <= 0) { error = pr_val_err("XML document isn't valid."); - goto free_reader; + goto free_valid_ctx; } + xmlRelaxNGFreeValidCtxt(rngvalidctx); xmlFreeTextReader(reader); return 0; +free_valid_ctx: + xmlRelaxNGFreeValidCtxt(rngvalidctx); free_reader: xmlFreeTextReader(reader); return error; -- 2.47.2