]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Log (missing) XML reader errors
authorpcarana <pc.moreno2099@gmail.com>
Thu, 30 Jul 2020 18:59:00 +0000 (13:59 -0500)
committerpcarana <pc.moreno2099@gmail.com>
Thu, 30 Jul 2020 18:59:00 +0000 (13:59 -0500)
src/xml/relax_ng.c

index 0d97045bf779b9ca0655626bde7a817585469d9e..e917dd65e739319bc13c2c9a7012ad610d679e5e 100644 (file)
@@ -1,8 +1,8 @@
 #include "relax_ng.h"
 
-#include <libxml/xmlmemory.h>
 #include <libxml/parser.h>
 #include <libxml/relaxng.h>
+#include <libxml/xmlmemory.h>
 #include <errno.h>
 #include <stdlib.h>
 
@@ -36,6 +36,17 @@ relax_ng_log_warn(void *ctx, const char *msg, ...)
        VLOG_MSG(warn)
 }
 
+static void
+relax_ng_log_str_err(void *userData, xmlErrorPtr error)
+{
+       char *ptr;
+
+       ptr = error->message;
+       if (ptr[strlen(ptr) - 1] == '\n')
+               ptr[strlen(ptr) - 1] = '\0';
+       pr_val_err("%s (at line %d)", ptr, error->line);
+}
+
 /* Initialize global schema to parse RRDP files */
 int
 relax_ng_init(void)
@@ -50,15 +61,15 @@ relax_ng_init(void)
                goto cleanup_parser;
        }
 
+       xmlRelaxNGSetParserErrors(rngparser, relax_ng_log_err,
+           relax_ng_log_warn, NULL);
+
        schema = xmlRelaxNGParse(rngparser);
        if (schema == NULL) {
                error = pr_op_err("XML parser init error: xmlRelaxNGParse() returned NULL");
                goto free_parser_ctx;
        }
 
-       xmlRelaxNGSetParserErrors(rngparser, relax_ng_log_err,
-           relax_ng_log_warn, NULL);
-
        return 0;
 free_parser_ctx:
        xmlRelaxNGFreeParserCtxt(rngparser);
@@ -104,6 +115,9 @@ relax_ng_parse(const char *path, xml_read_cb cb, void *arg)
                goto free_valid_ctx;
        }
 
+       xmlTextReaderSetStructuredErrorHandler(reader, relax_ng_log_str_err,
+           NULL);
+
        while ((read = xmlTextReaderRead(reader)) == 1) {
                error = cb(reader, arg);
                if (error)