mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
add a parser to filter-aaaa.so and pass in the parameters
- make some cfg-parsing functions global so they can be run from filter-aaaa.so - add filter-aaaa options to the hook module's parser - mark filter-aaaa options in named.conf as obsolete, remove from named and checkconf, and update the filter-aaaa test not to use checkconf anymore - remove filter-aaaa-related struct members from dns_view
This commit is contained in:
@@ -1192,6 +1192,58 @@ cfg_doc_enum(cfg_printer_t *pctx, const cfg_type_t *type) {
|
||||
cfg_print_cstr(pctx, " )");
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
cfg_parse_enum_or_other(cfg_parser_t *pctx, const cfg_type_t *enumtype,
|
||||
const cfg_type_t *othertype, cfg_obj_t **ret)
|
||||
{
|
||||
isc_result_t result;
|
||||
CHECK(cfg_peektoken(pctx, 0));
|
||||
if (pctx->token.type == isc_tokentype_string &&
|
||||
cfg_is_enum(TOKEN_STRING(pctx), enumtype->of))
|
||||
{
|
||||
CHECK(cfg_parse_enum(pctx, enumtype, ret));
|
||||
} else {
|
||||
CHECK(cfg_parse_obj(pctx, othertype, ret));
|
||||
}
|
||||
cleanup:
|
||||
return (result);
|
||||
}
|
||||
|
||||
void
|
||||
cfg_doc_enum_or_other(cfg_printer_t *pctx, const cfg_type_t *enumtype,
|
||||
const cfg_type_t *othertype)
|
||||
{
|
||||
const char * const *p;
|
||||
bool first = true;
|
||||
|
||||
/*
|
||||
* If othertype is cfg_type_void, it means that enumtype is
|
||||
* optional.
|
||||
*/
|
||||
|
||||
if (othertype == &cfg_type_void) {
|
||||
cfg_print_cstr(pctx, "[ ");
|
||||
}
|
||||
cfg_print_cstr(pctx, "( ");
|
||||
for (p = enumtype->of; *p != NULL; p++) {
|
||||
if (!first) {
|
||||
cfg_print_cstr(pctx, " | ");
|
||||
}
|
||||
first = false;
|
||||
cfg_print_cstr(pctx, *p);
|
||||
}
|
||||
if (othertype != &cfg_type_void) {
|
||||
if (!first) {
|
||||
cfg_print_cstr(pctx, " | ");
|
||||
}
|
||||
cfg_doc_terminal(pctx, othertype);
|
||||
}
|
||||
cfg_print_cstr(pctx, " )");
|
||||
if (othertype == &cfg_type_void) {
|
||||
cfg_print_cstr(pctx, " ]");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cfg_print_ustring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
|
||||
REQUIRE(pctx != NULL);
|
||||
@@ -1274,6 +1326,101 @@ LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_bracketed_text = {
|
||||
&cfg_rep_string, NULL
|
||||
};
|
||||
|
||||
/*%
|
||||
* A bracketed address match list
|
||||
*/
|
||||
|
||||
static cfg_type_t cfg_type_addrmatchelt;
|
||||
static cfg_type_t cfg_type_negated;
|
||||
|
||||
static isc_result_t
|
||||
parse_addrmatchelt(cfg_parser_t *pctx, const cfg_type_t *type,
|
||||
cfg_obj_t **ret)
|
||||
{
|
||||
isc_result_t result;
|
||||
UNUSED(type);
|
||||
|
||||
CHECK(cfg_peektoken(pctx, CFG_LEXOPT_QSTRING));
|
||||
|
||||
if (pctx->token.type == isc_tokentype_string ||
|
||||
pctx->token.type == isc_tokentype_qstring) {
|
||||
if (pctx->token.type == isc_tokentype_string &&
|
||||
(strcasecmp(TOKEN_STRING(pctx), "key") == 0)) {
|
||||
CHECK(cfg_parse_obj(pctx, &cfg_type_keyref, ret));
|
||||
} else if (pctx->token.type == isc_tokentype_string &&
|
||||
(strcasecmp(TOKEN_STRING(pctx), "geoip") == 0)) {
|
||||
#ifdef HAVE_GEOIP
|
||||
CHECK(cfg_gettoken(pctx, 0));
|
||||
CHECK(cfg_parse_obj(pctx, &cfg_type_geoip, ret));
|
||||
#else
|
||||
cfg_parser_error(pctx, CFG_LOG_NEAR, "'geoip' "
|
||||
"not supported in this build");
|
||||
return (ISC_R_UNEXPECTEDTOKEN);
|
||||
#endif
|
||||
} else {
|
||||
if (cfg_lookingat_netaddr(pctx, CFG_ADDR_V4OK |
|
||||
CFG_ADDR_V4PREFIXOK |
|
||||
CFG_ADDR_V6OK))
|
||||
{
|
||||
CHECK(cfg_parse_netprefix(pctx, NULL, ret));
|
||||
} else {
|
||||
CHECK(cfg_parse_astring(pctx, NULL, ret));
|
||||
}
|
||||
}
|
||||
} else if (pctx->token.type == isc_tokentype_special) {
|
||||
if (pctx->token.value.as_char == '{') {
|
||||
/* Nested match list. */
|
||||
CHECK(cfg_parse_obj(pctx,
|
||||
&cfg_type_bracketed_aml, ret));
|
||||
} else if (pctx->token.value.as_char == '!') {
|
||||
CHECK(cfg_gettoken(pctx, 0)); /* read "!" */
|
||||
CHECK(cfg_parse_obj(pctx, &cfg_type_negated, ret));
|
||||
} else {
|
||||
goto bad;
|
||||
}
|
||||
} else {
|
||||
bad:
|
||||
cfg_parser_error(pctx, CFG_LOG_NEAR,
|
||||
"expected IP match list element");
|
||||
return (ISC_R_UNEXPECTEDTOKEN);
|
||||
}
|
||||
cleanup:
|
||||
return (result);
|
||||
}
|
||||
|
||||
/*%
|
||||
* A negated address match list element (like "! 10.0.0.1").
|
||||
* Somewhat sneakily, the caller is expected to parse the
|
||||
* "!", but not to print it.
|
||||
*/
|
||||
static cfg_tuplefielddef_t negated_fields[] = {
|
||||
{ "negated", &cfg_type_addrmatchelt, 0 },
|
||||
{ NULL, NULL, 0 }
|
||||
};
|
||||
|
||||
static void
|
||||
print_negated(cfg_printer_t *pctx, const cfg_obj_t *obj) {
|
||||
cfg_print_cstr(pctx, "!");
|
||||
cfg_print_tuple(pctx, obj);
|
||||
}
|
||||
|
||||
static cfg_type_t cfg_type_negated = {
|
||||
"negated", cfg_parse_tuple, print_negated, NULL, &cfg_rep_tuple,
|
||||
&negated_fields
|
||||
};
|
||||
|
||||
/*% An address match list element */
|
||||
|
||||
static cfg_type_t cfg_type_addrmatchelt = {
|
||||
"address_match_element", parse_addrmatchelt, NULL, cfg_doc_terminal,
|
||||
NULL, NULL
|
||||
};
|
||||
|
||||
LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_bracketed_aml = {
|
||||
"bracketed_aml", cfg_parse_bracketed_list, cfg_print_bracketed_list,
|
||||
cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_addrmatchelt
|
||||
};
|
||||
|
||||
/*
|
||||
* Optional bracketed text
|
||||
*/
|
||||
@@ -2045,6 +2192,7 @@ static struct flagtext {
|
||||
{ CFG_CLAUSEFLAG_MULTI, "may occur multiple times" },
|
||||
{ CFG_CLAUSEFLAG_EXPERIMENTAL, "experimental" },
|
||||
{ CFG_CLAUSEFLAG_NOOP, "non-operational" },
|
||||
{ CFG_CLAUSEFLAG_DEPRECATED, "deprecated" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user