Switch to array_t and feed the filters from config.
[apps/pfixtools.git] / postlicyd / filter.h
index f532d1a..a08ec45 100644 (file)
 #include "common.h"
 #include "filter_tokens.h"
 #include "query.h"
+#include "array.h"
 
 typedef filter_token filter_type_t;
 
 typedef struct filter_hook_t {
-    const char *name;
-    const char *value;
+    char *name;
+    char *value;
 } filter_hook_t;
+ARRAY(filter_hook_t)
 
 typedef struct filter_params_t {
-    const char *name;
-    const char *value;
+    char *name;
+    char *value;
 } filter_params_t;
+ARRAY(filter_params_t)
 
 typedef struct filter_t {
     char *name;
     filter_type_t type;
 
-    filter_hook_t *hooks;
-    filter_params_t *params;
+    A(filter_hook_t)   hooks;
+    A(filter_params_t) params;
     void *data;
 } filter_t;
+ARRAY(filter_t)
+
+#define FILTER_INIT { NULL, FTK_UNKNOWN, ARRAY_INIT, ARRAY_INIT, NULL }
 
 typedef const char *filter_result_t;
 typedef filter_result_t (*filter_runner_t)(const filter_t *filter,
@@ -71,8 +77,15 @@ __attribute__((nonnull(1,4)))
 void filter_register(const char *type, filter_constructor_t constructor,
                      filter_destructor_t destructor, filter_runner_t runner);
 
+__attribute__((nonnull(1)))
+static inline void filter_init(filter_t *filter)
+{
+    const filter_t f = FILTER_INIT;
+    *filter = f;
+}
+
 __attribute__((nonnull(1,2)))
-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);
 
 __attribute__((nonnull(1,2)))
 bool filter_set_type(filter_t *filter, const char *type, ssize_t len);
@@ -88,6 +101,20 @@ bool filter_add_hook(filter_t *filter, const char *name, ssize_t name_len,
 __attribute__((nonnull(1)))
 bool filter_build(filter_t *filter);
 
+__attribute__((nonnull(1)))
+static inline void filter_hook_wipe(filter_hook_t *hook)
+{
+    p_delete(&hook->name);
+    p_delete(&hook->value);
+}
+
+__attribute__((nonnull(1)))
+static inline void filter_params_wipe(filter_params_t *param)
+{
+    p_delete(&param->name);
+    p_delete(&param->value);
+}
+
 __attribute__((nonnull(1)))
 void filter_wipe(filter_t *filter);