diff options
Diffstat (limited to 'util/module.c')
-rw-r--r-- | util/module.c | 155 |
1 files changed, 34 insertions, 121 deletions
diff --git a/util/module.c b/util/module.c index 91983b18274d..f4b715d141b1 100644 --- a/util/module.c +++ b/util/module.c @@ -123,121 +123,29 @@ edns_register_option(uint16_t opt_code, int bypass_cache_stage, return 1; } -static int -inplace_cb_reply_register_generic(inplace_cb_reply_func_type* cb, - enum inplace_cb_list_type type, void* cb_arg, struct module_env* env) -{ - struct inplace_cb_reply* callback; - struct inplace_cb_reply** prevp; - if(env->worker) { - log_err("invalid edns callback registration: " - "trying to register callback after module init phase"); - return 0; - } - - callback = (struct inplace_cb_reply*)calloc(1, sizeof(*callback)); - if(callback == NULL) { - log_err("out of memory during edns callback registration."); - return 0; - } - callback->next = NULL; - callback->cb = cb; - callback->cb_arg = cb_arg; - - prevp = (struct inplace_cb_reply**) &env->inplace_cb_lists[type]; - /* append at end of list */ - while(*prevp != NULL) - prevp = &((*prevp)->next); - *prevp = callback; - return 1; -} - -int -inplace_cb_reply_register(inplace_cb_reply_func_type* cb, void* cb_arg, - struct module_env* env) -{ - return inplace_cb_reply_register_generic(cb, inplace_cb_reply, cb_arg, - env); -} - -int -inplace_cb_reply_cache_register(inplace_cb_reply_func_type* cb, void* cb_arg, - struct module_env* env) -{ - return inplace_cb_reply_register_generic(cb, inplace_cb_reply_cache, - cb_arg, env); -} - int -inplace_cb_reply_local_register(inplace_cb_reply_func_type* cb, void* cb_arg, - struct module_env* env) +inplace_cb_register(void* cb, enum inplace_cb_list_type type, void* cbarg, + struct module_env* env, int id) { - return inplace_cb_reply_register_generic(cb, inplace_cb_reply_local, - cb_arg, env); -} - -int -inplace_cb_reply_servfail_register(inplace_cb_reply_func_type* cb, void* cb_arg, - struct module_env* env) -{ - return inplace_cb_reply_register_generic(cb, inplace_cb_reply_servfail, - cb_arg, env); -} - -static void -inplace_cb_reply_delete_generic(struct module_env* env, - enum inplace_cb_list_type type) -{ - struct inplace_cb_reply* curr = env->inplace_cb_lists[type]; - struct inplace_cb_reply* tmp; - /* delete list */ - while(curr) { - tmp = curr->next; - free(curr); - curr = tmp; - } - /* update head pointer */ - env->inplace_cb_lists[type] = NULL; -} - -void inplace_cb_reply_delete(struct module_env* env) -{ - inplace_cb_reply_delete_generic(env, inplace_cb_reply); -} - -void inplace_cb_reply_cache_delete(struct module_env* env) -{ - inplace_cb_reply_delete_generic(env, inplace_cb_reply_cache); -} - -void inplace_cb_reply_servfail_delete(struct module_env* env) -{ - inplace_cb_reply_delete_generic(env, inplace_cb_reply_servfail); -} - -int -inplace_cb_query_register(inplace_cb_query_func_type* cb, void* cb_arg, - struct module_env* env) -{ - struct inplace_cb_query* callback; - struct inplace_cb_query** prevp; + struct inplace_cb* callback; + struct inplace_cb** prevp; if(env->worker) { log_err("invalid edns callback registration: " "trying to register callback after module init phase"); return 0; } - callback = (struct inplace_cb_query*)calloc(1, sizeof(*callback)); + callback = (struct inplace_cb*)calloc(1, sizeof(*callback)); if(callback == NULL) { log_err("out of memory during edns callback registration."); return 0; } + callback->id = id; callback->next = NULL; callback->cb = cb; - callback->cb_arg = cb_arg; + callback->cb_arg = cbarg; - prevp = (struct inplace_cb_query**) - &env->inplace_cb_lists[inplace_cb_query]; + prevp = (struct inplace_cb**) &env->inplace_cb_lists[type]; /* append at end of list */ while(*prevp != NULL) prevp = &((*prevp)->next); @@ -246,27 +154,30 @@ inplace_cb_query_register(inplace_cb_query_func_type* cb, void* cb_arg, } void -inplace_cb_query_delete(struct module_env* env) -{ - struct inplace_cb_query* curr = env->inplace_cb_lists[inplace_cb_query]; - struct inplace_cb_query* tmp; - /* delete list */ - while(curr) { - tmp = curr->next; - free(curr); - curr = tmp; +inplace_cb_delete(struct module_env* env, enum inplace_cb_list_type type, + int id) +{ + struct inplace_cb* temp = env->inplace_cb_lists[type]; + struct inplace_cb* prev = NULL; + + while(temp) { + if(temp->id == id) { + if(!prev) { + env->inplace_cb_lists[type] = temp->next; + free(temp); + temp = env->inplace_cb_lists[type]; + } + else { + prev->next = temp->next; + free(temp); + temp = prev->next; + } + } + else { + prev = temp; + temp = temp->next; + } } - /* update head pointer */ - env->inplace_cb_lists[inplace_cb_query] = NULL; -} - -void -inplace_cb_lists_delete(struct module_env* env) -{ - inplace_cb_reply_delete(env); - inplace_cb_reply_cache_delete(env); - inplace_cb_reply_servfail_delete(env); - inplace_cb_query_delete(env); } struct edns_known_option* @@ -292,9 +203,11 @@ edns_bypass_cache_stage(struct edns_option* list, struct module_env* env) } int -edns_unique_mesh_state(struct edns_option* list, struct module_env* env) +unique_mesh_state(struct edns_option* list, struct module_env* env) { size_t i; + if(env->unique_mesh) + return 1; for(; list; list=list->next) for(i=0; i<env->edns_known_options_num; i++) if(env->edns_known_options[i].opt_code == list->opt_code && |