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.10.8rc1~7^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99ac87cac4b27753d44c1ee08bddbc1e12ee2396;p=thirdparty%2Fbind9.git Add support for marking a option as deprecated. (cherry picked from commit befff9452ce89d0039d4534a572f92d9efd47522) --- diff --git a/CHANGES b/CHANGES index 104a13134c3..69e96d7a778 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 22fc82cc3a9..5aeb6a9d42e 100644 --- a/bin/named/config.c +++ b/bin/named/config.c @@ -32,6 +32,7 @@ #include +#include #include #include @@ -289,7 +290,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_buffer(parser, &b, &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 a13d5f433ad..3b2f39c0cd6 100644 --- a/lib/isccfg/include/isccfg/cfg.h +++ b/lib/isccfg/include/isccfg/cfg.h @@ -14,8 +14,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: cfg.h,v 1.46 2010/08/13 23:47:04 tbox Exp $ */ - #ifndef ISCCFG_CFG_H #define ISCCFG_CFG_H 1 @@ -120,6 +118,11 @@ cfg_parse_file(cfg_parser_t *pctx, const char *filename, isc_result_t cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer, 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. @@ -135,6 +138,7 @@ cfg_parse_buffer(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 333ae47cad0..524e50fb235 100644 --- a/lib/isccfg/include/isccfg/grammar.h +++ b/lib/isccfg/include/isccfg/grammar.h @@ -14,8 +14,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: grammar.h,v 1.24 2011/01/04 23:47:14 tbox Exp $ */ - #ifndef ISCCFG_GRAMMAR_H #define ISCCFG_GRAMMAR_H 1 @@ -56,6 +54,8 @@ #define CFG_CLAUSEFLAG_NOTCONFIGURED 0x00000080 /*% A option for a experimental feature. */ #define CFG_CLAUSEFLAG_EXPERIMENTAL 0x00000100 +/*% Clause is obsolete in a future release */ +#define CFG_CLAUSEFLAG_DEPRECATED 0x00000400 typedef struct cfg_clausedef cfg_clausedef_t; typedef struct cfg_tuplefielddef cfg_tuplefielddef_t; @@ -234,6 +234,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 45f8fc0f0f0..249344bac04 100644 --- a/lib/isccfg/parser.c +++ b/lib/isccfg/parser.c @@ -581,14 +581,30 @@ cfg_parse_file(cfg_parser_t *pctx, const char *filename, 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_buffer4(pctx, buffer, NULL, 0, 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; REQUIRE(pctx != NULL); REQUIRE(type != NULL); REQUIRE(buffer != NULL); REQUIRE(ret != NULL && *ret == NULL); + REQUIRE((flags & ~(CFG_PCTX_NODEPRECATED)) == 0); + + UNUSED(file); + UNUSED(line); CHECK(isc_lex_openbuffer(pctx->lexer, buffer)); + + pctx->flags = flags; + CHECK(parse2(pctx, type, ret)); cleanup: return (result); @@ -1501,12 +1517,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; @@ -1515,15 +1533,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_NOTCONFIGURED) != 0) { cfg_parser_warning(pctx, 0, "option '%s' was not "