diff --git a/CHANGES b/CHANGES index b770373b75..3a2037ced4 100644 --- a/CHANGES +++ b/CHANGES @@ -6,7 +6,7 @@ 1597. [placeholder] rt6496a -1596. [placeholder] rt10150 +1596. [func] Accept 'notify-source' style syntax for query-source. 1595. [placeholder] rt9164 diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 69801b9998..502ef8fa2c 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -2,7 +2,7 @@ - + BIND 9 Administrator Reference Manual @@ -2774,8 +2774,8 @@ statement in the named.conf file: avoid-v6-udp-ports { port_list }; listen-on port ip_port { address_match_list }; listen-on-v6 port ip_port { address_match_list }; - query-source address ( ip_addr | * ) port ( ip_port | * ) ; - query-source-v6 address ( ip_addr | * ) port ( ip_port | * ) ; + query-source ( ( ip4_addr | * ) port ( ip_port | * ) | address ( ip4_addr | * ) port ( ip_port | * ) ) ; + query-source-v6 ( ( ip6_addr | * ) port ( ip_port | * ) | address ( ip6_addr | * ) port ( ip_port | * ) ) ; max-transfer-time-in number; max-transfer-time-out number; max-transfer-idle-in number; diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c index 291893f939..4649a3f113 100644 --- a/lib/isccfg/namedconf.c +++ b/lib/isccfg/namedconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: namedconf.c,v 1.30 2004/03/10 02:19:58 marka Exp $ */ +/* $Id: namedconf.c,v 1.30.18.1 2004/03/30 02:04:47 marka Exp $ */ #include @@ -1219,24 +1219,24 @@ static cfg_type_t cfg_type_optional_class = { }; static isc_result_t -parse_querysource(cfg_parser_t *pctx, int flags, cfg_obj_t **ret) { +parse_querysource(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { isc_result_t result; cfg_obj_t *obj = NULL; isc_netaddr_t netaddr; in_port_t port; unsigned int have_address = 0; unsigned int have_port = 0; + const unsigned int *flagp = type->of; - if ((flags & CFG_ADDR_V4OK) != 0) + if ((*flagp & CFG_ADDR_V4OK) != 0) isc_netaddr_any(&netaddr); - else if ((flags & CFG_ADDR_V6OK) != 0) + else if ((*flagp & CFG_ADDR_V6OK) != 0) isc_netaddr_any6(&netaddr); else INSIST(0); port = 0; - CHECK(cfg_create_obj(pctx, &cfg_type_querysource, &obj)); for (;;) { CHECK(cfg_peektoken(pctx, 0)); if (pctx->token.type == isc_tokentype_string) { @@ -1245,8 +1245,7 @@ parse_querysource(cfg_parser_t *pctx, int flags, cfg_obj_t **ret) { { /* read "address" */ CHECK(cfg_gettoken(pctx, 0)); - CHECK(cfg_parse_rawaddr(pctx, - flags | CFG_ADDR_WILDOK, + CHECK(cfg_parse_rawaddr(pctx, *flagp, &netaddr)); have_address++; } else if (strcasecmp(TOKEN_STRING(pctx), "port") == 0) @@ -1257,6 +1256,8 @@ parse_querysource(cfg_parser_t *pctx, int flags, cfg_obj_t **ret) { CFG_ADDR_WILDOK, &port)); have_port++; + } else if (have_port == 0 && have_address == 0) { + return (cfg_parse_sockaddr(pctx, type, ret)); } else { cfg_parser_error(pctx, CFG_LOG_NEAR, "expected 'address' or 'port'"); @@ -1271,6 +1272,7 @@ parse_querysource(cfg_parser_t *pctx, int flags, cfg_obj_t **ret) { return (ISC_R_UNEXPECTEDTOKEN); } + CHECK(cfg_create_obj(pctx, &cfg_type_querysource, &obj)); isc_sockaddr_fromnetaddr(&obj->value.sockaddr, &netaddr, port); *ret = obj; return (ISC_R_SUCCESS); @@ -1281,18 +1283,6 @@ parse_querysource(cfg_parser_t *pctx, int flags, cfg_obj_t **ret) { return (result); } -static isc_result_t -parse_querysource4(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { - UNUSED(type); - return (parse_querysource(pctx, CFG_ADDR_V4OK, ret)); -} - -static isc_result_t -parse_querysource6(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { - UNUSED(type); - return (parse_querysource(pctx, CFG_ADDR_V6OK, ret)); -} - static void print_querysource(cfg_printer_t *pctx, cfg_obj_t *obj) { isc_netaddr_t na; @@ -1303,16 +1293,21 @@ print_querysource(cfg_printer_t *pctx, cfg_obj_t *obj) { cfg_print_rawuint(pctx, isc_sockaddr_getport(&obj->value.sockaddr)); } +static unsigned int sockaddr4wild_flags = CFG_ADDR_WILDOK | CFG_ADDR_V4OK; +static unsigned int sockaddr6wild_flags = CFG_ADDR_WILDOK | CFG_ADDR_V6OK; static cfg_type_t cfg_type_querysource4 = { - "querysource4", parse_querysource4, NULL, cfg_doc_terminal, - NULL, NULL + "querysource4", parse_querysource, NULL, cfg_doc_terminal, + NULL, &sockaddr4wild_flags }; + static cfg_type_t cfg_type_querysource6 = { - "querysource6", parse_querysource6, NULL, cfg_doc_terminal, - NULL, NULL + "querysource6", parse_querysource, NULL, cfg_doc_terminal, + NULL, &sockaddr6wild_flags }; + static cfg_type_t cfg_type_querysource = { - "querysource", NULL, print_querysource, NULL, &cfg_rep_sockaddr, NULL }; + "querysource", NULL, print_querysource, NULL, &cfg_rep_sockaddr, NULL +}; /* addrmatchelt */ @@ -1605,13 +1600,11 @@ static cfg_type_t cfg_type_logfile = { }; /* An IPv4/IPv6 address with optional port, "*" accepted as wildcard. */ -static unsigned int sockaddr4wild_flags = CFG_ADDR_WILDOK | CFG_ADDR_V4OK; static cfg_type_t cfg_type_sockaddr4wild = { "sockaddr4wild", cfg_parse_sockaddr, cfg_print_sockaddr, cfg_doc_sockaddr, &cfg_rep_sockaddr, &sockaddr4wild_flags }; -static unsigned int sockaddr6wild_flags = CFG_ADDR_WILDOK | CFG_ADDR_V6OK; static cfg_type_t cfg_type_sockaddr6wild = { "v6addrportwild", cfg_parse_sockaddr, cfg_print_sockaddr, cfg_doc_sockaddr, &cfg_rep_sockaddr, &sockaddr6wild_flags