]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Call module init init again, and new function startup and destartup.
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Mon, 1 Jul 2024 14:10:07 +0000 (16:10 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Mon, 1 Jul 2024 14:10:07 +0000 (16:10 +0200)
NULL can be used if the function is not used. Open shared ports during
reload. Deinit is called during reload.

32 files changed:
cachedb/cachedb.c
cachedb/cachedb.h
daemon/daemon.c
daemon/daemon.h
daemon/unbound.c
dns64/dns64.c
dns64/dns64.h
dynlibmod/dynlibmod.c
edns-subnet/subnetmod.c
edns-subnet/subnetmod.h
ipsecmod/ipsecmod.c
ipsecmod/ipsecmod.h
ipset/ipset.c
ipset/ipset.h
iterator/iterator.c
iterator/iterator.h
libunbound/context.c
libunbound/context.h
libunbound/libunbound.c
pythonmod/pythonmod.c
respip/respip.c
respip/respip.h
services/modstack.c
services/modstack.h
smallapp/unbound-checkconf.c
testcode/unitzonemd.c
util/fptr_wlist.c
util/fptr_wlist.h
util/module.c
util/module.h
validator/validator.c
validator/validator.h

index d610c4f19e502779a1e7beffe4e181e666bb5d2e..aca68d7ed73fd2359f53083b1627fef16543a287 100644 (file)
@@ -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
 };
 
index 3d3e101d73cc36b37d38604583f9ed587893b96e..482c5db6c063d64d06b77f64e346829ba7345065 100644 (file)
@@ -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);
index 15102b9d2065b84e3c32c4d18fe7348a483e0d77..eb933cc939ddc19615bd9a8bc8143c5902042985 100644 (file)
@@ -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; i<daemon->num; 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]);
index 0f6c260a8cf912804d208b3928a04be00b60674a..200149745c1c2426e8735aa8e02c0982982d1f72 100644 (file)
@@ -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.
index 3644709d0a56c14cdb130557d087d357075d9a6b..306fe6caf927b9ad2771ff884c7d1705ef158b31 100644 (file)
@@ -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 {
index 3f2994fa67b752b8e42bb04ab8f643969b0da4fd..d34eafb9f73f783686e23edfcc959181a59e83c7 100644 (file)
@@ -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
 };
 
 /**
index 532a5bed3a984a48bbe7c0e009ff4c6025ded19d..2f0c01a228cd06b8390c91ec65aac58cb96d24a1 100644 (file)
 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,
index 1e040a30e7431e732f792f344470c640988320e5..06c4f08c18215b9accb63b779fe6db09d9bf45be 100644 (file)
@@ -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)
index 61672be59dcc88322ec51dc71b511bc980a0ae89..8e6db02e7f2a9e71a13ed3b9eac87d4a502781e1 100644 (file)
@@ -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*
index 8999aa6326f60ad0c9b363f3aa36fc656161d260..1ff8a23ecdbaee80d1bbd4252f60c73b0c8fd4ec 100644 (file)
@@ -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,
index 83f91702b5413f4d6fd6f34ee3421395eb225a7f..137e22c33752617b569861bae8b526495bef83da 100644 (file)
@@ -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*
index 9e77208c42a6ec84da93fe0cad583d692c7d7040..272f473c2eac4f1b916f6c0db39c2226a243234b 100644 (file)
@@ -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);
index f7cf2082ea1b84defe0d9f96d0d9f9a2de855271..9d1a8aa432be31f552ebc2e3cf94066ba40d9a00 100644 (file)
@@ -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
 };
 
index 66a4378b628708857736858e1c25d97514225b3f..195c7db93cdd6a805097277fbf0382004becab37 100644 (file)
@@ -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);
index 5a9729ff08c94cc853ac39b916339c956e33c876..c99d9504aa966808b4ba5d67ca47b0b56a9a66f5 100644 (file)
@@ -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* 
index ec093014ecd30f2f4edd5c9076a45298ce796b76..e253f3f7e2bd36ddea96e9de58abb11f32c63919 100644 (file)
@@ -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,
index 51f4474bb4b72c9d12621d6f355ee270820a818a..f55aeb6667743dcd65c166cc140606a2e2c3ca8d 100644 (file)
@@ -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);
index c0fc80e57be4d2e425cf9f1b65d10aeb7e142bbe..0a48db72d4d36cba7a3dfe4da8bf8d9575104b17 100644 (file)
@@ -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 */
index 8a5e0188f27eb6da593bfb8ec16049159bb85137..4b6e60c08a86981817f6ab6997a12ca50b361f46 100644 (file)
@@ -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;
index 6bc6752e2db734fbd57847888ff009542e7d27e4..f397012ac1c2ae4d71e1d378eb540676f1bfd14d 100644 (file)
@@ -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)
index 0dc6b626a6561eabb1945939f6d8d7a1116727f0..cfc6a4908697d7760555a480993d9b2bfb544c32 100644 (file)
@@ -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
 };
 
index 3ebda5ce770aa82910dc7bdeb8623629aa9b5314..e4ab5cc9cce376dd84ef95062cdff5a0e540ffa5 100644 (file)
@@ -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,
index 77e33263c2337a2962fdfd66b545d460c2fa8413..85f0afc5db921cc1adb2694d5d026976c74b726b 100644 (file)
@@ -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; i<stack->num; 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; i<stack->num; 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; i<stack->num; 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);
index 3e79595ed6ebd5b9763727b024d5afc8df4762b3..3f01be619d0cfb9512cfcce34be2a08f38cbd453 100644 (file)
@@ -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.
index 6271d10cf8b030c9ea8e60536a69e281b84a5cb5..6cc5285ecf15bfcc795626a3bc51404096fcb1b7 100644 (file)
@@ -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);
index 23c9f70106443d13fe87fc754f9e0264eafe7371..5336a1224cb200789346966bc3b8e2aed626c3fe 100644 (file)
@@ -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);
index d249413213168016593d4ea7b466bd152e206de8..b13988835d4f9484f3c00c1e50379cc51bb4da84 100644 (file)
@@ -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;
 }
index cf70c7066ca97d68ba3c84982a4a586bc3520119..fb2475cce1092e6503d156d3be8bf90eecb9bcce 100644 (file)
@@ -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.
index 1f0cdbef30fd31197070d69e7e62eac67b05f371..90a155b5e8aa06a6370e88efcfeff163ebf3e67f 100644 (file)
@@ -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;
-}
index b140fd2bbb01be51ebf4f896be8e20a17135a7ab..702372cb8b6a2701440e71c766179c3dfc3097a3 100644 (file)
@@ -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 */
index 2a3be7e40782b15b9a8ae39a3d67e7fba6d35f07..3f62733c7491d367477848ef8eb4aec73ab61917 100644 (file)
@@ -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* 
index 844dfe7be0bd3050cf39ca00e984e83ee574adfc..72f44b16e3822fa7a2423a0c7b452bcd7015187b 100644 (file)
@@ -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,