From: Mark Andrews Date: Fri, 8 Jun 2018 01:04:21 +0000 (+1000) Subject: Add support for marking a option as deprecated. X-Git-Tag: v9.11.4rc1~9^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34bfd20348e004bc41e30cc0fc00b54bc948f085;p=thirdparty%2Fbind9.git Add support for marking a option as deprecated. (cherry picked from commit befff9452ce89d0039d4534a572f92d9efd47522) --- diff --git a/CHANGES b/CHANGES index 144940673d5..eb56f7620fa 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4965. [func] Add support for marking options as deprecated. + [GL #322] + 4964. [bug] Reduce the probabilty of double signature when deleting a DNSKEY by checking if the node is otherwise signed by the algorithm of the key to be deleted. [GL #240] diff --git a/bin/named/config.c b/bin/named/config.c index 91badc7f85b..c158b2acf6c 100644 --- a/bin/named/config.c +++ b/bin/named/config.c @@ -27,6 +27,7 @@ #include +#include #include #include @@ -307,8 +308,9 @@ ns_config_parsedefaults(cfg_parser_t *parser, cfg_obj_t **conf) { isc_buffer_init(&b, defaultconf, sizeof(defaultconf) - 1); isc_buffer_add(&b, sizeof(defaultconf) - 1); - return (cfg_parse_buffer3(parser, &b, __FILE__, 0, - &cfg_type_namedconf, conf)); + return (cfg_parse_buffer4(parser, &b, __FILE__, 0, + &cfg_type_namedconf, + CFG_PCTX_NODEPRECATED, conf)); } isc_result_t diff --git a/lib/isccfg/include/isccfg/cfg.h b/lib/isccfg/include/isccfg/cfg.h index f725dc9004a..ac4b122de1b 100644 --- a/lib/isccfg/include/isccfg/cfg.h +++ b/lib/isccfg/include/isccfg/cfg.h @@ -121,6 +121,11 @@ isc_result_t cfg_parse_buffer3(cfg_parser_t *pctx, isc_buffer_t *buffer, const char *file, unsigned int line, const cfg_type_t *type, cfg_obj_t **ret); +isc_result_t +cfg_parse_buffer4(cfg_parser_t *pctx, isc_buffer_t *buffer, + const char *file, unsigned int line, + const cfg_type_t *type, unsigned int flags, + cfg_obj_t **ret); /*%< * Read a configuration containing data of type 'type' * and make '*ret' point to its parse tree. @@ -143,6 +148,7 @@ cfg_parse_buffer3(cfg_parser_t *pctx, isc_buffer_t *buffer, *\li "mem" is valid. *\li "type" is valid. *\li "cfg" is non-NULL and "*cfg" is NULL. + *\li "flags" be one or more of CFG_PCTX_NODEPRECATED or zero. * * Returns: * \li #ISC_R_SUCCESS - success diff --git a/lib/isccfg/include/isccfg/grammar.h b/lib/isccfg/include/isccfg/grammar.h index 5ea062d92d8..b0f2d761e22 100644 --- a/lib/isccfg/include/isccfg/grammar.h +++ b/lib/isccfg/include/isccfg/grammar.h @@ -52,6 +52,8 @@ /*% A configuration option that is ineffective due to * compile time options, but is harmless. */ #define CFG_CLAUSEFLAG_NOOP 0x00000200 +/*% Clause is obsolete in a future release */ +#define CFG_CLAUSEFLAG_DEPRECATED 0x00000400 /*% * Zone types for which a clause is valid: @@ -252,6 +254,7 @@ struct cfg_parser { /* Parser context flags */ #define CFG_PCTX_SKIP 0x1 +#define CFG_PCTX_NODEPRECATED 0x2 /*@{*/ /*% diff --git a/lib/isccfg/parser.c b/lib/isccfg/parser.c index ef6a92da480..540cc981aeb 100644 --- a/lib/isccfg/parser.c +++ b/lib/isccfg/parser.c @@ -615,7 +615,7 @@ isc_result_t cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer, const cfg_type_t *type, cfg_obj_t **ret) { - return (cfg_parse_buffer3(pctx, buffer, NULL, 0, type, ret)); + return (cfg_parse_buffer4(pctx, buffer, NULL, 0, type, 0, ret)); } isc_result_t @@ -623,13 +623,22 @@ cfg_parse_buffer2(cfg_parser_t *pctx, isc_buffer_t *buffer, const char *file, const cfg_type_t *type, cfg_obj_t **ret) { - return (cfg_parse_buffer3(pctx, buffer, file, 0, type, ret)); + return (cfg_parse_buffer4(pctx, buffer, file, 0, type, 0, ret)); } isc_result_t cfg_parse_buffer3(cfg_parser_t *pctx, isc_buffer_t *buffer, const char *file, unsigned int line, const cfg_type_t *type, cfg_obj_t **ret) +{ + return (cfg_parse_buffer4(pctx, buffer, file, line, type, 0, ret)); +} + +isc_result_t +cfg_parse_buffer4(cfg_parser_t *pctx, isc_buffer_t *buffer, + const char *file, unsigned int line, + const cfg_type_t *type, unsigned int flags, + cfg_obj_t **ret) { isc_result_t result; @@ -637,10 +646,12 @@ cfg_parse_buffer3(cfg_parser_t *pctx, isc_buffer_t *buffer, REQUIRE(type != NULL); REQUIRE(buffer != NULL); REQUIRE(ret != NULL && *ret == NULL); + REQUIRE((flags & ~(CFG_PCTX_NODEPRECATED)) == 0); CHECK(isc_lex_openbuffer(pctx->lexer, buffer)); pctx->buf_name = file; + pctx->flags = flags; if (line != 0U) CHECK(isc_lex_setsourceline(pctx->lexer, line)); @@ -1697,12 +1708,14 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) } done: if (clause == NULL || clause->name == NULL) { - cfg_parser_error(pctx, CFG_LOG_NOPREP, "unknown option"); + cfg_parser_error(pctx, CFG_LOG_NOPREP, + "unknown option"); /* * Try to recover by parsing this option as an unknown * option and discarding it. */ - CHECK(cfg_parse_obj(pctx, &cfg_type_unsupported, &eltobj)); + CHECK(cfg_parse_obj(pctx, &cfg_type_unsupported, + &eltobj)); cfg_obj_destroy(pctx, &eltobj); CHECK(parse_semicolon(pctx)); continue; @@ -1711,16 +1724,24 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) /* Clause is known. */ /* Issue warnings if appropriate */ - if ((clause->flags & CFG_CLAUSEFLAG_OBSOLETE) != 0) + if ((pctx->flags & CFG_PCTX_NODEPRECATED) == 0 && + (clause->flags & CFG_CLAUSEFLAG_DEPRECATED) != 0) + { + cfg_parser_warning(pctx, 0, "option '%s' is deprecated", + clause->name); + } + if ((clause->flags & CFG_CLAUSEFLAG_OBSOLETE) != 0) { cfg_parser_warning(pctx, 0, "option '%s' is obsolete", - clause->name); - if ((clause->flags & CFG_CLAUSEFLAG_NOTIMP) != 0) + clause->name); + } + if ((clause->flags & CFG_CLAUSEFLAG_NOTIMP) != 0) { cfg_parser_warning(pctx, 0, "option '%s' is " - "not implemented", clause->name); - if ((clause->flags & CFG_CLAUSEFLAG_NYI) != 0) + "not implemented", clause->name); + } + if ((clause->flags & CFG_CLAUSEFLAG_NYI) != 0) { cfg_parser_warning(pctx, 0, "option '%s' is " - "not implemented", clause->name); - + "not implemented", clause->name); + } if ((clause->flags & CFG_CLAUSEFLAG_NOOP) != 0) { cfg_parser_warning(pctx, 0, "option '%s' was not " "enabled at compile time "