]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add support for marking a option as deprecated.
authorMark Andrews <marka@isc.org>
Fri, 8 Jun 2018 01:04:21 +0000 (11:04 +1000)
committerMark Andrews <marka@isc.org>
Fri, 8 Jun 2018 05:56:01 +0000 (15:56 +1000)
(cherry picked from commit befff9452ce89d0039d4534a572f92d9efd47522)

CHANGES
bin/named/config.c
lib/isccfg/include/isccfg/cfg.h
lib/isccfg/include/isccfg/grammar.h
lib/isccfg/parser.c

diff --git a/CHANGES b/CHANGES
index 144940673d574beb9341631b3e4b1770d9e2bc05..eb56f7620fa1c617c8b96c0525aad29f4b71762d 100644 (file)
--- 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]
index 91badc7f85b338fb4f4f97da38ac6be994eb6d1b..c158b2acf6c30fe465b7bc80cca8855623fd7d38 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <pk11/site.h>
 
+#include <isccfg/grammar.h>
 #include <isccfg/namedconf.h>
 
 #include <dns/fixedname.h>
@@ -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
index f725dc9004a4847f74f74c1a960e80b5d40554a9..ac4b122de1b39945f7016b8e671e01c23bce319f 100644 (file)
@@ -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
index 5ea062d92d8789ae1edc9aba19a2cb3c67485c28..b0f2d761e22f681fee5af4bc5cd215f4ba7b5fa8 100644 (file)
@@ -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
 
 /*@{*/
 /*%
index ef6a92da480bfaae5ba2f6d953b9672acf111cda..540cc981aebbd17f526dd35fe04ef60c222278ed 100644 (file)
@@ -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 "