From: Vsevolod Stakhov Date: Tue, 2 Oct 2012 13:35:42 +0000 (+0400) Subject: Allow multiply statfiles with a same label. X-Git-Tag: 0.5.3~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=80d2b194b1e8ce902a2feac5389bc4de8d5732a5;p=thirdparty%2Frspamd.git Allow multiply statfiles with a same label. --- diff --git a/src/cfg_utils.c b/src/cfg_utils.c index 440fb65e62..1576cb9fbe 100644 --- a/src/cfg_utils.c +++ b/src/cfg_utils.c @@ -827,7 +827,7 @@ check_classifier_conf (struct config_file *cfg, struct classifier_config *c) memory_pool_add_destructor (cfg->cfg_pool, (pool_destruct_func) g_hash_table_destroy, c->opts); } if (c->labels == NULL) { - c->labels = g_hash_table_new (g_str_hash, g_str_equal); + c->labels = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)g_list_free); memory_pool_add_destructor (cfg->cfg_pool, (pool_destruct_func) g_hash_table_destroy, c->labels); } diff --git a/src/cfg_xml.c b/src/cfg_xml.c index bcec06c1d2..60bfbf96f6 100644 --- a/src/cfg_xml.c +++ b/src/cfg_xml.c @@ -1907,6 +1907,7 @@ rspamd_xml_end_element (GMarkupParseContext *context, const gchar *element_name, gpointer tptr; struct wrk_cbdata wcd; struct xml_subparser *subparser; + GList *labels; if (g_ascii_strcasecmp (element_name, "if") == 0) { tptr = g_queue_pop_head (ud->if_stack); @@ -1962,11 +1963,11 @@ rspamd_xml_end_element (GMarkupParseContext *context, const gchar *element_name, ud->cfg->statfiles = g_list_prepend (ud->cfg->statfiles, st); g_hash_table_insert (ud->cfg->classifiers_symbols, st->symbol, ccf); if (st->label) { - if (g_hash_table_lookup (ccf->labels, st->label)) { - msg_warn ("duplicate statfile label %s with symbol %s, ignoring", st->label, st->symbol); + if ((labels = g_hash_table_lookup (ccf->labels, st->label))) { + labels = g_list_append (labels, st); } else { - g_hash_table_insert (ccf->labels, st->label, st); + g_hash_table_insert (ccf->labels, st->label, g_list_prepend (NULL, st)); } } ud->section_pointer = ccf; diff --git a/src/lua/lua_classifier.c b/src/lua/lua_classifier.c index c6eb2cf18a..be18cda0d0 100644 --- a/src/lua/lua_classifier.c +++ b/src/lua/lua_classifier.c @@ -278,14 +278,23 @@ lua_classifier_get_statfile_by_label (lua_State *L) struct classifier_config *ccf = lua_check_classifier (L); struct statfile *st, **pst; const gchar *label; + GList *cur; + gint i; label = luaL_checkstring (L, 2); if (ccf && label) { - st = g_hash_table_lookup (ccf->labels, label); - if (st) { - pst = lua_newuserdata (L, sizeof (struct statfile *)); - lua_setclass (L, "rspamd{statfile}", -1); - *pst = st; + cur = g_hash_table_lookup (ccf->labels, label); + if (cur) { + lua_newtable (L); + i = 1; + while (cur) { + st = cur->data; + pst = lua_newuserdata (L, sizeof (struct statfile *)); + lua_setclass (L, "rspamd{statfile}", -1); + *pst = st; + lua_rawseti (L, -2, i++); + cur = g_list_next (cur); + } return 1; } }