X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Ffilter.c;h=e108b25c08ba46a4f949c0a2e7a0510da4d5a99c;hb=7fa8c1bc673add68529fa2bda8134be5089e8745;hp=1ba19b50c94d0c8528c1cff484be173f92342bb1;hpb=aecafec904f393ee0ab902272a947d8be5bec36f;p=apps%2Fpfixtools.git diff --git a/postlicyd/filter.c b/postlicyd/filter.c index 1ba19b5..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,6 +60,8 @@ 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 @@ -277,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); @@ -288,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; } @@ -315,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;