From: Daniel Salzman Date: Wed, 15 May 2019 09:10:15 +0000 (+0200) Subject: knotc: return failed if semantic-check warning in the forced mode X-Git-Tag: v2.9.0~268^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e520ecacb1febb5be0c5beef0fb6fdd985fb97c;p=thirdparty%2Fknot-dns.git knotc: return failed if semantic-check warning in the forced mode --- diff --git a/src/knot/events/handlers/load.c b/src/knot/events/handlers/load.c index 407c0d592a..54379e82b9 100644 --- a/src/knot/events/handlers/load.c +++ b/src/knot/events/handlers/load.c @@ -82,7 +82,7 @@ int event_load(conf_t *conf, zone_t *zone) zone->zonefile.mtime.tv_nsec == mtime.tv_nsec); free(filename); if (ret == KNOT_EOK) { - ret = zone_load_contents(conf, zone->name, &zf_conts); + ret = zone_load_contents(conf, zone->name, &zf_conts, false); } if (ret != KNOT_EOK) { zf_conts = NULL; diff --git a/src/knot/zone/semantic-check.h b/src/knot/zone/semantic-check.h index a66c1291b8..7ceb7b1dc9 100644 --- a/src/knot/zone/semantic-check.h +++ b/src/knot/zone/semantic-check.h @@ -105,6 +105,7 @@ typedef void (*sem_callback) (sem_handler_t *ctx, const zone_contents_t *zone, struct sem_handler { sem_callback cb; bool fatal_error; + bool warning; }; /*! diff --git a/src/knot/zone/zone-load.c b/src/knot/zone/zone-load.c index cf7cfa0450..f99010ad9b 100644 --- a/src/knot/zone/zone-load.c +++ b/src/knot/zone/zone-load.c @@ -26,7 +26,7 @@ #include "libknot/libknot.h" int zone_load_contents(conf_t *conf, const knot_dname_t *zone_name, - zone_contents_t **contents) + zone_contents_t **contents, bool fail_on_warning) { if (conf == NULL || zone_name == NULL || contents == NULL) { return KNOT_EINVAL; @@ -54,6 +54,9 @@ int zone_load_contents(conf_t *conf, const knot_dname_t *zone_name, if (*contents == NULL) { return KNOT_ERROR; } + if (handler.warning && fail_on_warning) { + return KNOT_ESEMCHECK; + } zone_trees_unify_binodes((*contents)->nodes, (*contents)->nsec3_nodes); diff --git a/src/knot/zone/zone-load.h b/src/knot/zone/zone-load.h index 9fc5b4a425..fb8dcc7db8 100644 --- a/src/knot/zone/zone-load.h +++ b/src/knot/zone/zone-load.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 CZ.NIC, z.s.p.o. +/* Copyright (C) 2019 CZ.NIC, z.s.p.o. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,10 +26,14 @@ * \param conf * \param zone_name * \param contents - * \return KNOT_EOK or an error + * \param fail_on_warning + * + * \retval KNOT_EOK if success. + * \retval KNOT_ESEMCHECK if any semantic check warning. + * \retval KNOT_E* if error. */ int zone_load_contents(conf_t *conf, const knot_dname_t *zone_name, - zone_contents_t **contents); + zone_contents_t **contents, bool fail_on_warning); /*! * \brief Update zone contents from the journal. diff --git a/src/knot/zone/zonefile.c b/src/knot/zone/zonefile.c index d76c778b22..a8475a41fd 100644 --- a/src/knot/zone/zonefile.c +++ b/src/knot/zone/zonefile.c @@ -333,6 +333,10 @@ void err_handler_logger(sem_handler_t *handler, const zone_contents_t *zone, assert(handler != NULL); assert(zone != NULL); + if (!handler->fatal_error) { + handler->warning = true; + } + char buff[KNOT_DNAME_TXT_MAXLEN + 1] = ""; if (node != NULL) { (void)knot_dname_to_str(buff, node->owner, sizeof(buff)); diff --git a/src/utils/knotc/commands.c b/src/utils/knotc/commands.c index 0bf99f74c7..3c9c804db1 100644 --- a/src/utils/knotc/commands.c +++ b/src/utils/knotc/commands.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2018 CZ.NIC, z.s.p.o. +/* Copyright (C) 2019 CZ.NIC, z.s.p.o. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -556,19 +556,17 @@ static int zone_exec(cmd_args_t *args, int (*fcn)(const knot_dname_t *, void *), static int zone_check(const knot_dname_t *dname, void *data) { - UNUSED(data); + cmd_args_t *args = data; - zone_contents_t *contents; - int ret = zone_load_contents(conf(), dname, &contents); - if (ret == KNOT_EOK) { - zone_contents_deep_free(contents); - } + zone_contents_t *contents = NULL; + int ret = zone_load_contents(conf(), dname, &contents, args->force); + zone_contents_deep_free(contents); return ret; } static int cmd_zone_check(cmd_args_t *args) { - return zone_exec(args, zone_check, NULL); + return zone_exec(args, zone_check, args); } static int zone_memstats(const knot_dname_t *dname, void *data)