#include <pk11/site.h>
+#include <isccfg/grammar.h>
#include <isccfg/namedconf.h>
#include <dns/fixedname.h>
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
* 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
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.
*\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
* 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
#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;
/* Parser context flags */
#define CFG_PCTX_SKIP 0x1
+#define CFG_PCTX_NODEPRECATED 0x2
/*@{*/
/*%
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);
}
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;
/* 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 "