]>
git.saurik.com Git - apple/network_cmds.git/blob - unbound/services/modstack.c
2 * services/modstack.c - stack of modules
4 * Copyright (c) 2007, NLnet Labs. All rights reserved.
6 * This software is open source.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
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.
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.
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.
39 * This file contains functions to help maintain a stack of modules.
43 #include "services/modstack.h"
44 #include "util/module.h"
45 #include "util/fptr_wlist.h"
46 #include "dns64/dns64.h"
47 #include "iterator/iterator.h"
48 #include "validator/validator.h"
50 #ifdef WITH_PYTHONMODULE
51 #include "pythonmod/pythonmod.h"
54 /** count number of modules (words) in the string */
56 count_modules(const char* s
)
63 while(*s
&& isspace((unsigned char)*s
))
65 if(*s
&& !isspace((unsigned char)*s
)) {
68 while(*s
&& !isspace((unsigned char)*s
))
76 modstack_init(struct module_stack
* stack
)
83 modstack_config(struct module_stack
* stack
, const char* module_conf
)
86 verbose(VERB_QUERY
, "module config: \"%s\"", module_conf
);
87 stack
->num
= count_modules(module_conf
);
89 log_err("error: no modules specified");
92 if(stack
->num
> MAX_MODULE
) {
93 log_err("error: too many modules (%d max %d)",
94 stack
->num
, MAX_MODULE
);
97 stack
->mod
= (struct module_func_block
**)calloc((size_t)
98 stack
->num
, sizeof(struct module_func_block
*));
100 log_err("out of memory");
103 for(i
=0; i
<stack
->num
; i
++) {
104 stack
->mod
[i
] = module_factory(&module_conf
);
106 log_err("Unknown value for next module: '%s'",
114 /** The list of module names */
116 module_list_avail(void)
118 /* these are the modules available */
119 static const char* names
[] = {
121 #ifdef WITH_PYTHONMODULE
130 /** func block get function type */
131 typedef struct module_func_block
* (*fbgetfunctype
)(void);
133 /** The list of module func blocks */
134 static fbgetfunctype
*
135 module_funcs_avail(void)
137 static struct module_func_block
* (*fb
[])(void) = {
138 &dns64_get_funcblock
,
139 #ifdef WITH_PYTHONMODULE
140 &pythonmod_get_funcblock
,
149 module_func_block
* module_factory(const char** str
)
152 const char* s
= *str
;
153 const char** names
= module_list_avail();
154 fbgetfunctype
* fb
= module_funcs_avail();
155 while(*s
&& isspace((unsigned char)*s
))
158 if(strncmp(names
[i
], s
, strlen(names
[i
])) == 0) {
159 s
+= strlen(names
[i
]);
169 modstack_setup(struct module_stack
* stack
, const char* module_conf
,
170 struct module_env
* env
)
174 modstack_desetup(stack
, env
);
175 /* fixed setup of the modules */
176 if(!modstack_config(stack
, module_conf
)) {
179 env
->need_to_validate
= 0; /* set by module init below */
180 for(i
=0; i
<stack
->num
; i
++) {
181 verbose(VERB_OPS
, "init module %d: %s",
182 i
, stack
->mod
[i
]->name
);
183 fptr_ok(fptr_whitelist_mod_init(stack
->mod
[i
]->init
));
184 if(!(*stack
->mod
[i
]->init
)(env
, i
)) {
185 log_err("module init for module %s failed",
186 stack
->mod
[i
]->name
);
194 modstack_desetup(struct module_stack
* stack
, struct module_env
* env
)
197 for(i
=0; i
<stack
->num
; i
++) {
198 fptr_ok(fptr_whitelist_mod_deinit(stack
->mod
[i
]->deinit
));
199 (*stack
->mod
[i
]->deinit
)(env
, i
);
207 modstack_find(struct module_stack
* stack
, const char* name
)
210 for(i
=0; i
<stack
->num
; i
++) {
211 if(strcmp(stack
->mod
[i
]->name
, name
) == 0)