Changes necessary to support server statements inside a view statement.

This commit is contained in:
James Brister 2000-04-07 17:40:43 +00:00
parent b5debbe212
commit 6abdc5c090
7 changed files with 235 additions and 30 deletions

View file

@ -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" ; };

View file

@ -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;

View file

@ -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)

View file

@ -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;
}

View file

@ -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)

View file

@ -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);

View file

@ -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);