From ff653a7ef83e1ed147f21522a21ec9d1dbf6bbf5 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Mon, 1 Jul 2024 16:10:07 +0200 Subject: [PATCH] Call module init init again, and new function startup and destartup. NULL can be used if the function is not used. Open shared ports during reload. Deinit is called during reload. --- cachedb/cachedb.c | 6 +-- cachedb/cachedb.h | 4 +- daemon/daemon.c | 16 ++++---- daemon/daemon.h | 8 ++++ daemon/unbound.c | 8 +++- dns64/dns64.c | 8 ++-- dns64/dns64.h | 4 +- dynlibmod/dynlibmod.c | 4 +- edns-subnet/subnetmod.c | 9 ++--- edns-subnet/subnetmod.h | 4 +- ipsecmod/ipsecmod.c | 9 ++--- ipsecmod/ipsecmod.h | 4 +- ipset/ipset.c | 13 +++---- ipset/ipset.h | 10 ++--- iterator/iterator.c | 8 ++-- iterator/iterator.h | 4 +- libunbound/context.c | 12 ++++-- libunbound/context.h | 3 ++ libunbound/libunbound.c | 8 ++-- pythonmod/pythonmod.c | 4 +- respip/respip.c | 6 +-- respip/respip.h | 4 +- services/modstack.c | 36 +++++++++-------- services/modstack.h | 19 +++++---- smallapp/unbound-checkconf.c | 11 +++--- testcode/unitzonemd.c | 11 ++++-- util/fptr_wlist.c | 75 ++++++++++++++++++------------------ util/fptr_wlist.h | 10 ++--- util/module.c | 5 --- util/module.h | 33 ++++++++-------- validator/validator.c | 8 ++-- validator/validator.h | 4 +- 32 files changed, 195 insertions(+), 173 deletions(-) diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c index d610c4f19..aca68d7ed 100644 --- a/cachedb/cachedb.c +++ b/cachedb/cachedb.c @@ -241,7 +241,7 @@ cachedb_apply_cfg(struct cachedb_env* cachedb_env, struct config_file* cfg) } int -cachedb_setup(struct module_env* env, int id) +cachedb_init(struct module_env* env, int id) { struct cachedb_env* cachedb_env = (struct cachedb_env*)calloc(1, sizeof(struct cachedb_env)); @@ -271,7 +271,7 @@ cachedb_setup(struct module_env* env, int id) } void -cachedb_desetup(struct module_env* env, int id) +cachedb_deinit(struct module_env* env, int id) { struct cachedb_env* cachedb_env; if(!env || !env->modinfo[id]) @@ -983,7 +983,7 @@ cachedb_get_mem(struct module_env* env, int id) */ static struct module_func_block cachedb_block = { "cachedb", - &module_dummy_init, &module_dummy_init, &cachedb_setup, &cachedb_desetup, &cachedb_operate, + &cachedb_init, &cachedb_deinit, NULL, NULL, &cachedb_operate, &cachedb_inform_super, &cachedb_clear, &cachedb_get_mem }; diff --git a/cachedb/cachedb.h b/cachedb/cachedb.h index 3d3e101d7..482c5db6c 100644 --- a/cachedb/cachedb.h +++ b/cachedb/cachedb.h @@ -91,9 +91,9 @@ struct cachedb_backend { #define CACHEDB_HASHSIZE 256 /* bit hash */ /** Init the cachedb module */ -int cachedb_setup(struct module_env* env, int id); +int cachedb_init(struct module_env* env, int id); /** Deinit the cachedb module */ -void cachedb_desetup(struct module_env* env, int id); +void cachedb_deinit(struct module_env* env, int id); /** Operate on an event on a query (in qstate). */ void cachedb_operate(struct module_qstate* qstate, enum module_ev event, int id, struct outbound_entry* outbound); diff --git a/daemon/daemon.c b/daemon/daemon.c index 15102b9d2..eb933cc93 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -447,15 +447,12 @@ daemon_open_shared_ports(struct daemon* daemon) int daemon_privileged(struct daemon* daemon) { - if(!daemon_open_shared_ports(daemon)) - fatal_exit("could not open ports"); - daemon->env->cfg = daemon->cfg; daemon->env->alloc = &daemon->superalloc; daemon->env->worker = NULL; - if(!modstack_init(&daemon->mods, daemon->cfg->module_conf, + if(!modstack_startup(&daemon->mods, daemon->cfg->module_conf, daemon->env)) { - fatal_exit("failed to init modules"); + fatal_exit("failed to startup modules"); } return 1; } @@ -470,7 +467,9 @@ static void daemon_setup_modules(struct daemon* daemon) daemon->env->alloc = &daemon->superalloc; daemon->env->worker = NULL; daemon->env->need_to_validate = 0; /* set by module init below */ - if(!modstack_setup(&daemon->mods, daemon->cfg->module_conf, + if(daemon->mods.num != 0) + modstack_deinit(&daemon->mods, daemon->env); + if(!modstack_call_init(&daemon->mods, daemon->cfg->module_conf, daemon->env)) { fatal_exit("failed to setup modules"); } @@ -877,7 +876,7 @@ daemon_cleanup(struct daemon* daemon) daemon->views = NULL; if(daemon->env->auth_zones) auth_zones_cleanup(daemon->env->auth_zones); - /* key cache is cleared by module desetup during next daemon_fork() */ + /* key cache is cleared by module deinit during next daemon_fork() */ daemon_remote_clear(daemon->rc); for(i=0; inum; i++) worker_delete(daemon->workers[i]); @@ -907,7 +906,8 @@ daemon_delete(struct daemon* daemon) size_t i; if(!daemon) return; - modstack_desetup(&daemon->mods, daemon->env); + modstack_deinit(&daemon->mods, daemon->env); + modstack_destartup(&daemon->mods, daemon->env); daemon_remote_delete(daemon->rc); for(i = 0; i < daemon->num_ports; i++) listening_ports_free(daemon->ports[i]); diff --git a/daemon/daemon.h b/daemon/daemon.h index 0f6c260a8..200149745 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -154,6 +154,14 @@ struct daemon { */ struct daemon* daemon_init(void); +/** + * Open shared listening ports (if needed). + * The cfg member pointer must have been set for the daemon. + * @param daemon: the daemon. + * @return: false on error. + */ +int daemon_open_shared_ports(struct daemon* daemon); + /** * Do daemon setup that needs privileges * like opening privileged ports or opening device files. diff --git a/daemon/unbound.c b/daemon/unbound.c index 3644709d0..306fe6caf 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -473,7 +473,11 @@ perform_setup(struct daemon* daemon, struct config_file* cfg, int debug_mode, #endif #ifdef HAVE_GETPWNAM struct passwd *pwd = NULL; +#endif + if(!daemon_privileged(daemon)) + fatal_exit("could not do privileged setup"); +#ifdef HAVE_GETPWNAM if(cfg->username && cfg->username[0]) { if((pwd = getpwnam(cfg->username)) == NULL) fatal_exit("user '%s' does not exist.", cfg->username); @@ -717,9 +721,9 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode, int need_pi config_lookup_uid(cfg); /* prepare */ + if(!daemon_open_shared_ports(daemon)) + fatal_exit("could not open ports"); if(!done_setup) { - if(!daemon_privileged(daemon)) - fatal_exit("could not do privileged setup"); perform_setup(daemon, cfg, debug_mode, &cfgfile, need_pidfile); done_setup = 1; } else { diff --git a/dns64/dns64.c b/dns64/dns64.c index 3f2994fa6..d34eafb9f 100644 --- a/dns64/dns64.c +++ b/dns64/dns64.c @@ -399,7 +399,7 @@ dns64_apply_cfg(struct dns64_env* dns64_env, struct config_file* cfg) * \param id This instance's ID number. */ int -dns64_setup(struct module_env* env, int id) +dns64_init(struct module_env* env, int id) { struct dns64_env* dns64_env = (struct dns64_env*)calloc(1, sizeof(struct dns64_env)); @@ -433,7 +433,7 @@ free_ignore_aaaa_node(rbnode_type* node, void* ATTR_UNUSED(arg)) * \param id This instance's ID number. */ void -dns64_desetup(struct module_env* env, int id) +dns64_deinit(struct module_env* env, int id) { struct dns64_env* dns64_env; if (!env) @@ -1044,8 +1044,8 @@ dns64_get_mem(struct module_env* env, int id) */ static struct module_func_block dns64_block = { "dns64", - &module_dummy_init, &module_dummy_init, &dns64_setup, &dns64_desetup, - &dns64_operate, &dns64_inform_super, &dns64_clear, &dns64_get_mem + &dns64_init, &dns64_deinit, NULL, NULL, &dns64_operate, + &dns64_inform_super, &dns64_clear, &dns64_get_mem }; /** diff --git a/dns64/dns64.h b/dns64/dns64.h index 532a5bed3..2f0c01a22 100644 --- a/dns64/dns64.h +++ b/dns64/dns64.h @@ -50,10 +50,10 @@ struct module_func_block *dns64_get_funcblock(void); /** dns64 init */ -int dns64_setup(struct module_env* env, int id); +int dns64_init(struct module_env* env, int id); /** dns64 deinit */ -void dns64_desetup(struct module_env* env, int id); +void dns64_deinit(struct module_env* env, int id); /** dns64 operate on a query */ void dns64_operate(struct module_qstate* qstate, enum module_ev event, int id, diff --git a/dynlibmod/dynlibmod.c b/dynlibmod/dynlibmod.c index 1e040a30e..06c4f08c1 100644 --- a/dynlibmod/dynlibmod.c +++ b/dynlibmod/dynlibmod.c @@ -297,8 +297,8 @@ inplace_cb_delete_wrapped(struct module_env* env, enum inplace_cb_list_type type */ static struct module_func_block dynlibmod_block = { "dynlib", - &dynlibmod_init, &dynlibmod_deinit, &dynlibmod_operate, &dynlibmod_inform_super, - &dynlibmod_clear, &dynlibmod_get_mem + &dynlibmod_init, &dynlibmod_deinit, NULL, NULL, &dynlibmod_operate, + &dynlibmod_inform_super, &dynlibmod_clear, &dynlibmod_get_mem }; struct module_func_block* dynlibmod_get_funcblock(void) diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c index 61672be59..8e6db02e7 100644 --- a/edns-subnet/subnetmod.c +++ b/edns-subnet/subnetmod.c @@ -206,7 +206,7 @@ subnet_markdel(void* key) } int -subnetmod_setup(struct module_env *env, int id) +subnetmod_init(struct module_env *env, int id) { struct subnet_env *sn_env = (struct subnet_env*)calloc(1, sizeof(struct subnet_env)); @@ -275,7 +275,7 @@ subnetmod_setup(struct module_env *env, int id) } void -subnetmod_desetup(struct module_env *env, int id) +subnetmod_deinit(struct module_env *env, int id) { struct subnet_env *sn_env; if(!env || !env->modinfo[id]) @@ -996,9 +996,8 @@ subnetmod_get_mem(struct module_env *env, int id) */ static struct module_func_block subnetmod_block = { "subnetcache", - &module_dummy_init, &module_dummy_init, &subnetmod_setup, - &subnetmod_desetup, &subnetmod_operate, &subnetmod_inform_super, - &subnetmod_clear, &subnetmod_get_mem + &subnetmod_init, &subnetmod_deinit, NULL, NULL, &subnetmod_operate, + &subnetmod_inform_super, &subnetmod_clear, &subnetmod_get_mem }; struct module_func_block* diff --git a/edns-subnet/subnetmod.h b/edns-subnet/subnetmod.h index 8999aa632..1ff8a23ec 100644 --- a/edns-subnet/subnetmod.h +++ b/edns-subnet/subnetmod.h @@ -114,10 +114,10 @@ size_t msg_cache_sizefunc(void* k, void* d); struct module_func_block* subnetmod_get_funcblock(void); /** subnet module init */ -int subnetmod_setup(struct module_env* env, int id); +int subnetmod_init(struct module_env* env, int id); /** subnet module deinit */ -void subnetmod_desetup(struct module_env* env, int id); +void subnetmod_deinit(struct module_env* env, int id); /** subnet module operate on a query */ void subnetmod_operate(struct module_qstate* qstate, enum module_ev event, diff --git a/ipsecmod/ipsecmod.c b/ipsecmod/ipsecmod.c index 83f91702b..137e22c33 100644 --- a/ipsecmod/ipsecmod.c +++ b/ipsecmod/ipsecmod.c @@ -67,7 +67,7 @@ ipsecmod_apply_cfg(struct ipsecmod_env* ipsecmod_env, struct config_file* cfg) } int -ipsecmod_setup(struct module_env* env, int id) +ipsecmod_init(struct module_env* env, int id) { struct ipsecmod_env* ipsecmod_env = (struct ipsecmod_env*)calloc(1, sizeof(struct ipsecmod_env)); @@ -85,7 +85,7 @@ ipsecmod_setup(struct module_env* env, int id) } void -ipsecmod_desetup(struct module_env* env, int id) +ipsecmod_deinit(struct module_env* env, int id) { struct ipsecmod_env* ipsecmod_env; if(!env || !env->modinfo[id]) @@ -615,9 +615,8 @@ ipsecmod_get_mem(struct module_env* env, int id) */ static struct module_func_block ipsecmod_block = { "ipsecmod", - &module_dummy_init, &module_dummy_init, &ipsecmod_setup, - &ipsecmod_desetup, &ipsecmod_operate, &ipsecmod_inform_super, - &ipsecmod_clear, &ipsecmod_get_mem + &ipsecmod_init, &ipsecmod_deinit, NULL, NULL, &ipsecmod_operate, + &ipsecmod_inform_super, &ipsecmod_clear, &ipsecmod_get_mem }; struct module_func_block* diff --git a/ipsecmod/ipsecmod.h b/ipsecmod/ipsecmod.h index 9e77208c4..272f473c2 100644 --- a/ipsecmod/ipsecmod.h +++ b/ipsecmod/ipsecmod.h @@ -74,9 +74,9 @@ struct ipsecmod_qstate { }; /** Init the ipsecmod module */ -int ipsecmod_setup(struct module_env* env, int id); +int ipsecmod_init(struct module_env* env, int id); /** Deinit the ipsecmod module */ -void ipsecmod_desetup(struct module_env* env, int id); +void ipsecmod_deinit(struct module_env* env, int id); /** Operate on an event on a query (in qstate). */ void ipsecmod_operate(struct module_qstate* qstate, enum module_ev event, int id, struct outbound_entry* outbound); diff --git a/ipset/ipset.c b/ipset/ipset.c index f7cf2082e..9d1a8aa43 100644 --- a/ipset/ipset.c +++ b/ipset/ipset.c @@ -320,10 +320,10 @@ static int ipset_update(struct module_env *env, struct dns_msg *return_msg, return 0; } -int ipset_init(struct module_env* env, int id) { +int ipset_startup(struct module_env* env, int id) { struct ipset_env *ipset_env; - ipset_env = (struct ipset_env *)malloc(sizeof(struct ipset_env)); + ipset_env = (struct ipset_env *)calloc(1, sizeof(struct ipset_env)); if (!ipset_env) { log_err("malloc failure"); return 0; @@ -343,17 +343,16 @@ int ipset_init(struct module_env* env, int id) { return 1; } -int ipset_deinit(struct module_env* env, int id) { +void ipset_destartup(struct module_env* env, int id) { struct ipset_env *ipset_env = env->modinfo[id]; #ifdef HAVE_NET_PFVAR_H close((filter_dev)ipset_env->dev); #endif free(ipset_env); env->modinfo[id] = NULL; - return 1; } -int ipset_setup(struct module_env* env, int id) { +int ipset_init(struct module_env* env, int id) { struct ipset_env *ipset_env = env->modinfo[id]; ipset_env->name_v4 = env->cfg->ipset_name_v4; @@ -370,7 +369,7 @@ int ipset_setup(struct module_env* env, int id) { return 1; } -void ipset_desetup(struct module_env *env, int id) { +void ipset_deinit(struct module_env *env, int id) { filter_dev dev; struct ipset_env *ipset_env; @@ -497,7 +496,7 @@ size_t ipset_get_mem(struct module_env *env, int id) { */ static struct module_func_block ipset_block = { "ipset", - &ipset_init, &ipset_deinit, &ipset_setup, &ipset_desetup, + &ipset_init, &ipset_deinit, &ipset_startup, &ipset_destartup, &ipset_operate, &ipset_inform_super, &ipset_clear, &ipset_get_mem }; diff --git a/ipset/ipset.h b/ipset/ipset.h index 66a4378b6..195c7db93 100644 --- a/ipset/ipset.h +++ b/ipset/ipset.h @@ -50,14 +50,14 @@ struct ipset_qstate { int dummy; }; +/** Startup the ipset module */ +int ipset_startup(struct module_env* env, int id); +/** Destartup the ipset module */ +void ipset_destartup(struct module_env* env, int id); /** Init the ipset module */ int ipset_init(struct module_env* env, int id); /** Deinit the ipset module */ -int ipset_deinit(struct module_env* env, int id); -/** Setup the ipset module */ -int ipset_setup(struct module_env* env, int id); -/** Desetup the ipset module */ -void ipset_desetup(struct module_env* env, int id); +void ipset_deinit(struct module_env* env, int id); /** Operate on an event on a query (in qstate). */ void ipset_operate(struct module_qstate* qstate, enum module_ev event, int id, struct outbound_entry* outbound); diff --git a/iterator/iterator.c b/iterator/iterator.c index 5a9729ff0..c99d9504a 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -80,7 +80,7 @@ int BLACKLIST_PENALTY = (120000*4); static void target_count_increase_nx(struct iter_qstate* iq, int num); int -iter_setup(struct module_env* env, int id) +iter_init(struct module_env* env, int id) { struct iter_env* iter_env = (struct iter_env*)calloc(1, sizeof(struct iter_env)); @@ -114,7 +114,7 @@ caps_free(struct rbnode_type* n, void* ATTR_UNUSED(d)) } void -iter_desetup(struct module_env* env, int id) +iter_deinit(struct module_env* env, int id) { struct iter_env* iter_env; if(!env || !env->modinfo[id]) @@ -4489,8 +4489,8 @@ iter_get_mem(struct module_env* env, int id) */ static struct module_func_block iter_block = { "iterator", - &module_dummy_init, &module_dummy_init, &iter_setup, &iter_desetup, - &iter_operate, &iter_inform_super, &iter_clear, &iter_get_mem + &iter_init, &iter_deinit, NULL, NULL, &iter_operate, + &iter_inform_super, &iter_clear, &iter_get_mem }; struct module_func_block* diff --git a/iterator/iterator.h b/iterator/iterator.h index ec093014e..e253f3f7e 100644 --- a/iterator/iterator.h +++ b/iterator/iterator.h @@ -499,10 +499,10 @@ const char* iter_state_to_string(enum iter_state state); int iter_state_is_responsestate(enum iter_state s); /** iterator init */ -int iter_setup(struct module_env* env, int id); +int iter_init(struct module_env* env, int id); /** iterator deinit */ -void iter_desetup(struct module_env* env, int id); +void iter_deinit(struct module_env* env, int id); /** iterator operate on a query */ void iter_operate(struct module_qstate* qstate, enum module_ev event, int id, diff --git a/libunbound/context.c b/libunbound/context.c index 51f4474bb..f55aeb666 100644 --- a/libunbound/context.c +++ b/libunbound/context.c @@ -56,6 +56,9 @@ #include "iterator/iter_fwd.h" #include "iterator/iter_hints.h" +/** If the modules have started, once. */ +int modstack_started = 0; + int context_finalize(struct ub_ctx* ctx) { @@ -75,9 +78,12 @@ context_finalize(struct ub_ctx* ctx) ctx->pipe_pid = getpid(); cfg_apply_local_port_policy(cfg, 65536); config_apply(cfg); - if(!modstack_init(&ctx->mods, cfg->module_conf, ctx->env)) - return UB_INITFAIL; - if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env)) + if(!modstack_started) { + modstack_started = 1; + if(!modstack_startup(&ctx->mods, cfg->module_conf, ctx->env)) + return UB_INITFAIL; + } + if(!modstack_call_init(&ctx->mods, cfg->module_conf, ctx->env)) return UB_INITFAIL; listen_setup_locks(); log_edns_known_options(VERB_ALGO, ctx->env); diff --git a/libunbound/context.h b/libunbound/context.h index c0fc80e57..0a48db72d 100644 --- a/libunbound/context.h +++ b/libunbound/context.h @@ -337,4 +337,7 @@ struct ctx_query* context_deserialize_answer(struct ub_ctx* ctx, struct ctx_query* context_deserialize_cancel(struct ub_ctx* ctx, uint8_t* p, uint32_t len); +/** If the modules have started. */ +extern int modstack_started; + #endif /* LIBUNBOUND_CONTEXT_H */ diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c index 8a5e0188f..4b6e60c08 100644 --- a/libunbound/libunbound.c +++ b/libunbound/libunbound.c @@ -188,7 +188,8 @@ ub_ctx_create(void) int e = errno; ub_randfree(ctx->seed_rnd); config_delete(ctx->env->cfg); - modstack_desetup(&ctx->mods, ctx->env); + modstack_deinit(&ctx->mods, ctx->env); + modstack_destartup(&ctx->mods, ctx->env); listen_desetup_locks(); edns_known_options_delete(ctx->env); edns_strings_delete(ctx->env->edns_strings); @@ -202,7 +203,8 @@ ub_ctx_create(void) tube_delete(ctx->qq_pipe); ub_randfree(ctx->seed_rnd); config_delete(ctx->env->cfg); - modstack_desetup(&ctx->mods, ctx->env); + modstack_deinit(&ctx->mods, ctx->env); + modstack_destartup(&ctx->mods, ctx->env); listen_desetup_locks(); edns_known_options_delete(ctx->env); edns_strings_delete(ctx->env->edns_strings); @@ -360,8 +362,8 @@ ub_ctx_delete(struct ub_ctx* ctx) } libworker_delete_event(ctx->event_worker); - modstack_desetup(&ctx->mods, ctx->env); modstack_deinit(&ctx->mods, ctx->env); + modstack_destartup(&ctx->mods, ctx->env); a = ctx->alloc_list; while(a) { na = a->super; diff --git a/pythonmod/pythonmod.c b/pythonmod/pythonmod.c index 6bc6752e2..f397012ac 100644 --- a/pythonmod/pythonmod.c +++ b/pythonmod/pythonmod.c @@ -777,8 +777,8 @@ size_t pythonmod_get_mem(struct module_env* env, int id) */ static struct module_func_block pythonmod_block = { "python", - &module_dummy_init, &module_dummy_init, &pythonmod_init, &pythonmod_deinit, &pythonmod_operate, &pythonmod_inform_super, - &pythonmod_clear, &pythonmod_get_mem + &pythonmod_init, &pythonmod_deinit, NULL, NULL, &pythonmod_operate, + &pythonmod_inform_super, &pythonmod_clear, &pythonmod_get_mem }; struct module_func_block* pythonmod_get_funcblock(void) diff --git a/respip/respip.c b/respip/respip.c index 0dc6b626a..cfc6a4908 100644 --- a/respip/respip.c +++ b/respip/respip.c @@ -548,7 +548,7 @@ respip_copy_rrset(const struct ub_packed_rrset_key* key, struct regional* region } int -respip_setup(struct module_env* env, int id) +respip_init(struct module_env* env, int id) { (void)env; (void)id; @@ -556,7 +556,7 @@ respip_setup(struct module_env* env, int id) } void -respip_desetup(struct module_env* env, int id) +respip_deinit(struct module_env* env, int id) { (void)env; (void)id; @@ -1259,7 +1259,7 @@ respip_get_mem(struct module_env* env, int id) */ static struct module_func_block respip_block = { "respip", - &module_dummy_init, &module_dummy_init, &respip_setup, &respip_desetup, &respip_operate, + &respip_init, &respip_deinit, NULL, NULL, &respip_operate, &respip_inform_super, &respip_clear, &respip_get_mem }; diff --git a/respip/respip.h b/respip/respip.h index 3ebda5ce7..e4ab5cc9c 100644 --- a/respip/respip.h +++ b/respip/respip.h @@ -195,10 +195,10 @@ int respip_rewrite_reply(const struct query_info* qinfo, struct module_func_block* respip_get_funcblock(void); /** response-ip init */ -int respip_setup(struct module_env* env, int id); +int respip_init(struct module_env* env, int id); /** response-ip deinit */ -void respip_desetup(struct module_env* env, int id); +void respip_deinit(struct module_env* env, int id); /** response-ip operate on a query */ void respip_operate(struct module_qstate* qstate, enum module_ev event, int id, diff --git a/services/modstack.c b/services/modstack.c index 77e33263c..85f0afc5d 100644 --- a/services/modstack.c +++ b/services/modstack.c @@ -216,7 +216,7 @@ module_func_block* module_factory(const char** str) } int -modstack_init(struct module_stack* stack, const char* module_conf, +modstack_startup(struct module_stack* stack, const char* module_conf, struct module_env* env) { int i; @@ -227,11 +227,13 @@ modstack_init(struct module_stack* stack, const char* module_conf, return 0; } for(i=0; inum; i++) { - verbose(VERB_OPS, "init module %d: %s", + if(stack->mod[i]->startup == NULL) + continue; + verbose(VERB_OPS, "startup module %d: %s", i, stack->mod[i]->name); - fptr_ok(fptr_whitelist_mod_init(stack->mod[i]->init)); - if(!(*stack->mod[i]->init)(env, i)) { - log_err("module init for module %s failed", + fptr_ok(fptr_whitelist_mod_startup(stack->mod[i]->startup)); + if(!(*stack->mod[i]->startup)(env, i)) { + log_err("module startup for module %s failed", stack->mod[i]->name); return 0; } @@ -240,7 +242,7 @@ modstack_init(struct module_stack* stack, const char* module_conf, } int -modstack_setup(struct module_stack* stack, const char* module_conf, +modstack_call_init(struct module_stack* stack, const char* module_conf, struct module_env* env) { int i; @@ -254,11 +256,11 @@ modstack_setup(struct module_stack* stack, const char* module_conf, return 0; } module_conf += strlen(stack->mod[i]->name); - verbose(VERB_OPS, "setup module %d: %s", + verbose(VERB_OPS, "init module %d: %s", i, stack->mod[i]->name); - fptr_ok(fptr_whitelist_mod_setup(stack->mod[i]->setup)); - if(!(*stack->mod[i]->setup)(env, i)) { - log_err("module setup for module %s failed", + fptr_ok(fptr_whitelist_mod_init(stack->mod[i]->init)); + if(!(*stack->mod[i]->init)(env, i)) { + log_err("module init for module %s failed", stack->mod[i]->name); return 0; } @@ -267,22 +269,24 @@ modstack_setup(struct module_stack* stack, const char* module_conf, } void -modstack_desetup(struct module_stack* stack, struct module_env* env) +modstack_deinit(struct module_stack* stack, struct module_env* env) { int i; for(i=0; inum; i++) { - fptr_ok(fptr_whitelist_mod_desetup(stack->mod[i]->desetup)); - (*stack->mod[i]->desetup)(env, i); + fptr_ok(fptr_whitelist_mod_deinit(stack->mod[i]->deinit)); + (*stack->mod[i]->deinit)(env, i); } } void -modstack_deinit(struct module_stack* stack, struct module_env* env) +modstack_destartup(struct module_stack* stack, struct module_env* env) { int i; for(i=0; inum; i++) { - fptr_ok(fptr_whitelist_mod_deinit(stack->mod[i]->deinit)); - (*stack->mod[i]->deinit)(env, i); + if(stack->mod[i]->destartup == NULL) + continue; + fptr_ok(fptr_whitelist_mod_destartup(stack->mod[i]->destartup)); + (*stack->mod[i]->destartup)(env, i); } stack->num = 0; free(stack->mod); diff --git a/services/modstack.h b/services/modstack.h index 3e79595ed..3f01be619 100644 --- a/services/modstack.h +++ b/services/modstack.h @@ -60,10 +60,9 @@ struct module_stack { * @param module_conf: string what modules to initialize * @param env: module environment which is inited by the modules. * environment should have a superalloc, cfg, - * env.need_to_validate is set by the modules. * @return on false a module init failed. */ -int modstack_init(struct module_stack* stack, const char* module_conf, +int modstack_startup(struct module_stack* stack, const char* module_conf, struct module_env* env); /** @@ -89,31 +88,31 @@ struct module_func_block* module_factory(const char** str); const char** module_list_avail(void); /** - * Setup modules. Calls module_setup(). + * Init modules. Calls module_init(). * @param stack: It is modstack_setupped(). * @param module_conf: module ordering to check against the ordering in stack. - * fails on changed ordering. + * fails on changed ordering. * @param env: module environment which is inited by the modules. * environment should have a superalloc, cfg, * env.need_to_validate is set by the modules. * @return on false a module init failed. */ -int modstack_setup(struct module_stack* stack, const char* module_conf, +int modstack_call_init(struct module_stack* stack, const char* module_conf, struct module_env* env); /** - * Desetup the modules + * Deinint the modules * @param stack: made empty. * @param env: module env for module deinit() calls. */ -void modstack_desetup(struct module_stack* stack, struct module_env* env); +void modstack_deinit(struct module_stack* stack, struct module_env* env); /** - * Deinit the modules, deinit, delete. + * Destartup the modules, close, delete. * @param stack: made empty. - * @param env: module env for module deinit() calls. + * @param env: module env for module destartup() calls. */ -void modstack_deinit(struct module_stack* stack, struct module_env* env); +void modstack_destartup(struct module_stack* stack, struct module_env* env); /** * Find index of module by name. diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c index 6271d10cf..6cc5285ec 100644 --- a/smallapp/unbound-checkconf.c +++ b/smallapp/unbound-checkconf.c @@ -140,12 +140,13 @@ check_mod(struct config_file* cfg, struct module_func_block* fb) fatal_exit("out of memory"); if(!edns_known_options_init(&env)) fatal_exit("out of memory"); - if(!(*fb->setup)(&env, 0)) - fatal_exit("bad config for %s module", fb->name); - if(!(*fb->setup)(&env, 0)) - fatal_exit("bad config for %s module", fb->name); - (*fb->desetup)(&env, 0); + if(fb->startup && !(*fb->startup)(&env, 0)) + fatal_exit("bad config during startup for %s module", fb->name); + if(!(*fb->init)(&env, 0)) + fatal_exit("bad config during init for %s module", fb->name); (*fb->deinit)(&env, 0); + if(fb->destartup) + (*fb->destartup)(&env, 0); sldns_buffer_free(env.scratch_buffer); regional_destroy(env.scratch); edns_known_options_delete(&env); diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 23c9f7010..5336a1224 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -287,9 +287,11 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, env.auth_zones = auth_zones_create(); if(!env.auth_zones) fatal_exit("out of memory"); - modstack_init(&mods); - if(!modstack_setup(&mods, env.cfg->module_conf, &env)) - fatal_exit("could not modstack_setup"); + memset(&mods, 0, sizeof(mods)); + if(!modstack_startup(&mods, env.cfg->module_conf, &env)) + fatal_exit("could not modstack_startup"); + if(!modstack_call_init(&mods, env.cfg->module_conf, &env)) + fatal_exit("could not modstack_call_init"); env.mesh = mesh_create(&mods, &env); if(!env.mesh) fatal_exit("out of memory"); @@ -327,7 +329,8 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, /* desetup test harness */ mesh_delete(env.mesh); - modstack_desetup(&mods, &env); + modstack_deinit(&mods, &env); + modstack_destartup(&mods, &env); auth_zones_delete(env.auth_zones); anchors_delete(env.anchors); config_delete(env.cfg); diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c index d24941321..b13988835 100644 --- a/util/fptr_wlist.c +++ b/util/fptr_wlist.c @@ -395,30 +395,10 @@ fptr_whitelist_modenv_detect_cycle(int (*fptr)( int fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id)) { - if(fptr == &module_dummy_init) return 1; -#ifdef USE_IPSET - else if(fptr == &ipset_init) return 1; -#endif - return 0; -} - -int -fptr_whitelist_mod_deinit(int (*fptr)(struct module_env* env, int id)) -{ - if(fptr == &module_dummy_init) return 1; -#ifdef USE_IPSET - else if(fptr == &ipset_deinit) return 1; -#endif - return 0; -} - -int -fptr_whitelist_mod_setup(int (*fptr)(struct module_env* env, int id)) -{ - if(fptr == &iter_setup) return 1; - else if(fptr == &val_setup) return 1; - else if(fptr == &dns64_setup) return 1; - else if(fptr == &respip_setup) return 1; + if(fptr == &iter_init) return 1; + else if(fptr == &val_init) return 1; + else if(fptr == &dns64_init) return 1; + else if(fptr == &respip_init) return 1; #ifdef WITH_PYTHONMODULE else if(fptr == &pythonmod_init) return 1; #endif @@ -426,27 +406,28 @@ fptr_whitelist_mod_setup(int (*fptr)(struct module_env* env, int id)) else if(fptr == &dynlibmod_init) return 1; #endif #ifdef USE_CACHEDB - else if(fptr == &cachedb_setup) return 1; + else if(fptr == &cachedb_init) return 1; #endif #ifdef USE_IPSECMOD - else if(fptr == &ipsecmod_setup) return 1; + else if(fptr == &ipsecmod_init) return 1; #endif #ifdef CLIENT_SUBNET - else if(fptr == &subnetmod_setup) return 1; + else if(fptr == &subnetmod_init) return 1; #endif #ifdef USE_IPSET - else if(fptr == &ipset_setup) return 1; + else if(fptr == &ipset_init) return 1; #endif return 0; + } -int -fptr_whitelist_mod_desetup(void (*fptr)(struct module_env* env, int id)) +int +fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id)) { - if(fptr == &iter_desetup) return 1; - else if(fptr == &val_desetup) return 1; - else if(fptr == &dns64_desetup) return 1; - else if(fptr == &respip_desetup) return 1; + if(fptr == &iter_deinit) return 1; + else if(fptr == &val_deinit) return 1; + else if(fptr == &dns64_deinit) return 1; + else if(fptr == &respip_deinit) return 1; #ifdef WITH_PYTHONMODULE else if(fptr == &pythonmod_deinit) return 1; #endif @@ -454,16 +435,34 @@ fptr_whitelist_mod_desetup(void (*fptr)(struct module_env* env, int id)) else if(fptr == &dynlibmod_deinit) return 1; #endif #ifdef USE_CACHEDB - else if(fptr == &cachedb_desetup) return 1; + else if(fptr == &cachedb_deinit) return 1; #endif #ifdef USE_IPSECMOD - else if(fptr == &ipsecmod_desetup) return 1; + else if(fptr == &ipsecmod_deinit) return 1; #endif #ifdef CLIENT_SUBNET - else if(fptr == &subnetmod_desetup) return 1; + else if(fptr == &subnetmod_deinit) return 1; +#endif +#ifdef USE_IPSET + else if(fptr == &ipset_deinit) return 1; #endif + return 0; +} + +int +fptr_whitelist_mod_startup(int (*fptr)(struct module_env* env, int id)) +{ +#ifdef USE_IPSET + if(fptr == &ipset_startup) return 1; +#endif + return 0; +} + +int +fptr_whitelist_mod_destartup(void (*fptr)(struct module_env* env, int id)) +{ #ifdef USE_IPSET - else if(fptr == &ipset_desetup) return 1; + if(fptr == &ipset_destartup) return 1; #endif return 0; } diff --git a/util/fptr_wlist.h b/util/fptr_wlist.h index cf70c7066..fb2475cce 100644 --- a/util/fptr_wlist.h +++ b/util/fptr_wlist.h @@ -276,23 +276,23 @@ int fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id)); * @param fptr: function pointer to check. * @return false if not in whitelist. */ -int fptr_whitelist_mod_deinit(int (*fptr)(struct module_env* env, int id)); +int fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id)); /** - * Check function pointer whitelist for module setup call values. + * Check function pointer whitelist for module startup call values. * * @param fptr: function pointer to check. * @return false if not in whitelist. */ -int fptr_whitelist_mod_setup(int (*fptr)(struct module_env* env, int id)); +int fptr_whitelist_mod_startup(int (*fptr)(struct module_env* env, int id)); /** - * Check function pointer whitelist for module desetup call values. + * Check function pointer whitelist for module destartup call values. * * @param fptr: function pointer to check. * @return false if not in whitelist. */ -int fptr_whitelist_mod_desetup(void (*fptr)(struct module_env* env, int id)); +int fptr_whitelist_mod_destartup(void (*fptr)(struct module_env* env, int id)); /** * Check function pointer whitelist for module operate call values. diff --git a/util/module.c b/util/module.c index 1f0cdbef3..90a155b5e 100644 --- a/util/module.c +++ b/util/module.c @@ -415,8 +415,3 @@ copy_state_to_super(struct module_qstate* qstate, int ATTR_UNUSED(id), super->was_ratelimited = qstate->was_ratelimited; } } - -int module_dummy_init(struct module_env* env, int id) -{ - return 1; -} diff --git a/util/module.h b/util/module.h index b140fd2bb..702372cb8 100644 --- a/util/module.h +++ b/util/module.h @@ -713,39 +713,42 @@ struct module_func_block { const char* name; /** - * initialise the module. This is called only once at startup. - * Privileged operations like opening device files may be done here. + * Initialise the module. Called when restarting or reloading the + * daemon. + * This is the place to apply settings from the config file. + * @param env: module environment. * @param id: module id number. * return: 0 on error */ int (*init)(struct module_env* env, int id); /** - * deinitialise the module. This is called only once before shutdown to - * free resources allocated during init(). - * Closing privileged ports or files must be done here. + * Deinitialise the module, undo stuff done during init(). + * Called before reloading the daemon. + * @param env: module environment. * @param id: module id number. - * return: 0 on error */ - int (*deinit)(struct module_env* env, int id); + void (*deinit)(struct module_env* env, int id); /** - * setup the module. Called when restarting or reloading the - * daemon. - * This is the place to apply settings from the config file. + * Set up the module for start. This is called only once at startup. + * Privileged operations like opening device files may be done here. + * The function ptr can be NULL, if it is not used. * @param env: module environment. * @param id: module id number. * return: 0 on error */ - int (*setup)(struct module_env* env, int id); + int (*startup)(struct module_env* env, int id); /** - * de-setup, undo stuff done during setup(). - * Called before reloading the daemon. + * Close down the module for stop. This is called only once before + * shutdown to free resources allocated during startup(). + * Closing privileged ports or files must be done here. + * The function ptr can be NULL, if it is not used. * @param env: module environment. * @param id: module id number. */ - void (*desetup)(struct module_env* env, int id); + void (*destartup)(struct module_env* env, int id); /** * accept a new query, or work further on existing query. @@ -983,6 +986,4 @@ void log_edns_known_options(enum verbosity_value level, void copy_state_to_super(struct module_qstate* qstate, int id, struct module_qstate* super); -int module_dummy_init(struct module_env* env, int id); - #endif /* UTIL_MODULE_H */ diff --git a/validator/validator.c b/validator/validator.c index 2a3be7e40..3f62733c7 100644 --- a/validator/validator.c +++ b/validator/validator.c @@ -185,7 +185,7 @@ val_apply_cfg(struct module_env* env, struct val_env* val_env, void ecdsa_evp_workaround_init(void); #endif int -val_setup(struct module_env* env, int id) +val_init(struct module_env* env, int id) { struct val_env* val_env = (struct val_env*)calloc(1, sizeof(struct val_env)); @@ -221,7 +221,7 @@ val_setup(struct module_env* env, int id) } void -val_desetup(struct module_env* env, int id) +val_deinit(struct module_env* env, int id) { struct val_env* val_env; if(!env || !env->modinfo[id]) @@ -3344,8 +3344,8 @@ val_get_mem(struct module_env* env, int id) */ static struct module_func_block val_block = { "validator", - &module_dummy_init, &module_dummy_init, &val_setup, &val_desetup, - &val_operate, &val_inform_super, &val_clear, &val_get_mem + &val_init, &val_deinit, NULL, NULL, &val_operate, &val_inform_super, + &val_clear, &val_get_mem }; struct module_func_block* diff --git a/validator/validator.h b/validator/validator.h index 844dfe7be..72f44b16e 100644 --- a/validator/validator.h +++ b/validator/validator.h @@ -246,10 +246,10 @@ struct module_func_block* val_get_funcblock(void); const char* val_state_to_string(enum val_state state); /** validator init */ -int val_setup(struct module_env* env, int id); +int val_init(struct module_env* env, int id); /** validator deinit */ -void val_desetup(struct module_env* env, int id); +void val_deinit(struct module_env* env, int id); /** validator operate on a query */ void val_operate(struct module_qstate* qstate, enum module_ev event, int id, -- 2.47.2