X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Ffilter.c;h=da78992fe8feb071d4ff5592cd30f29bb57099cc;hb=929bb1ca2452a5bc7410896fd4e5eea44901a0b7;hp=a98d29dae8f8465193cf8d3f21c9ebdb9edbdf46;hpb=9b993811fe1fd208afd954e86c0bfc81a78af04f;p=apps%2Fpfixtools.git diff --git a/postlicyd/filter.c b/postlicyd/filter.c index a98d29d..da78992 100644 --- a/postlicyd/filter.c +++ b/postlicyd/filter.c @@ -53,10 +53,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; } @@ -66,8 +94,8 @@ void filter_wipe(filter_t *filter) if (destructor) { destructor(filter); } - p_delete(&filter->hooks); - p_delete(&filter->params); + array_deep_wipe(filter->hooks, filter_hook_wipe); + array_deep_wipe(filter->params, filter_params_wipe); p_delete(&filter->name); } @@ -76,12 +104,11 @@ filter_result_t filter_run(const filter_t *filter, const query_t *query) return runners[filter->type](filter, query); } -bool filter_set_name(filter_t *filter, const char *name, ssize_t len) +void filter_set_name(filter_t *filter, const char *name, ssize_t len) { filter->name = p_new(char, len + 1); memcpy(filter->name, name, len); filter->name[len] = '\0'; - return true; } bool filter_set_type(filter_t *filter, const char *type, ssize_t len) @@ -93,11 +120,21 @@ bool filter_set_type(filter_t *filter, const char *type, ssize_t len) 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); + array_add(filter->params, param); return true; } 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.postfix = (strncmp(value, "postfix:", 8) == 0); + hook.value = strdup(hook.postfix ? value + 8 : value); + hook.filter_id = -1; + array_add(filter->hooks, hook); return true; }