diff --git a/bin/tests/named.conf b/bin/tests/named.conf index b22dfaacf0..d6fe7e5cea 100644 --- a/bin/tests/named.conf +++ b/bin/tests/named.conf @@ -245,6 +245,10 @@ view "test-view" in { allow-update-forwarding { 10.0.0.34;}; file "view-zone-master"; }; + + server 5.6.7.8 { + keys "viewkey"; + }; }; key "non-viewkey" { secret "aaa" ; algorithm "zzz" ; }; diff --git a/lib/dns/config/confcommon.c b/lib/dns/config/confcommon.c index e6c4e195f9..2306b851dc 100644 --- a/lib/dns/config/confcommon.c +++ b/lib/dns/config/confcommon.c @@ -15,7 +15,7 @@ * SOFTWARE. */ -/* $Id: confcommon.c,v 1.21 2000/04/06 09:35:36 brister Exp $ */ +/* $Id: confcommon.c,v 1.22 2000/04/07 17:40:40 brister Exp $ */ #include @@ -610,7 +610,7 @@ dns_c_need_quote(const char *string) void dns_c_peerlist_print(FILE *fp, int indent, - dns_peerlist_t *servers) + dns_peerlist_t *servers) { dns_peer_t *server; diff --git a/lib/dns/config/confctx.c b/lib/dns/config/confctx.c index a9653cbcaf..8afecd14c0 100644 --- a/lib/dns/config/confctx.c +++ b/lib/dns/config/confctx.c @@ -15,7 +15,7 @@ * SOFTWARE. */ -/* $Id: confctx.c,v 1.46 2000/04/06 20:10:56 brister Exp $ */ +/* $Id: confctx.c,v 1.47 2000/04/07 17:40:40 brister Exp $ */ #include @@ -692,7 +692,54 @@ dns_c_ctx_getcurrview(dns_c_ctx_t *cfg) return (cfg->currview); } + + +isc_result_t +dns_c_ctx_getpeerlist(dns_c_ctx_t *cfg, dns_peerlist_t **retval) +{ + REQUIRE(DNS_C_CONFCTX_VALID(cfg)); + REQUIRE(retval != NULL); + if (cfg->peers == NULL) { + *retval = NULL; + return (ISC_R_NOTFOUND); + } else { + dns_peerlist_attach(cfg->peers, retval); + return (ISC_R_SUCCESS); + } +} + + +isc_result_t +dns_c_ctx_unsetpeerlist(dns_c_ctx_t *cfg) +{ + REQUIRE(DNS_C_CONFCTX_VALID(cfg)); + + if (cfg->peers != NULL) { + dns_peerlist_detach(&cfg->peers); + return (ISC_R_SUCCESS); + } else { + return (ISC_R_FAILURE); + } +} + + +isc_result_t +dns_c_ctx_setpeerlist(dns_c_ctx_t *cfg, dns_peerlist_t *newval) +{ + REQUIRE(DNS_C_CONFCTX_VALID(cfg)); + + if (cfg->peers != NULL) { + dns_peerlist_detach(&cfg->peers); + } + + dns_peerlist_attach(newval, &cfg->peers); + + return (ISC_R_SUCCESS); +} + + + void dns_c_ctx_print(FILE *fp, int indent, dns_c_ctx_t *cfg) diff --git a/lib/dns/config/confparser.y b/lib/dns/config/confparser.y index 85181a2ee3..714d5cfc9b 100644 --- a/lib/dns/config/confparser.y +++ b/lib/dns/config/confparser.y @@ -16,7 +16,7 @@ * SOFTWARE. */ -/* $Id: confparser.y,v 1.61 2000/04/07 13:35:05 brister Exp $ */ +/* $Id: confparser.y,v 1.62 2000/04/07 17:40:41 brister Exp $ */ #include @@ -115,6 +115,9 @@ static void parser_complain(isc_boolean_t is_warning, static isc_boolean_t unit_to_uint32(char *in, isc_uint32_t *out); static char * token_to_keyword(int token); static void yyerror(const char *); +static dns_peerlist_t *currentPeerList(dns_c_ctx_t *cfg, + isc_boolean_t createIfNeeded); + /* returns true if (base * mult) would be too big.*/ static isc_boolean_t int_too_big(isc_uint32_t base, isc_uint32_t mult); @@ -2193,22 +2196,11 @@ category_name: any_string server_stmt: L_SERVER ip_address { - dns_peer_t *peer; - dns_peerlist_t *peers = currcfg->peers; isc_netaddr_t netaddr; + dns_peer_t *peer = NULL; + dns_peerlist_t *peers = currentPeerList(currcfg, ISC_TRUE); isc_netaddr_fromsockaddr(&netaddr, &$2); - - if (peers == NULL) { - tmpres = dns_peerlist_new(currcfg->mem, - &currcfg->peers); - if (tmpres != ISC_R_SUCCESS) { - parser_error(ISC_FALSE, - "failed to create peer list"); - YYABORT; - } - peers = currcfg->peers; - } /* * Check that this IP hasn't already been used. @@ -2227,7 +2219,8 @@ server_stmt: L_SERVER ip_address YYABORT; } - dns_peerlist_addpeer(currcfg->peers, peer); + dns_peerlist_addpeer(peers, peer); + dns_peerlist_detach(&peers); dns_peer_detach(&peer); } L_LBRACE server_info_list L_RBRACE @@ -2240,12 +2233,18 @@ server_info_list: server_info L_EOS server_info: L_BOGUS yea_or_nay { dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); - dns_peerlist_currpeer(currcfg->peers, &peer); INSIST(peer != NULL); tmpres = dns_peer_setbogus(peer, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); + if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, "redefining server bogus value"); @@ -2262,12 +2261,18 @@ server_info: L_BOGUS yea_or_nay * Backwards compatibility, equivalent to request-ixfr. */ dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); - dns_peerlist_currpeer(currcfg->peers, &peer); INSIST(peer != NULL); tmpres = dns_peer_setrequestixfr(peer, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); + if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, "redefining peer request-ixfr value"); @@ -2281,12 +2286,18 @@ server_info: L_BOGUS yea_or_nay | L_PROVIDE_IXFR yea_or_nay { dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); - dns_peerlist_currpeer(currcfg->peers, &peer); INSIST(peer != NULL); tmpres = dns_peer_setprovideixfr(peer, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); + if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, "redefining peer provide-ixfr value"); @@ -2300,12 +2311,18 @@ server_info: L_BOGUS yea_or_nay | L_REQUEST_IXFR yea_or_nay { dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); - dns_peerlist_currpeer(currcfg->peers, &peer); INSIST(peer != NULL); tmpres = dns_peer_setrequestixfr(peer, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); + if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, "redefining peer request-ixfr value"); @@ -2319,12 +2336,18 @@ server_info: L_BOGUS yea_or_nay | L_TRANSFERS L_INTEGER { dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); - dns_peerlist_currpeer(currcfg->peers, &peer); INSIST(peer != NULL); tmpres = dns_peer_settransfers(peer, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); + if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, "redefining peer transfers value"); @@ -2337,12 +2360,18 @@ server_info: L_BOGUS yea_or_nay | L_TRANSFER_FORMAT transfer_format { dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); - dns_peerlist_currpeer(currcfg->peers, &peer); INSIST(peer != NULL); tmpres = dns_peer_settransferformat(peer, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); + if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, "redefining peer transfer-format " @@ -2355,14 +2384,18 @@ server_info: L_BOGUS yea_or_nay } } | L_KEYS key_value { - dns_peer_t *peer = NULL; dns_name_t *name = NULL; + dns_peer_t *peer = NULL; + dns_peerlist_t *peerlist = currentPeerList(currcfg, ISC_FALSE); + + REQUIRE(peerlist != NULL); + + dns_peerlist_currpeer(peerlist, &peer); + + INSIST(peer != NULL); /* XXX need to validate key exists */ - dns_peerlist_currpeer(currcfg->peers, &peer); - INSIST(peer != NULL); - tmpres = dns_c_charptoname(peer->mem, $2, &name); if (tmpres != ISC_R_SUCCESS) { parser_error(ISC_FALSE, @@ -2373,6 +2406,7 @@ server_info: L_BOGUS yea_or_nay tmpres = dns_peer_setkey(peer, &name); isc_mem_free(memctx, $2); dns_peer_detach(&peer); + dns_peerlist_detach(&peerlist); if (tmpres == ISC_R_EXISTS) { parser_warning(ISC_FALSE, @@ -3319,6 +3353,7 @@ view_option: L_FORWARD zone_forward_opt } | key_stmt | zone_stmt + | server_stmt ; @@ -5266,3 +5301,45 @@ is_ip4addr(const char *string, struct in_addr *addr) } return ISC_TRUE; } + + + +static dns_peerlist_t * +currentPeerList(dns_c_ctx_t *cfg, isc_boolean_t createIfNeeded) +{ + dns_peerlist_t *peers = NULL; + dns_c_view_t *view = NULL; + isc_result_t result; + + view = dns_c_ctx_getcurrview(cfg); + + if (view == NULL) { + result = dns_c_ctx_getpeerlist(cfg, &peers); + } else { + result = dns_c_view_getpeerlist(view, &peers); + } + + if (result == ISC_R_NOTFOUND && createIfNeeded) { + result = dns_peerlist_new(currcfg->mem, &peers); + if (tmpres != ISC_R_SUCCESS) { + parser_error(ISC_FALSE, "failed to create peer list"); + return NULL; + } + + if (view == NULL) { + dns_c_ctx_setpeerlist(currcfg, peers); + } else { + dns_c_view_setpeerlist(view, peers); + } + } else if (result == ISC_R_NOTFOUND) { + /* nothing */ + } else if (result != ISC_R_SUCCESS) { + REQUIRE(result == ISC_R_SUCCESS); + } + + return peers; +} + + + + diff --git a/lib/dns/config/confview.c b/lib/dns/config/confview.c index 64b78cbc04..703470cf09 100644 --- a/lib/dns/config/confview.c +++ b/lib/dns/config/confview.c @@ -15,7 +15,7 @@ * SOFTWARE. */ -/* $Id: confview.c,v 1.20 2000/04/07 13:35:06 brister Exp $ */ +/* $Id: confview.c,v 1.21 2000/04/07 17:40:42 brister Exp $ */ #include @@ -31,6 +31,7 @@ #include #include #include +#include #include "confpvt.h" @@ -504,6 +505,7 @@ dns_c_view_new(isc_mem_t *mem, const char *name, dns_rdataclass_t viewclass, view->transfer_format = NULL; view->keydefs = NULL; + view->peerlist = NULL; #if 0 view->max_transfer_time_in = NULL; @@ -675,7 +677,11 @@ dns_c_view_print(FILE *fp, int indent, dns_c_view_t *view) if (view->keydefs != NULL) { dns_c_kdeflist_print(fp, indent + 1, view->keydefs); } - + + if (view->peerlist != NULL) { + dns_c_peerlist_print(fp, indent + 1, view->peerlist); + } + #if 0 PRINT_INT32(max_transfer_time_in, "max-transfer-time-in"); @@ -778,6 +784,7 @@ dns_c_view_delete(dns_c_view_t **viewptr) FREEFIELD(transfer_format); dns_c_view_unsetkeydefs(view); + dns_c_view_unsetpeerlist(view); #if 0 FREEFIELD(max_transfer_time_in); @@ -1201,6 +1208,57 @@ dns_c_view_unsetkeydefs(dns_c_view_t *view) } +/* +** +*/ + +isc_result_t +dns_c_view_getpeerlist(dns_c_view_t *view, dns_peerlist_t **retval) +{ + REQUIRE(DNS_C_VIEW_VALID(view)); + REQUIRE(retval != NULL); + + if (view->peerlist == NULL) { + *retval = NULL; + return (ISC_R_NOTFOUND); + } else { + dns_peerlist_attach(view->peerlist, retval); + return (ISC_R_SUCCESS); + } +} + + +isc_result_t +dns_c_view_unsetpeerlist(dns_c_view_t *view) +{ + REQUIRE(DNS_C_VIEW_VALID(view)); + + if (view->peerlist != NULL) { + dns_peerlist_detach(&view->peerlist); + return (ISC_R_SUCCESS); + } else { + return (ISC_R_FAILURE); + } +} + + +isc_result_t +dns_c_view_setpeerlist(dns_c_view_t *view, dns_peerlist_t *newval) +{ + REQUIRE(DNS_C_VIEW_VALID(view)); + + if (view->peerlist != NULL) { + dns_peerlist_detach(&view->peerlist); + } + + dns_peerlist_attach(newval, &view->peerlist); + + return (ISC_R_SUCCESS); +} + + + + GETIPMLIST(allowquery, allowquery) SETIPMLIST(allowquery, allowquery) diff --git a/lib/dns/include/dns/confctx.h b/lib/dns/include/dns/confctx.h index dfcfa7e5b4..78128f7604 100644 --- a/lib/dns/include/dns/confctx.h +++ b/lib/dns/include/dns/confctx.h @@ -239,6 +239,15 @@ isc_result_t dns_c_ctx_getoptions(dns_c_ctx_t *cfg, dns_c_options_t **options); isc_result_t dns_c_ctx_unsetoptions(dns_c_ctx_t *cfg); +/* detach when done with retval */ +isc_result_t dns_c_ctx_getpeerlist(dns_c_ctx_t *cfg, + dns_peerlist_t **retval); +/* cfg will attach to newval */ +isc_result_t dns_c_ctx_setpeerlist(dns_c_ctx_t *cfg, + dns_peerlist_t *newval); +isc_result_t dns_c_ctx_unsetpeerlist(dns_c_ctx_t *cfg); + + isc_result_t dns_c_ctx_getcontrols(dns_c_ctx_t *cfg, dns_c_ctrllist_t **ctrls); diff --git a/lib/dns/include/dns/confview.h b/lib/dns/include/dns/confview.h index f5306fb933..db8e916fa4 100644 --- a/lib/dns/include/dns/confview.h +++ b/lib/dns/include/dns/confview.h @@ -149,6 +149,7 @@ struct dns_c_view dns_transfer_format_t *transfer_format; dns_c_kdeflist_t *keydefs; + dns_peerlist_t *peerlist; #if 0 /* @@ -439,6 +440,15 @@ isc_result_t dns_c_view_setkeydefs(dns_c_view_t *view, isc_result_t dns_c_view_unsetkeydefs(dns_c_view_t *view); +/* detach when done with retval */ +isc_result_t dns_c_view_getpeerlist(dns_c_view_t *cfg, + dns_peerlist_t **retval); +/* cfg will attach to newval */ +isc_result_t dns_c_view_setpeerlist(dns_c_view_t *cfg, + dns_peerlist_t *newval); +isc_result_t dns_c_view_unsetpeerlist(dns_c_view_t *cfg); + +