X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Ffilter.c;h=e108b25c08ba46a4f949c0a2e7a0510da4d5a99c;hb=966ef448f783d04f8083978e4f6a27fd91c4bd94;hp=7861af4f05c5db6b42ec07657727c80424d67818;hpb=6deab7a7086ccb592daa0c41e12759ec0b9c7aa0;p=apps%2Fpfixtools.git diff --git a/postlicyd/filter.c b/postlicyd/filter.c index 7861af4..e108b25 100644 --- a/postlicyd/filter.c +++ b/postlicyd/filter.c @@ -50,6 +50,8 @@ static filter_async_handler_t async_handler = NULL; static const filter_hook_t default_hook = { .type = 0, .value = (char*)"DUNNO", + .counter = -1, + .cost = 0, .postfix = true, .async = false, .filter_id = 0 @@ -58,11 +60,15 @@ static const filter_hook_t default_hook = { static const filter_hook_t async_hook = { .type = 0, .value = NULL, + .counter = -1, + .cost = 0, .postfix = false, .async = true, .filter_id = 0 }; +uint32_t filter_running = 0; + filter_type_t filter_register(const char *type, filter_constructor_t constructor, filter_destructor_t destructor, filter_runner_t runner, filter_context_constructor_t context_constructor, @@ -220,11 +226,13 @@ const filter_hook_t *filter_run(const filter_t *filter, const query_t *query, filter_context_t *context) { debug("running filter %s (%s)", filter->name, ftokens[filter->type]); + ++filter_running; filter_result_t res = runners[filter->type](filter, query, context); if (res == HTK_ASYNC) { context->current_filter = filter; } else { + --filter_running; context->current_filter = NULL; } @@ -273,6 +281,7 @@ bool filter_add_hook(filter_t *filter, const char *name, int name_len, const char *value, int value_len) { filter_hook_t hook; + hook.filter_id = -1; hook.type = hook_tokenize(name, name_len); if (hook.type == HTK_UNKNOWN) { err("unknown hook type %.*s", name_len, name); @@ -284,9 +293,42 @@ bool filter_add_hook(filter_t *filter, const char *name, int name_len, return false; } hook.async = false; + + /* Value format is (counter:id:incr)?(postfix:reply|filter_name) + */ + hook.value = NULL; + if (strncmp(value, "counter:", 8) == 0) { + char *end = NULL; + value += 8; + hook.counter = strtol(value, &end, 10); + if (end == value || *end != ':') { + err("hook %s, cannot read counter id", htokens[hook.type]); + return false; + } else if (hook.counter < 0 || hook.counter >= MAX_COUNTERS) { + err("hook %s, invalid counter id %d", htokens[hook.type], hook.counter); + return false; + } + value = end + 1; + hook.cost = strtol(value, &end, 10); + if (end == value || *end != ':') { + err("hook %s, cannot read counter increment", htokens[hook.type]); + return false; + } else if (hook.cost < 0) { + err("hook %s, invalid counter increment value %d", htokens[hook.type], + hook.cost); + return false; + } + value = end + 1; + } else { + hook.counter = -1; + hook.cost = 0; + } hook.postfix = (strncmp(value, "postfix:", 8) == 0); + if (hook.postfix && query_format(NULL, 0, value + 8, NULL) == -1) { + err("invalid formatted text \"%s\"", value + 8); + return false; + } hook.value = m_strdup(hook.postfix ? value + 8 : value); - hook.filter_id = -1; array_add(filter->hooks, hook); return true; } @@ -311,6 +353,12 @@ void filter_context_wipe(filter_context_t *context) } } +void filter_context_clean(filter_context_t *context) +{ + p_clear(&context->counters, 1); + context->instance[0] = '\0'; +} + void filter_post_async_result(filter_context_t *context, filter_result_t result) { const filter_t *filter = context->current_filter; @@ -319,6 +367,7 @@ void filter_post_async_result(filter_context_t *context, filter_result_t result) if (result == HTK_ASYNC) { return; } + --filter_running; hook = filter_hook_for_result(filter, result); async_handler(context, hook); }