diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h index 7b41574e70..1bbb168b80 100644 --- a/bin/named/include/named/globals.h +++ b/bin/named/include/named/globals.h @@ -40,6 +40,7 @@ EXTERN isc_mem_t * ns_g_mctx INIT(NULL); EXTERN unsigned int ns_g_cpus INIT(1); EXTERN isc_taskmgr_t * ns_g_taskmgr INIT(NULL); EXTERN dns_dispatchmgr_t * ns_g_dispatchmgr INIT(NULL); +EXTERN isc_entropy_t * ns_g_entropy INIT(NULL); /* * XXXRTH We're going to want multiple timer managers eventually. One * for really short timers, another for client timers, and one diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 6fb1240bd4..1410fc28a4 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -57,7 +57,6 @@ struct ns_server { dns_db_t * in_roothints; dns_tkeyctx_t * tkeyctx; isc_timer_t * interface_timer; - isc_entropy_t * entropy; isc_mutex_t reload_event_lock; isc_event_t * reload_event; diff --git a/bin/named/lwresd.c b/bin/named/lwresd.c index 2d3846fc87..f95c7f2bf7 100644 --- a/bin/named/lwresd.c +++ b/bin/named/lwresd.c @@ -191,6 +191,12 @@ ns_lwresd_createview(isc_mem_t *mctx, dns_view_t **viewp) { REQUIRE(viewp != NULL && *viewp == NULL); cache = NULL; + result = dns_dispatchmgr_create(ns_g_mctx, ns_g_entropy, + &ns_g_dispatchmgr); + + if (result != ISC_R_SUCCESS) + fatal("creating dispatch manager", result); + /* * View. */ @@ -323,7 +329,13 @@ ns_lwresd_create(isc_mem_t *mctx, dns_view_t *view, ns_lwresd_t **lwresdp) { lwresd->sock = sock; lwresd->view = NULL; - dns_view_attach(view, &lwresd->view); + if (view != NULL) + dns_view_attach(view, &lwresd->view); + else { + result = ns_lwresd_createview(ns_g_mctx, &lwresd->view); + if (result != ISC_R_SUCCESS) + fatal("failed to create default view", result); + } lwresd->task = NULL; result = isc_task_create(ns_g_taskmgr, 0, &lwresd->task); diff --git a/bin/named/main.c b/bin/named/main.c index aa32c5103a..5a9e85702e 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -364,14 +365,16 @@ create_managers(void) { return (ISC_R_UNEXPECTED); } - result = dns_dispatchmgr_create(ns_g_mctx, NULL, &ns_g_dispatchmgr); + result = isc_entropy_create(ns_g_mctx, &ns_g_entropy); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_dispatchmgr_create() failed: %s", + "isc_entropy_create() failed: %s", isc_result_totext(result)); return (ISC_R_UNEXPECTED); } + (void)isc_entropy_createfilesource(ns_g_entropy, "/dev/random"); + return (ISC_R_SUCCESS); } @@ -384,7 +387,7 @@ destroy_managers(void) { omapi_lib_destroy(); } - dns_dispatchmgr_destroy(&ns_g_dispatchmgr); + isc_entropy_detach(&ns_g_entropy); /* * isc_taskmgr_destroy() will block until all tasks have exited, */ @@ -432,15 +435,9 @@ setup(void) { ns_main_earlyfatal("create_managers() failed: %s", isc_result_totext(result)); - if (lwresd_only) { - dns_view_t *view = NULL; - result = ns_lwresd_createview(ns_g_mctx, &view); - if (result != ISC_R_SUCCESS) - ns_main_earlyfatal("ns_lwresd_createview() failed: %s", - isc_result_totext(result)); - ns_lwresd_create(ns_g_mctx, view, &ns_g_lwresd); - dns_view_detach(&view); - } else + if (lwresd_only) + ns_lwresd_create(ns_g_mctx, NULL, &ns_g_lwresd); + else ns_server_create(ns_g_mctx, &ns_g_server); if (!lwresd_only) { diff --git a/bin/named/server.c b/bin/named/server.c index df5d1bf64e..6ac8fcc858 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -1316,7 +1316,7 @@ load_configuration(const char *filename, ns_server_t *server, */ { dns_tkeyctx_t *t = NULL; - CHECKM(dns_tkeyctx_fromconfig(cctx, ns_g_mctx, server->entropy, + CHECKM(dns_tkeyctx_fromconfig(cctx, ns_g_mctx, ns_g_entropy, &t), "configuring TKEY"); if (server->tkeyctx != NULL) @@ -1443,6 +1443,10 @@ run_server(isc_task_t *task, isc_event_t *event) { isc_event_free(&event); + CHECKFATAL(dns_dispatchmgr_create(ns_g_mctx, ns_g_entropy, + &ns_g_dispatchmgr), + "creating dispatch manager"); + CHECKFATAL(ns_clientmgr_create(ns_g_mctx, ns_g_taskmgr, ns_g_timermgr, &server->clientmgr), "creating client manager"); @@ -1495,6 +1499,8 @@ shutdown_server(isc_task_t *task, isc_event_t *event) { ns_interfacemgr_shutdown(server->interfacemgr); ns_interfacemgr_detach(&server->interfacemgr); + dns_dispatchmgr_destroy(&ns_g_dispatchmgr); + dns_zonemgr_shutdown(server->zonemgr); isc_task_detach(&server->task); @@ -1553,16 +1559,11 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { ISC_R_NOMEMORY : ISC_R_SUCCESS, "allocating reload event"); - server->entropy = NULL; - CHECKFATAL(isc_entropy_create(ns_g_mctx, &server->entropy), - "initializing entropy pool"); - (void)isc_entropy_createfilesource(server->entropy, "/dev/random"); - - CHECKFATAL(dst_lib_init(ns_g_mctx, server->entropy, 0), + CHECKFATAL(dst_lib_init(ns_g_mctx, ns_g_entropy, 0), "initializing DST"); server->tkeyctx = NULL; - CHECKFATAL(dns_tkeyctx_create(ns_g_mctx, server->entropy, + CHECKFATAL(dns_tkeyctx_create(ns_g_mctx, ns_g_entropy, &server->tkeyctx), "creating TKEY context"); @@ -1602,9 +1603,6 @@ ns_server_destroy(ns_server_t **serverp) { dst_lib_destroy(); - if (server->entropy != NULL) - isc_entropy_detach(&server->entropy); - isc_event_free(&server->reload_event); INSIST(ISC_LIST_EMPTY(server->viewlist));