]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Send libxml log messages to configured validation log output
authorpcarana <pc.moreno2099@gmail.com>
Tue, 28 Jul 2020 01:30:06 +0000 (20:30 -0500)
committerpcarana <pc.moreno2099@gmail.com>
Tue, 28 Jul 2020 01:30:06 +0000 (20:30 -0500)
src/common.c
src/xml/relax_ng.c

index 2059b9ccaba8f9f64da5ca038c3a2a6915ee5efe..64e2b4e7a8249919ad171a04afbde2e7bd36684d 100644 (file)
@@ -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;
 }
index e99c4599005c314c635b8c05e7883db46aea3a6c..8e7f0985c027a351e1e60d4c00c8e560a38abf6e 100644 (file)
@@ -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;