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 * Read config file module settings and set up the modfunc block 65 * @param stack: the stack of modules (empty before call). 66 * @param module_conf: string what modules to insert. 67 * @return false on error 68 */ 69 int modstack_config(struct module_stack* stack, const char* module_conf); 70 71 /** 72 * Get funcblock for module name 73 * @param str: string with module name. Advanced to next value on success. 74 * The string is assumed whitespace separated list of module names. 75 * @return funcblock or NULL on error. 76 */ 77 struct module_func_block* module_factory(const char** str); 78 79 /** 80 * Get list of modules available. 81 * @return list of modules available. Static strings, ends with NULL. 82 */ 83 const char** module_list_avail(void); 84 85 /** 86 * Setup modules. Assigns ids and calls module_init. 87 * @param stack: if not empty beforehand, it will be desetup()ed. 88 * It is then modstack_configged(). 89 * @param module_conf: string what modules to insert. 90 * @param env: module environment which is inited by the modules. 91 * environment should have a superalloc, cfg, 92 * env.need_to_validate is set by the modules. 93 * @return on false a module init failed. 94 */ 95 int modstack_setup(struct module_stack* stack, const char* module_conf, 96 struct module_env* env); 97 98 /** 99 * Desetup the modules, deinit, delete. 100 * @param stack: made empty. 101 * @param env: module env for module deinit() calls. 102 */ 103 void modstack_desetup(struct module_stack* stack, struct module_env* env); 104 105 /** 106 * Find index of module by name. 107 * @param stack: to look in 108 * @param name: the name to look for 109 * @return -1 on failure, otherwise index number. 110 */ 111 int modstack_find(struct module_stack* stack, const char* name); 112 113 /** fetch memory for a module by name, returns 0 if module not there */ 114 size_t mod_get_mem(struct module_env* env, const char* name); 115 116 #endif /* SERVICES_MODSTACK_H */ 117