Browse Source

Parse composites in ucl.

tags/0.6.0
Vsevolod Stakhov 10 years ago
parent
commit
a0a7d49e7e
1 changed files with 42 additions and 0 deletions
  1. 42
    0
      src/cfg_rcl.c

+ 42
- 0
src/cfg_rcl.c View File

@@ -26,6 +26,7 @@
#include "settings.h"
#include "cfg_file.h"
#include "lua/lua_common.h"
#include "expressions.h"
#include "classifiers/classifiers.h"
#include "tokenizers/tokenizers.h"

@@ -812,6 +813,41 @@ rspamd_rcl_classifier_handler (struct config_file *cfg, ucl_object_t *obj,
return res;
}

static gboolean
rspamd_rcl_composite_handler (struct config_file *cfg, ucl_object_t *obj,
gpointer ud, struct rspamd_rcl_section *section, GError **err)
{
ucl_object_t *val;
struct expression *expr;
struct rspamd_composite *composite;
const gchar *composite_name, *composite_expression;

val = ucl_object_find_key (obj, "name");
if (val == NULL || !ucl_object_tostring_safe (val, &composite_name)) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "composite must have a name defined");
return FALSE;
}

val = ucl_object_find_key (obj, "expression");
if (val == NULL || !ucl_object_tostring_safe (val, &composite_expression)) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "composite must have an expression defined");
return FALSE;
}

if ((expr = parse_expression (cfg->cfg_pool, (gchar *)composite_expression)) == NULL) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot parse composite expression: %s", composite_expression);
return FALSE;
}

composite = memory_pool_alloc (cfg->cfg_pool, sizeof (struct rspamd_composite));
composite->expr = expr;
composite->id = g_hash_table_size (cfg->composite_symbols) + 1;
g_hash_table_insert (cfg->composite_symbols, (gpointer)composite_name, composite);
register_virtual_symbol (&cfg->cache, composite_name, 1);

return TRUE;
}

/**
* Fake handler to parse default options only, uses struct cfg_file as pointer
* for default handlers
@@ -989,6 +1025,12 @@ rspamd_rcl_config_init (void)
rspamd_rcl_add_default_handler (ssub, "spam", rspamd_rcl_parse_struct_boolean,
G_STRUCT_OFFSET (struct statfile, is_spam), 0);

/**
* Composites handler
*/
sub = rspamd_rcl_add_section (&new, "composite", rspamd_rcl_composite_handler, UCL_OBJECT,
FALSE, TRUE);

return new;
}


Loading…
Cancel
Save