diff --git a/lib/dns/config/confctx.c b/lib/dns/config/confctx.c index 24322a978d..8a0d2fb4f8 100644 --- a/lib/dns/config/confctx.c +++ b/lib/dns/config/confctx.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: confctx.c,v 1.92 2000/10/12 00:38:29 bwelling Exp $ */ +/* $Id: confctx.c,v 1.93 2000/10/19 01:26:34 gson Exp $ */ #include @@ -2544,7 +2544,7 @@ dns_c_ctx_getlwres(dns_c_ctx_t *cfg, isc_result_t dns_c_ctx_setlwres(dns_c_ctx_t *cfg, - dns_c_lwreslist_t *newval, isc_boolean_t deepcopy) + dns_c_lwreslist_t *newval) { isc_result_t res; @@ -2557,9 +2557,6 @@ dns_c_ctx_setlwres(dns_c_ctx_t *cfg, if (newval == NULL) { cfg->lwres = NULL; res = ISC_R_SUCCESS; - } else if (deepcopy) { - res = dns_c_lwreslist_copy(cfg->mem, - &cfg->lwres, newval); } else { cfg->lwres = newval; res = ISC_R_SUCCESS; diff --git a/lib/dns/config/conflwres.c b/lib/dns/config/conflwres.c index d19ee673fa..d67a49246a 100644 --- a/lib/dns/config/conflwres.c +++ b/lib/dns/config/conflwres.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: conflwres.c,v 1.3 2000/10/10 22:04:29 bwelling Exp $ */ +/* $Id: conflwres.c,v 1.4 2000/10/19 01:26:36 gson Exp $ */ #include @@ -28,6 +28,9 @@ #include #include +static isc_result_t +search_delete(dns_c_search_t **search); + isc_result_t dns_c_lwreslist_new(isc_mem_t *mem, dns_c_lwreslist_t **list) { dns_c_lwreslist_t *newlist; @@ -81,56 +84,12 @@ dns_c_lwreslist_delete(dns_c_lwreslist_t **list) isc_result_t dns_c_lwreslist_append(dns_c_lwreslist_t *list, - dns_c_lwres_t *lwres, isc_boolean_t copy) + dns_c_lwres_t *lwres) { - dns_c_lwres_t *newe; - isc_result_t res; - REQUIRE(DNS_C_LWLIST_VALID(list)); REQUIRE(DNS_C_LWRES_VALID(lwres)); - if (copy) { - res = dns_c_lwres_copy(list->mem, &newe, lwres); - if (res != ISC_R_SUCCESS) { - return (res); - } - } else { - newe = lwres; - } - - ISC_LIST_APPEND(list->lwreslist, newe, next); - - return (ISC_R_SUCCESS); -} - -isc_result_t -dns_c_lwreslist_copy(isc_mem_t *mem, dns_c_lwreslist_t **dest, - dns_c_lwreslist_t *src) -{ - dns_c_lwreslist_t *newlist; - dns_c_lwres_t *lwres; - isc_result_t res; - - REQUIRE(dest != NULL); - REQUIRE(DNS_C_LWLIST_VALID(src)); - - res = dns_c_lwreslist_new(mem, &newlist); - if (res != ISC_R_SUCCESS) { - return (res); - } - - lwres = ISC_LIST_HEAD(src->lwreslist); - while (lwres != NULL) { - res = dns_c_lwreslist_append(newlist, lwres, ISC_TRUE); - if (res != ISC_R_SUCCESS) { - dns_c_lwreslist_delete(&newlist); - return (res); - } - - lwres = ISC_LIST_NEXT(lwres, next); - } - - *dest = newlist; + ISC_LIST_APPEND(list->lwreslist, lwres, next); return (ISC_R_SUCCESS); } @@ -152,7 +111,6 @@ dns_c_lwreslist_head (dns_c_lwreslist_t *list) { return (ISC_LIST_HEAD(list->lwreslist)); } - dns_c_lwres_t * dns_c_lwreslist_next(dns_c_lwres_t *lwres) { REQUIRE(DNS_C_LWRES_VALID(lwres)); @@ -199,6 +157,7 @@ dns_c_lwres_new(isc_mem_t *mem, dns_c_lwres_t **lwresp) lwres->listeners = NULL; lwres->view = NULL; lwres->viewclass = dns_rdataclass_in; + lwres->searchlist = NULL; ISC_LINK_INIT(lwres, next); @@ -226,6 +185,8 @@ dns_c_lwres_delete(dns_c_lwres_t **lwresp) isc_mem_free(mem, lwres->view); if (lwres->listeners != NULL) dns_c_iplist_detach(&lwres->listeners); + if (lwres->searchlist != NULL) + dns_c_searchlist_delete(&lwres->searchlist); lwres->mem = NULL; ISC_LINK_INIT(lwres, next); @@ -237,39 +198,6 @@ dns_c_lwres_delete(dns_c_lwres_t **lwresp) return (ISC_R_SUCCESS); } -isc_result_t dns_c_lwres_copy(isc_mem_t *mem, dns_c_lwres_t **dest, - dns_c_lwres_t *src) -{ - dns_c_lwres_t *newlwres; - - REQUIRE(dest != NULL); - REQUIRE(DNS_C_LWRES_VALID(src)); - - newlwres = isc_mem_get(mem, sizeof *newlwres); - if (newlwres == NULL) { - return (ISC_R_NOMEMORY); - } - newlwres->magic = DNS_C_LWRES_MAGIC; - newlwres->listeners = NULL; - newlwres->view = NULL; - - if (src->view != NULL) { - newlwres->view = isc_mem_strdup(mem, src->view); - if (newlwres->view == NULL) { - dns_c_lwres_delete(&newlwres); - return (ISC_R_NOMEMORY); - } - } - - if (src->listeners != NULL) - dns_c_iplist_attach(src->listeners, &newlwres->listeners); - newlwres->viewclass = src->viewclass; - - *dest = newlwres; - - return (ISC_R_SUCCESS); -} - isc_result_t dns_c_lwres_setlistenon(dns_c_lwres_t *lwres, dns_c_iplist_t *listeners) { if (lwres->listeners != NULL) @@ -291,6 +219,14 @@ dns_c_lwres_setview(dns_c_lwres_t *lwres, char *view, return (ISC_R_SUCCESS); } +isc_result_t dns_c_lwres_setsearchlist(dns_c_lwres_t *lwres, + dns_c_searchlist_t *searchlist) { + if (lwres->searchlist != NULL) + return (ISC_R_EXISTS); + lwres->searchlist = searchlist; + return (ISC_R_SUCCESS); +} + void dns_c_lwres_print(FILE *fp, int indent, dns_c_lwres_t *lwres) { @@ -321,6 +257,148 @@ dns_c_lwres_print(FILE *fp, int indent, dns_c_lwres_t *lwres) fprintf(fp, ";\n"); } + if (lwres->searchlist != NULL) { + dns_c_searchlist_print(fp, indent, lwres->searchlist); + fprintf(fp, ";\n"); + } + dns_c_printtabs(fp, indent); fprintf(fp, "};\n"); } + +isc_result_t +dns_c_searchlist_new(isc_mem_t *mem, dns_c_searchlist_t **list) +{ + dns_c_searchlist_t *l; + + l = isc_mem_get(mem, sizeof *l); + if (l == NULL) { + return (ISC_R_NOMEMORY); + } + + l->magic = DNS_C_SEARCHLIST_MAGIC; + l->mem = mem; + ISC_LIST_INIT(l->searches); + + *list = l; + + return (ISC_R_SUCCESS); +} + + +isc_result_t +dns_c_searchlist_delete(dns_c_searchlist_t **list) +{ + dns_c_searchlist_t *l; + dns_c_search_t *si, *tmpsi; + isc_result_t r; + + REQUIRE(list != NULL); + REQUIRE(DNS_C_SEARCHLIST_VALID(*list)); + + l = *list; + + si = ISC_LIST_HEAD(l->searches); + while (si != NULL) { + tmpsi = ISC_LIST_NEXT(si, next); + ISC_LIST_UNLINK(l->searches, si, next); + r = search_delete(&si); + if (r != ISC_R_SUCCESS) { + return (r); + } + si = tmpsi; + } + + l->magic = 0; + isc_mem_put(l->mem, l, sizeof *l); + + *list = NULL; + + return (ISC_R_SUCCESS); +} + +static isc_result_t +search_delete(dns_c_search_t **search) +{ + dns_c_search_t *si; + + REQUIRE(search != NULL); + REQUIRE(DNS_C_SEARCH_VALID(*search)); + + si = *search; + + isc_mem_free(si->mem, si->search); + + si->magic = 0; + isc_mem_put(si->mem, si, sizeof *si); + + *search = NULL; + + return (ISC_R_SUCCESS); +} + +void +dns_c_searchlist_append(dns_c_searchlist_t *list, dns_c_search_t *search) +{ + REQUIRE(DNS_C_SEARCHLIST_VALID(list)); + REQUIRE(DNS_C_SEARCH_VALID(search)); + + ISC_LIST_APPEND(list->searches, search, next); +} + +void +dns_c_searchlist_print(FILE *fp, int indent, + dns_c_searchlist_t *list) +{ + dns_c_search_t *iter; + + REQUIRE(fp != NULL); + REQUIRE(DNS_C_SEARCHLIST_VALID(list)); + + if (ISC_LIST_EMPTY(list->searches)) { + return; + } + + dns_c_printtabs(fp, indent); + fprintf(fp, "search {\n"); + iter = ISC_LIST_HEAD(list->searches); + if (iter == NULL) { + dns_c_printtabs(fp, indent + 1); + fprintf(fp, "/* no search list defined */\n"); + } else { + while (iter != NULL) { + dns_c_printtabs(fp, indent + 1); + fprintf(fp, "\"%s\";\n", iter->search); + iter = ISC_LIST_NEXT(iter, next); + } + } + + dns_c_printtabs(fp, indent); + fprintf(fp, "}"); +} + +isc_result_t +dns_c_search_new(isc_mem_t *mem, const char *val, dns_c_search_t **search) +{ + dns_c_search_t *ki; + + REQUIRE(val != NULL); + REQUIRE(*val != '\0'); + REQUIRE(search != NULL); + + ki = isc_mem_get(mem, sizeof *ki); + if (ki == NULL) { + return (ISC_R_NOMEMORY); + } + + ki->magic = DNS_C_SEARCH_MAGIC; + ki->mem = mem; + ki->search = isc_mem_strdup(mem, val); + + ISC_LINK_INIT(ki, next); + + *search = ki; + + return (ISC_R_SUCCESS); +} + diff --git a/lib/dns/config/confparser.y.dirty b/lib/dns/config/confparser.y.dirty index 5bdcafa3e6..487186d4e4 100644 --- a/lib/dns/config/confparser.y.dirty +++ b/lib/dns/config/confparser.y.dirty @@ -17,7 +17,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: confparser.y.dirty,v 1.21 2000/10/17 22:21:34 bwelling Exp $ */ +/* $Id: confparser.y.dirty,v 1.22 2000/10/19 01:26:37 gson Exp $ */ #include @@ -228,6 +228,7 @@ static isc_boolean_t int_too_big(isc_uint32_t base, isc_uint32_t mult); dns_c_ordering_t ordering; dns_c_iplist_t *iplist; dns_c_kidlist_t *kidlist; + dns_c_searchlist_t *searchlist; } /* Misc */ @@ -367,6 +368,7 @@ static isc_boolean_t int_too_big(isc_uint32_t base, isc_uint32_t mult); %token L_RESPONSE %token L_RFC2308_TYPE1 %token L_RRSET_ORDER +%token L_SEARCH %token L_SECRET %token L_SEC_KEY %token L_SELF @@ -472,6 +474,7 @@ static isc_boolean_t int_too_big(isc_uint32_t base, isc_uint32_t mult); #endif /* NOMINUM_PUBLIC */ %type control_keys %type keyid_list +%type searchlist %type ordering_name %type secret %type transfer_format @@ -3100,6 +3103,36 @@ keyid_list: /* nothing */ }; +searchlist: /* nothing */ + { + dns_c_searchlist_t *searchlist = NULL; + + tmpres = dns_c_searchlist_new(currcfg->mem, &searchlist); + if (tmpres != ISC_R_SUCCESS) { + parser_error(ISC_FALSE, "failed to create searchlist"); + YYABORT; + } + + $$ = searchlist; + } + | searchlist any_string L_EOS + { + dns_c_search_t *search = NULL; + + tmpres = dns_c_search_new($$->mem, $2, &search); + if (tmpres != ISC_R_SUCCESS) { + parser_error(ISC_FALSE, "failed to create searchlist item"); + dns_c_searchlist_delete(&$$); + $$ = NULL; + YYABORT; + } + + isc_mem_free(memctx, $2); + + dns_c_searchlist_append($$, search); + }; + + /* * Address Matching */ @@ -5656,6 +5689,21 @@ lwres_option: L_LISTEN_ON port_ip_list } isc_mem_free(memctx, $2); } + | L_SEARCH L_LBRACE searchlist L_RBRACE + { + dns_c_lwres_t *lwres; + lwres = ISC_LIST_TAIL(currcfg->lwres->lwreslist); + tmpres = dns_c_lwres_setsearchlist(lwres, $3); + if (tmpres == ISC_R_EXISTS) { + parser_error(ISC_FALSE, "cannot redefine searchlist"); + dns_c_searchlist_delete(&$3); + YYABORT; + } else if (tmpres != ISC_R_SUCCESS) { + parser_error(ISC_FALSE, "failed to set searchlist"); + dns_c_searchlist_delete(&$3); + YYABORT; + } + } ; @@ -5843,6 +5891,7 @@ static struct token keyword_tokens [] = { { "response", L_RESPONSE }, { "rfc2308-type1", L_RFC2308_TYPE1 }, { "rrset-order", L_RRSET_ORDER }, + { "search", L_SEARCH }, { "secret", L_SECRET }, { "self", L_SELF }, { "serial-queries", L_SERIAL_QUERIES }, diff --git a/lib/dns/include/dns/confctx.h b/lib/dns/include/dns/confctx.h index 1b891a88fa..f2ca14188d 100644 --- a/lib/dns/include/dns/confctx.h +++ b/lib/dns/include/dns/confctx.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: confctx.h,v 1.54 2000/10/12 00:38:30 bwelling Exp $ */ +/* $Id: confctx.h,v 1.55 2000/10/19 01:26:38 gson Exp $ */ #ifndef DNS_CONFCTX_H #define DNS_CONFCTX_H 1 @@ -822,8 +822,7 @@ isc_result_t dns_c_ctx_settrustedkeys(dns_c_ctx_t *cfg, dns_c_tkeylist_t *list, isc_boolean_t copy); isc_result_t dns_c_ctx_getlwres(dns_c_ctx_t *cfg, dns_c_lwreslist_t **retval); -isc_result_t dns_c_ctx_setlwres(dns_c_ctx_t *cfg, dns_c_lwreslist_t *list, - isc_boolean_t copy); +isc_result_t dns_c_ctx_setlwres(dns_c_ctx_t *cfg, dns_c_lwreslist_t *list); ISC_LANG_ENDDECLS diff --git a/lib/dns/include/dns/conflwres.h b/lib/dns/include/dns/conflwres.h index 122f302f6c..cc56fdd6ac 100644 --- a/lib/dns/include/dns/conflwres.h +++ b/lib/dns/include/dns/conflwres.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: conflwres.h,v 1.1 2000/10/04 18:47:18 bwelling Exp $ */ +/* $Id: conflwres.h,v 1.2 2000/10/19 01:26:39 gson Exp $ */ #ifndef DNS_CONFLWRES_H #define DNS_CONFLWRES_H 1 @@ -65,9 +65,13 @@ #define DNS_C_LWRES_MAGIC 0x4C575253 /* LWRS */ #define DNS_C_LWLIST_MAGIC 0x4C57524C /* LWRL */ +#define DNS_C_SEARCH_MAGIC 0x53524348 /* SRCH */ +#define DNS_C_SEARCHLIST_MAGIC 0x5352434C /* SRCL */ -#define DNS_C_LWRES_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_C_LWRES_MAGIC) -#define DNS_C_LWLIST_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_C_LWLIST_MAGIC) +#define DNS_C_LWRES_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_C_LWRES_MAGIC) +#define DNS_C_LWLIST_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_C_LWLIST_MAGIC) +#define DNS_C_SEARCH_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_C_SEARCH_MAGIC) +#define DNS_C_SEARCHLIST_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_C_SEARCHLIST_MAGIC) /*** *** Types @@ -75,6 +79,8 @@ typedef struct dns_c_lwres dns_c_lwres_t; typedef struct dns_c_lwres_list dns_c_lwreslist_t; +typedef struct dns_c_search dns_c_search_t; +typedef struct dns_c_search_list dns_c_searchlist_t; /* * The type for holding an lwres config structure @@ -86,6 +92,7 @@ struct dns_c_lwres { dns_c_iplist_t *listeners; char *view; dns_rdataclass_t viewclass; + dns_c_searchlist_t *searchlist; ISC_LINK(dns_c_lwres_t) next; }; @@ -101,6 +108,28 @@ struct dns_c_lwres_list { }; +/* + * A search list element. + */ +struct dns_c_search { + isc_uint32_t magic; + isc_mem_t *mem; + char *search; + + ISC_LINK(dns_c_search_t) next; +}; + + +/* + * A search list. + */ +struct dns_c_search_list { + isc_uint32_t magic; + isc_mem_t *mem; + + ISC_LIST(dns_c_search_t) searches; +}; + /*** *** Functions ***/ @@ -113,8 +142,7 @@ isc_result_t dns_c_lwreslist_new(isc_mem_t *mem, isc_result_t dns_c_lwreslist_delete(dns_c_lwreslist_t **list); isc_result_t dns_c_lwreslist_append(dns_c_lwreslist_t *list, - dns_c_lwres_t *lwres, - isc_boolean_t copy); + dns_c_lwres_t *lwres); isc_result_t dns_c_lwreslist_copy(isc_mem_t *mem, dns_c_lwreslist_t **dest, dns_c_lwreslist_t *src); @@ -132,17 +160,29 @@ isc_result_t dns_c_lwres_new(isc_mem_t *mem, dns_c_lwres_t **lwresp); isc_result_t dns_c_lwres_delete(dns_c_lwres_t **lwresp); -isc_result_t dns_c_lwres_copy(isc_mem_t *mem, dns_c_lwres_t **dest, - dns_c_lwres_t *src); - isc_result_t dns_c_lwres_setlistenon(dns_c_lwres_t *lwres, dns_c_iplist_t *listeners); isc_result_t dns_c_lwres_setview(dns_c_lwres_t *lwres, char *view, dns_rdataclass_t rdclass); +isc_result_t dns_c_lwres_setsearchlist(dns_c_lwres_t *lwres, + dns_c_searchlist_t *searchlist); + void dns_c_lwres_print(FILE *fp, int indent, dns_c_lwres_t *lwres); +isc_result_t dns_c_searchlist_new(isc_mem_t *mem, dns_c_searchlist_t **list); + +isc_result_t dns_c_searchlist_delete(dns_c_searchlist_t **list); + +void dns_c_searchlist_append(dns_c_searchlist_t *list, dns_c_search_t *search); + +void dns_c_searchlist_print(FILE *fp, int indent, dns_c_searchlist_t *list); + +isc_result_t dns_c_search_new(isc_mem_t *mem, const char *val, + dns_c_search_t **search); + + ISC_LANG_ENDDECLS #endif /* DNS_CONFLWRES_H */