1 /* 2 * services/modstack.h - stack of modules 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * Neither the name of the NLNET LABS nor the names of its contributors may 20 * be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 */ 35 36 /** 37 * \file 38 * 39 * This file contains functions to help maintain a stack of modules. 40 */ 41 42 #ifndef SERVICES_MODSTACK_H 43 #define SERVICES_MODSTACK_H 44 struct module_func_block; 45 struct module_env; 46 47 /** 48 * Stack of modules. 49 */ 50 struct module_stack { 51 /** the number of modules */ 52 int num; 53 /** the module callbacks, array of num_modules length (ref only) */ 54 struct module_func_block** mod; 55 }; 56 57 /** 58 * Init a stack of modules 59 * @param stack: initialised as empty. 60 */ 61 void modstack_init(struct module_stack* stack); 62 63 /** 64 * Free the stack of modules 65 * @param stack: stack that frees up memory. 66 */ 67 void modstack_free(struct module_stack* stack); 68 69 /** 70 * Initialises modules and assignes ids. Calls module_startup(). 71 * @param stack: Expected empty, filled according to module_conf 72 * @param module_conf: string what modules to initialize 73 * @param env: module environment which is inited by the modules. 74 * environment should have a superalloc, cfg, 75 * @return on false a module init failed. 76 */ 77 int modstack_call_startup(struct module_stack* stack, const char* module_conf, 78 struct module_env* env); 79 80 /** 81 * Read config file module settings and set up the modfunc block 82 * @param stack: the stack of modules (empty before call). 83 * @param module_conf: string what modules to insert. 84 * @return false on error 85 */ 86 int modstack_config(struct module_stack* stack, const char* module_conf); 87 88 /** 89 * Get funcblock for module name 90 * @param str: string with module name. Advanced to next value on success. 91 * The string is assumed whitespace separated list of module names. 92 * @return funcblock or NULL on error. 93 */ 94 struct module_func_block* module_factory(const char** str); 95 96 /** 97 * Get list of modules available. 98 * @return list of modules available. Static strings, ends with NULL. 99 */ 100 const char** module_list_avail(void); 101 102 /** 103 * Init modules. Calls module_init(). 104 * @param stack: It is modstack_setupped(). 105 * @param module_conf: module ordering to check against the ordering in stack. 106 * fails on changed ordering. 107 * @param env: module environment which is inited by the modules. 108 * environment should have a superalloc, cfg, 109 * env.need_to_validate is set by the modules. 110 * @return on false a module init failed. 111 */ 112 int modstack_call_init(struct module_stack* stack, const char* module_conf, 113 struct module_env* env); 114 115 /** 116 * Deinit the modules. 117 * @param stack: made empty. 118 * @param env: module env for module deinit() calls. 119 */ 120 void modstack_call_deinit(struct module_stack* stack, struct module_env* env); 121 122 /** 123 * Destartup the modules, close, delete. 124 * @param stack: made empty. 125 * @param env: module env for module destartup() calls. 126 */ 127 void modstack_call_destartup(struct module_stack* stack, struct module_env* env); 128 129 /** 130 * Find index of module by name. 131 * @param stack: to look in 132 * @param name: the name to look for 133 * @return -1 on failure, otherwise index number. 134 */ 135 int modstack_find(struct module_stack* stack, const char* name); 136 137 /** fetch memory for a module by name, returns 0 if module not there */ 138 size_t mod_get_mem(struct module_env* env, const char* name); 139 140 #endif /* SERVICES_MODSTACK_H */ 141