diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 938cfbeae8..059ee611a9 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.h,v 1.47 2000/12/01 23:49:52 gson Exp $ */ +/* $Id: server.h,v 1.48 2000/12/12 21:33:11 bwelling Exp $ */ #ifndef NAMED_SERVER_H #define NAMED_SERVER_H 1 @@ -71,6 +71,8 @@ struct ns_server { char * statsfile; /* Statistics file name */ isc_uint64_t * querystats; /* Query statistics counters */ + + char * dumpfile; /* Dump file name */ }; #define NS_SERVER_MAGIC 0x53564552 /* SVER */ @@ -125,9 +127,15 @@ ns_server_togglequerylog(ns_server_t *server); */ /* - * Dump the current statistics to the statstics file. + * Dump the current statistics to the statistics file. */ isc_result_t ns_server_dumpstats(ns_server_t *server); +/* + * Dump the current cache to the dump file. + */ +isc_result_t +ns_server_dumpdb(ns_server_t *server); + #endif /* NAMED_SERVER_H */ diff --git a/bin/named/omapi.c b/bin/named/omapi.c index d4ed8adf16..638fe82709 100644 --- a/bin/named/omapi.c +++ b/bin/named/omapi.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: omapi.c,v 1.26 2000/11/30 19:38:00 gson Exp $ */ +/* $Id: omapi.c,v 1.27 2000/12/12 21:33:08 bwelling Exp $ */ /* * Principal Author: DCL @@ -110,6 +110,10 @@ control_setvalue(omapi_object_t *handle, omapi_string_t *name, result = ns_server_dumpstats(ns_g_server); } else if (omapi_string_strcmp(name, NS_OMAPI_COMMAND_QUERYLOG) == 0) { result = ns_server_togglequerylog(ns_g_server); + } else if (omapi_string_strcmp(name, NS_OMAPI_COMMAND_DUMPDB) == 0) + { + ns_server_dumpdb(ns_g_server); + result = ISC_R_SUCCESS; } else { isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_OMAPI, ISC_LOG_WARNING, diff --git a/bin/named/server.c b/bin/named/server.c index 7549aa3fa0..de84b8ea74 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.270 2000/12/06 01:21:04 tale Exp $ */ +/* $Id: server.c,v 1.271 2000/12/12 21:33:10 bwelling Exp $ */ #include @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -712,6 +713,25 @@ configure_view(dns_view_t *view, dns_c_ctx_t *cctx, dns_c_view_t *cview, val = 7 * 24 * 3600; view->maxncachettl = val; } + { + char *cachefile = NULL, *p = NULL; + if (cview != NULL) + result = dns_c_view_getcachefile(cview, &cachefile); + else + result = dns_c_ctx_getcachefile(cctx, &cachefile); + if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND) + goto cleanup; + if (cachefile != NULL) { + p = isc_mem_strdup(view->mctx, cachefile); + if (p == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + } + if (view->cachefile != NULL) + isc_mem_free(view->mctx, view->cachefile); + view->cachefile = p; + } result = ISC_R_SUCCESS; @@ -1326,6 +1346,21 @@ setstatsfile(ns_server_t *server, const char *name) { return (ISC_R_SUCCESS); } +static isc_result_t +setdumpfile(ns_server_t *server, const char *name) { + char *p; + + REQUIRE(name != NULL); + + p = isc_mem_strdup(server->mctx, name); + if (p == NULL) + return (ISC_R_NOMEMORY); + if (server->dumpfile != NULL) + isc_mem_free(server->mctx, server->dumpfile); + server->dumpfile = p; + return (ISC_R_SUCCESS); +} + #define SETLIMIT(cfgvar, resource, description) \ if (dns_c_ctx_get ## cfgvar(cctx, &resource) == ISC_R_SUCCESS) { \ if (resource == DNS_C_SIZE_SPEC_DEFAULT) \ @@ -1376,6 +1411,7 @@ load_configuration(const char *filename, ns_server_t *server, dns_dispatch_t *dispatchv6 = NULL; char *pidfilename; char *statsfilename; + char *dumpfilename; isc_uint32_t interface_interval; isc_uint32_t heartbeat_interval; in_port_t listen_port; @@ -1748,6 +1784,13 @@ load_configuration(const char *filename, ns_server_t *server, CHECKM(setstatsfile(server, statsfilename), "strdup"); } + result = dns_c_ctx_getdumpfilename(cctx, &dumpfilename); + if (result == ISC_R_NOTFOUND) { + CHECKM(setdumpfile(server, "named_dump.db"), "strdup"); + } else { + CHECKM(setdumpfile(server, dumpfilename), "strdup"); + } + cleanup: ns_aclconfctx_destroy(&aclconfctx); @@ -1998,6 +2041,10 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { CHECKFATAL(dns_stats_alloccounters(ns_g_mctx, &server->querystats), "dns_stats_alloccounters"); + server->dumpfile = isc_mem_strdup(server->mctx, "named.dump"); + CHECKFATAL(server->dumpfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS, + "isc_mem_strdup"); + server->flushonshutdown = ISC_FALSE; server->log_queries = ISC_FALSE; @@ -2013,6 +2060,8 @@ ns_server_destroy(ns_server_t **serverp) { dns_stats_freecounters(server->mctx, &server->querystats); isc_mem_free(server->mctx, server->statsfile); + isc_mem_free(server->mctx, server->dumpfile); + dns_loadmgr_detach(&server->loadmgr); dns_zonemgr_detach(&server->zonemgr); @@ -2346,3 +2395,25 @@ ns_server_dumpstats(ns_server_t *server) { (void)isc_stdio_close(fp); return (result); } + +isc_result_t +ns_server_dumpdb(ns_server_t *server) { + FILE *fp = NULL; + dns_view_t *view; + isc_result_t result; + + CHECKM(isc_stdio_open(server->dumpfile, "w", &fp), + "could not open dump file"); + + view = ISC_LIST_HEAD(server->viewlist); + while (view != NULL) { + if (view->cachedb != NULL) + CHECKM(dns_view_dumpcachetostream(view, fp), + "could not dump cache"); + view = ISC_LIST_NEXT(view, link); + } + cleanup: + if (fp != NULL) + (void)isc_stdio_close(fp); + return (result); +} diff --git a/bin/rndc/rndc.c b/bin/rndc/rndc.c index c4e19c581d..2f564a82f4 100644 --- a/bin/rndc/rndc.c +++ b/bin/rndc/rndc.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rndc.c,v 1.35 2000/12/01 21:32:02 gson Exp $ */ +/* $Id: rndc.c,v 1.36 2000/12/12 21:33:12 bwelling Exp $ */ /* * Principal Author: DCL @@ -267,10 +267,10 @@ command is one of the following:\n\ Schedule immediate maintenance for a zone.\n\ stats Write server statistics to the statistics file.\n\ querylog Toggle query logging.\n\ + dumpdb Dump cache to the dumpfile (named_dump.db).\n\ stop Save pending updates to master files and stop the server.\n\ halt Stop the server without saving pending updates.\n\ *status Display ps(1) status of named.\n\ - *dumpdb Dump database and cache to /var/tmp/named_dump.db.\n\ *trace Increment debugging level by one.\n\ *notrace Set debugging level to 0.\n\ *restart Restart the server.\n\ @@ -513,8 +513,7 @@ main(int argc, char **argv) { notify(command); - if (strcmp(command, "dumpdb") == 0 || - strcmp(command, "notrace") == 0 || + if (strcmp(command, "notrace") == 0 || strcmp(command, "restart") == 0 || strcmp(command, "status") == 0 || strcmp(command, "trace") == 0) { diff --git a/lib/dns/config/confctx.c b/lib/dns/config/confctx.c index 8ca9014fd7..8c5330abf1 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.111 2000/12/07 01:45:53 brister Exp $ */ +/* $Id: confctx.c,v 1.112 2000/12/12 21:33:15 bwelling Exp $ */ #include @@ -349,12 +349,6 @@ dns_c_checkconfig(dns_c_ctx_t *cfg) "option 'named-xfer' is obsolete"); } - if (dns_c_ctx_getdumpfilename(cfg, &cpval) != ISC_R_NOTFOUND) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_CONFIG, - DNS_LOGMODULE_CONFIG, ISC_LOG_WARNING, - "option 'dump-file' is not yet implemented"); - } - if (dns_c_ctx_getmemstatsfilename(cfg, &cpval) != ISC_R_NOTFOUND) { isc_log_write(dns_lctx, DNS_LOGCATEGORY_CONFIG, DNS_LOGMODULE_CONFIG, ISC_LOG_WARNING, @@ -528,6 +522,16 @@ dns_c_checkconfig(dns_c_ctx_t *cfg) } } + if (dns_c_ctx_getcachefile(cfg, &cpval) == ISC_R_SUCCESS && + cfg->views != NULL) + { + isc_log_write(dns_lctx, DNS_LOGCATEGORY_CONFIG, + DNS_LOGMODULE_CONFIG, ISC_LOG_WARNING, + "option 'cachefile' cannot be present if views " + "are present"); + result = ISC_R_FAILURE; + } + return (result); } @@ -976,6 +980,7 @@ dns_c_ctx_optionsprint(FILE *fp, int indent, dns_c_options_t *options) PRINT_CHAR_P(pid_filename, "pid-file"); PRINT_CHAR_P(stats_filename, "statistics-file"); PRINT_CHAR_P(memstats_filename, "memstatistics-file"); + PRINT_CHAR_P(cache_filename, "cache-file"); PRINT_CHAR_P(named_xfer, "named-xfer"); PRINT_CHAR_P(random_device, "random-device"); PRINT_CHAR_P(random_seed_file, "random-seed-file"); @@ -1526,6 +1531,7 @@ dns_c_ctx_optionsnew(isc_mem_t *mem, dns_c_options_t **options) opts->pid_filename = NULL; opts->stats_filename = NULL; opts->memstats_filename = NULL; + opts->cache_filename = NULL; opts->named_xfer = NULL; opts->random_device = NULL; opts->random_seed_file = NULL; @@ -1682,6 +1688,7 @@ dns_c_ctx_optionsdelete(dns_c_options_t **opts) FREESTRING(pid_filename); FREESTRING(stats_filename); FREESTRING(memstats_filename); + FREESTRING(cache_filename); FREESTRING(named_xfer); FREESTRING(random_device); FREESTRING(random_seed_file); @@ -1829,6 +1836,7 @@ STRING_FUNCS(dumpfilename, dump_filename) STRING_FUNCS(pidfilename, pid_filename) STRING_FUNCS(statsfilename, stats_filename) STRING_FUNCS(memstatsfilename, memstats_filename) +STRING_FUNCS(cachefile, cache_filename) STRING_FUNCS(namedxfer, named_xfer) STRING_FUNCS(randomdevice, random_device) STRING_FUNCS(randomseedfile, random_seed_file) diff --git a/lib/dns/config/confparser.y.dirty b/lib/dns/config/confparser.y.dirty index cdb82a5034..b6d313d3a0 100644 --- a/lib/dns/config/confparser.y.dirty +++ b/lib/dns/config/confparser.y.dirty @@ -33,7 +33,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: confparser.y.dirty,v 1.41 2000/12/11 23:38:25 bwelling Exp $ */ +/* $Id: confparser.y.dirty,v 1.42 2000/12/12 21:33:16 bwelling Exp $ */ #include @@ -276,6 +276,7 @@ static isc_boolean_t int_too_big(isc_uint32_t base, isc_uint32_t mult); %token L_BANG %token L_BLACKHOLE %token L_BOGUS +%token L_CACHE_FILE %token L_CATEGORY %token L_CHANNEL %token L_CHECK_NAMES @@ -795,6 +796,21 @@ option: /* Empty */ isc_mem_free(memctx, $2); } + | L_CACHE_FILE L_QSTRING + { + tmpres = dns_c_ctx_setcachefile(currcfg, $2); + if (tmpres == ISC_R_EXISTS) { + parser_error(ISC_FALSE, + "cannot redefine cache-file"); + YYABORT; + } else if (tmpres != ISC_R_SUCCESS) { + parser_error(ISC_FALSE, "set cachefile error %s: %s", + isc_result_totext(tmpres), $2); + YYABORT; + } + + isc_mem_free(memctx, $2); + } | L_EXPERT_MODE yea_or_nay { tmpres = dns_c_ctx_setexpertmode(currcfg, $2); @@ -4612,6 +4628,25 @@ view_option: L_FORWARD zone_forward_opt YYABORT; } } + | L_CACHE_FILE L_QSTRING + { + dns_c_view_t *view = dns_c_ctx_getcurrview(currcfg); + + INSIST(view != NULL); + + tmpres = dns_c_view_setcachefile(view, $2); + if (tmpres == ISC_R_EXISTS) { + parser_error(ISC_FALSE, + "cannot redefine cache-file"); + YYABORT; + } else if (tmpres != ISC_R_SUCCESS) { + parser_error(ISC_FALSE, "set cachefile error %s: %s", + isc_result_totext(tmpres), $2); + YYABORT; + } + + isc_mem_free(memctx, $2); + } | key_stmt | zone_stmt | server_stmt @@ -6209,6 +6244,7 @@ static struct token keyword_tokens [] = { { "auth-nxdomain", L_AUTH_NXDOMAIN }, { "blackhole", L_BLACKHOLE }, { "bogus", L_BOGUS }, + { "cache-file", L_CACHE_FILE }, { "category", L_CATEGORY }, { "channel", L_CHANNEL }, { "check-names", L_CHECK_NAMES }, diff --git a/lib/dns/config/confview.c b/lib/dns/config/confview.c index cde7171ef6..d39633fda2 100644 --- a/lib/dns/config/confview.c +++ b/lib/dns/config/confview.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: confview.c,v 1.64 2000/12/07 01:45:55 brister Exp $ */ +/* $Id: confview.c,v 1.65 2000/12/12 21:33:18 bwelling Exp $ */ #include @@ -143,6 +143,8 @@ PVT_CONCAT(dns_c_view_unset, FUNCNAME)(dns_c_view_t *view) { \ } \ } + + #define BYTYPE_FUNCS(TYPE, FUNC, FIELD) \ SETBYTYPE(TYPE, FUNC, FIELD) \ GETBYTYPE(TYPE, FUNC, FIELD) \ @@ -210,6 +212,64 @@ PVT_CONCAT(dns_c_view_get, FUNCNAME)(dns_c_view_t *view, \ UNSETIPMLIST(FUNC, FIELD) +#define SETSTRING(FUNC, FIELD) \ +isc_result_t \ +PVT_CONCAT(dns_c_view_set, FUNC)(dns_c_view_t *view, const char *newval) \ +{ \ + char *p = NULL; \ + \ + REQUIRE(DNS_C_VIEW_VALID(view)); \ + REQUIRE(newval != NULL); \ + REQUIRE(*newval != '\0'); \ + \ + if (newval != NULL) { \ + p = isc_mem_strdup(view->mem, newval); \ + if (p == NULL) \ + return (ISC_R_NOMEMORY); \ + } \ + if (view->FIELD != NULL) { \ + isc_mem_free(view->mem, view->FIELD); \ + view->FIELD = NULL; \ + } \ + view->FIELD = p; \ + return (ISC_R_SUCCESS); \ +} + + +#define GETSTRING(FUNC, FIELD) \ +isc_result_t \ +PVT_CONCAT(dns_c_view_get, FUNC)(dns_c_view_t *view, char **retval) \ +{ \ + REQUIRE(DNS_C_VIEW_VALID(view)); \ + REQUIRE(retval != NULL); \ + \ + *retval = view->FIELD; \ + \ + return (*retval == NULL ? ISC_R_NOTFOUND : ISC_R_SUCCESS); \ +} + + +#define UNSETSTRING(FUNC, FIELD) \ +isc_result_t \ +PVT_CONCAT(dns_c_view_unset, FUNC)(dns_c_view_t *view) \ +{ \ + REQUIRE(DNS_C_VIEW_VALID(view)); \ + \ + if (view->FIELD == NULL) { \ + return (ISC_R_NOTFOUND); \ + } \ + \ + isc_mem_free(view->mem, view->FIELD); \ + view->FIELD = NULL; \ + \ + return (ISC_R_SUCCESS); \ +} + +#define STRING_FUNCS(FUNC, FIELD) \ + SETSTRING(FUNC, FIELD) \ + GETSTRING(FUNC, FIELD) \ + UNSETSTRING(FUNC, FIELD) + isc_result_t dns_c_viewtable_new(isc_mem_t *mem, dns_c_viewtable_t **viewtable) { dns_c_viewtable_t *table; @@ -533,6 +593,8 @@ dns_c_view_new(isc_mem_t *mem, const char *name, dns_rdataclass_t viewclass, view->trusted_keys = NULL; + view->cache_file = NULL; + #if 0 view->max_transfer_time_in = NULL; view->max_transfer_idle_in = NULL; @@ -958,6 +1020,8 @@ dns_c_view_delete(dns_c_view_t **viewptr) { dns_c_view_unsettrustedkeys(view); + dns_c_view_unsetcachefile(view); + #if 0 FREEFIELD(max_transfer_time_in); FREEFIELD(max_transfer_idle_in); @@ -1578,6 +1642,8 @@ SOCKADDR_FUNCS(transfersourcev6, transfer_source_v6) SOCKADDR_FUNCS(querysource, query_source) SOCKADDR_FUNCS(querysourcev6, query_source_v6) +STRING_FUNCS(cachefile, cache_file) + UINT32_FUNCS(maxtransfertimeout, max_transfer_time_out) UINT32_FUNCS(maxtransferidleout, max_transfer_idle_out) UINT32_FUNCS(cleaninterval, clean_interval) diff --git a/lib/dns/include/dns/confctx.h b/lib/dns/include/dns/confctx.h index 642745b521..6d2152bc67 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.58 2000/11/25 02:43:52 marka Exp $ */ +/* $Id: confctx.h,v 1.59 2000/12/12 21:33:19 bwelling Exp $ */ #ifndef DNS_CONFCTX_H #define DNS_CONFCTX_H 1 @@ -118,6 +118,7 @@ struct dns_c_options { char *pid_filename; char *stats_filename; char *memstats_filename; + char *cache_filename; char *named_xfer; char *random_device; char *random_seed_file; @@ -336,6 +337,11 @@ isc_result_t dns_c_ctx_getmemstatsfilename(dns_c_ctx_t *ctx, char **retval); isc_result_t dns_c_ctx_unsetmemstatsfilename(dns_c_ctx_t *ctx); +isc_result_t dns_c_ctx_setcachefile(dns_c_ctx_t *ctx, const char *newval); +isc_result_t dns_c_ctx_getcachefile(dns_c_ctx_t *ctx, char **retval); +isc_result_t dns_c_ctx_unsetcachefile(dns_c_ctx_t *ctx); + + isc_result_t dns_c_ctx_setnamedxfer(dns_c_ctx_t *ctx, const char *newval); isc_result_t dns_c_ctx_getnamedxfer(dns_c_ctx_t *ctx, char **retval); isc_result_t dns_c_ctx_unsetnamedxfer(dns_c_ctx_t *ctx); diff --git a/lib/dns/include/dns/confview.h b/lib/dns/include/dns/confview.h index 9d3a1b036a..9563e32957 100644 --- a/lib/dns/include/dns/confview.h +++ b/lib/dns/include/dns/confview.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: confview.h,v 1.46 2000/12/01 23:27:43 marka Exp $ */ +/* $Id: confview.h,v 1.47 2000/12/12 21:33:20 bwelling Exp $ */ #ifndef DNS_CONFVIEW_H #define DNS_CONFVIEW_H 1 @@ -167,6 +167,8 @@ struct dns_c_view { dns_c_tkeylist_t *trusted_keys; + char *cache_file; + #if 0 /* * To implement later. @@ -617,6 +619,12 @@ isc_result_t dns_c_view_settrustedkeys(dns_c_view_t *view, dns_c_tkeylist_t *newval, isc_boolean_t copy); +isc_result_t dns_c_view_getcachefile(dns_c_view_t *view, + char **cachefile); +isc_result_t dns_c_view_unsetcachefile(dns_c_view_t *view); +isc_result_t dns_c_view_setcachefile(dns_c_view_t *view, + const char *newval); + #if 0 diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h index affe2b780b..1f8ab870a0 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.h,v 1.56 2000/11/10 03:16:26 gson Exp $ */ +/* $Id: view.h,v 1.57 2000/12/12 21:33:21 bwelling Exp $ */ #ifndef DNS_VIEW_H #define DNS_VIEW_H 1 @@ -112,6 +112,7 @@ struct dns_view { dns_ttl_t maxcachettl; dns_ttl_t maxncachettl; in_port_t dstport; + char * cachefile; /* * Configurable data for server use only, @@ -626,6 +627,27 @@ dns_view_dialup(dns_view_t *view); * Perform dialup-time maintenance on the zones of 'view'. */ +isc_result_t +dns_view_dumpcache(dns_view_t *view); + +isc_result_t +dns_view_dumpcachetostream(dns_view_t *view, FILE *fp); +/* + * Dump the cache to the specified cache file (if there is one) or stream. + * + * Requires: + * + * 'view' is valid. + * + * 'fp' is an open file. + * + * Returns: + * + * ISC_R_SUCCESS The cache was successfully dumped. + * ISC_R_IGNORE No cachefile was specified. + * others An error occurred (see dns_master_dump) + */ + ISC_LANG_ENDDECLS #endif /* DNS_VIEW_H */ diff --git a/lib/dns/view.c b/lib/dns/view.c index bf673bd7a6..294c2429ea 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.85 2000/11/10 03:16:20 gson Exp $ */ +/* $Id: view.c,v 1.86 2000/12/12 21:33:14 bwelling Exp $ */ #include @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -162,6 +163,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, view->maxcachettl = 7 * 24 * 3600; view->maxncachettl = 3 * 3600; view->dstport = 53; + view->cachefile = NULL; result = dns_peerlist_new(view->mctx, &view->peers); if (result != ISC_R_SUCCESS) @@ -251,6 +253,8 @@ destroy(dns_view_t *view) { dns_acl_detach(&view->recursionacl); if (view->sortlist != NULL) dns_acl_detach(&view->sortlist); + if (view->cachefile != NULL) + isc_mem_free(view->mctx, view->cachefile); dns_keytable_detach(&view->trustedkeys); dns_keytable_detach(&view->secroots); dns_fwdtable_destroy(&view->fwdtable); @@ -1052,3 +1056,23 @@ dns_view_checksig(dns_view_t *view, isc_buffer_t *source, dns_message_t *msg) { view->dynamickeys)); } +isc_result_t +dns_view_dumpcache(dns_view_t *view) { + REQUIRE(DNS_VIEW_VALID(view)); + + if (view->cachefile == NULL) + return (ISC_R_IGNORE); + return (dns_master_dump(view->mctx, view->cachedb, NULL, + &dns_master_style_default, view->cachefile)); + +} + +isc_result_t +dns_view_dumpcachetostream(dns_view_t *view, FILE *fp) { + REQUIRE(DNS_VIEW_VALID(view)); + + return (dns_master_dumptostream(view->mctx, view->cachedb, NULL, + &dns_master_style_default, fp)); + +} +