X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Fconfig.c;h=2d818f22ce7b0484c6ca1fc925c465569315a703;hb=150de5c8a15de6797f2844293891621efefff40b;hp=82f80f000ccdc037235b6a1c8f1aeb7c3c544f1f;hpb=00bae73b4873e9c1e8d5526feecdb275f7bb756f;p=apps%2Fpfixtools.git diff --git a/postlicyd/config.c b/postlicyd/config.c index 82f80f0..2d818f2 100644 --- a/postlicyd/config.c +++ b/postlicyd/config.c @@ -38,10 +38,8 @@ #include "config.h" struct config_t { - filter_t *filters; - int filters_len; - int filters_size; - + A(filter_t) filters; + A(filter_params_t) params; int entry_point; }; @@ -55,17 +53,16 @@ static inline config_t *config_new(void) void config_delete(config_t **config) { if (*config) { - for (int i = 0 ; i < (*config)->filters_len ; ++i) { - filter_wipe((*config)->filters + i); - } - p_delete(&(*config)->filters); + array_deep_wipe((*config)->filters, filter_wipe); + array_deep_wipe((*config)->params, filter_params_wipe); + p_delete(config); } } config_t *config_read(const char *file) { config_t *config; - //filter_t *filter = NULL; + filter_t filter; file_map_t map; const char *p; int line = 0; @@ -217,8 +214,8 @@ read_param_value: goto read_section; read_filter: - /* TODO: Create a filter with the given name. - */ + filter_init(&filter); + filter_set_name(&filter, key, key_len); READ_BLANK(goto badeof); while (*p != '}') { READ_TOKEN("filter parameter name", key, key_len); @@ -230,12 +227,28 @@ read_filter: READ_BLANK(goto badeof); READ_STRING("filter parameter value", value, value_len, goto badeof); READ_BLANK(goto badeof); - /* TODO: Insert parameter in the filter. - */ + if (strcmp(key, "type") == 0) { + if (!filter_set_type(&filter, value, value_len)) { + READ_ERROR("unknow filter type (%s) for filter %s", + value, filter.name); + } + } else if (key_len > 3 && strncmp(key, "on_", 3) == 0) { + if (!filter_add_hook(&filter, key + 3, key_len - 3, + value, value_len)) { + READ_ERROR("hook %s not supported by filter %s", + key + 3, filter.name); + } + } else { + if (!filter_add_param(&filter, key, key_len, value, value_len)) { + goto error; + } + } } READ_NEXT(;); - /* TODO: Check the filter. - */ + if (!filter_build(&filter)) { + READ_ERROR("invalid filter %s", filter.name); + } + array_add(config->filters, filter); goto read_section; ok: