X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Ffilter.c;h=deb31902a69efb123eab3f20dc1fa36e2d06e619;hb=0df827a28124af3bb45cea7a3b80e5d1800bb1e2;hp=5c4f93e6e85011796fda817779b1e8f926a41e88;hpb=150de5c8a15de6797f2844293891621efefff40b;p=apps%2Fpfixtools.git diff --git a/postlicyd/filter.c b/postlicyd/filter.c index 5c4f93e..deb3190 100644 --- a/postlicyd/filter.c +++ b/postlicyd/filter.c @@ -46,6 +46,9 @@ void filter_register(const char *type, filter_constructor_t constructor, { filter_token tok = filter_tokenize(type, m_strlen(type)); assert(tok != FTK_UNKNOWN && "Unknown filter type"); + + syslog(LOG_INFO, "filter type %s registered", type); + runners[tok] = runner; constructors[tok] = constructor; destructors[tok] = destructor; @@ -53,13 +56,38 @@ void filter_register(const char *type, filter_constructor_t constructor, bool filter_build(filter_t *filter) { + bool ret = true; if (filter->type == FTK_UNKNOWN || filter->name == NULL) { return false; } + if (filter->hooks.len > 0) { +# define QSORT_TYPE filter_hook_t +# define QSORT_BASE filter->hooks.data +# define QSORT_NELT filter->hooks.len +# define QSORT_LT(a,b) strcmp(a->name, b->name) < 0 +# include "qsort.c" + } filter_constructor_t constructor = constructors[filter->type]; if (constructor) { - return constructor(filter); + ret = constructor(filter); } + array_deep_wipe(filter->params, filter_params_wipe); + return ret; +} + +bool filter_update_references(filter_t *filter, A(filter_t) *filter_list) +{ + foreach (filter_hook_t *hook, filter->hooks) { + if (!hook->postfix) { + hook->filter_id = filter_find_with_name(filter_list, hook->value); + if (hook->filter_id == -1) { + syslog(LOG_ERR, "invalid filter name %s for hook %s", + hook->value, hook->name); + return false; + } + p_delete(&hook->value); + } + }} return true; } @@ -96,8 +124,8 @@ bool filter_add_param(filter_t *filter, const char *name, ssize_t name_len, const char *value, ssize_t value_len) { filter_params_t param; - param.name = strdup(name); - param.value = strdup(value); + param.name = m_strdup(name); + param.value = m_strdup(value); array_add(filter->params, param); return true; } @@ -106,8 +134,10 @@ bool filter_add_hook(filter_t *filter, const char *name, ssize_t name_len, const char *value, ssize_t value_len) { filter_hook_t hook; - hook.name = strdup(name); - hook.value = strdup(value); + hook.name = m_strdup(name); + hook.postfix = (strncmp(value, "postfix:", 8) == 0); + hook.value = m_strdup(hook.postfix ? value + 8 : value); + hook.filter_id = -1; array_add(filter->hooks, hook); return true; }