mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-09 10:22:06 -04:00
Changes necessary to support server statements inside a view statement.
This commit is contained in:
parent
b5debbe212
commit
6abdc5c090
7 changed files with 235 additions and 30 deletions
|
|
@ -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" ; };
|
||||
|
|
|
|||
|
|
@ -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 <config.h>
|
||||
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <config.h>
|
||||
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 <config.h>
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <config.h>
|
||||
|
||||
|
|
@ -31,6 +31,7 @@
|
|||
#include <dns/confview.h>
|
||||
#include <dns/confzone.h>
|
||||
#include <dns/log.h>
|
||||
#include <dns/peer.h>
|
||||
|
||||
#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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue