* Return a new metric structure, setting default and non-conflicting attributes
*/
struct metric * rspamd_config_new_metric (struct rspamd_config *cfg,
- struct metric *c);
+ struct metric *c, const gchar *name);
/*
* Return a new statfile structure, setting default and non-conflicting attributes
*/
return FALSE;
}
- return rspamd_config_add_metric_symbol (cfg, metric->name, sym_name,
- symbol_score, description, group, one_shot, TRUE);
+ if (!rspamd_config_add_metric_symbol (cfg, metric->name, sym_name,
+ symbol_score, description, group, one_shot, TRUE)) {
+ g_set_error (err,
+ CFG_RCL_ERROR,
+ EINVAL,
+ "cannot add symbol: %s to metric %s",
+ sym_name, metric->name);
+ return FALSE;
+ }
+
+ return TRUE;
}
static gboolean
metric = g_hash_table_lookup (cfg->metrics, metric_name);
if (metric == NULL) {
- metric = rspamd_config_new_metric (cfg, metric);
- metric->name = metric_name;
+ metric = rspamd_config_new_metric (cfg, metric, metric_name);
}
else {
new = FALSE;
return FALSE;
}
- /* Insert the resulting metric */
- if (new) {
- g_hash_table_insert (cfg->metrics, (void *)metric->name, metric);
- cfg->metrics_list = g_list_prepend (cfg->metrics_list, metric);
- if (strcmp (metric->name, DEFAULT_METRIC) == 0) {
- cfg->default_metric = metric;
- }
- }
-
return TRUE;
}
if ((def_metric =
g_hash_table_lookup (cfg->metrics, DEFAULT_METRIC)) == NULL) {
- def_metric = rspamd_config_new_metric (cfg, NULL);
- def_metric->name = DEFAULT_METRIC;
+ def_metric = rspamd_config_new_metric (cfg, NULL, DEFAULT_METRIC);
def_metric->actions[METRIC_ACTION_REJECT].score = DEFAULT_SCORE;
- cfg->metrics_list = g_list_prepend (cfg->metrics_list, def_metric);
- g_hash_table_insert (cfg->metrics, DEFAULT_METRIC, def_metric);
}
- cfg->default_metric = def_metric;
-
if (cfg->tld_file == NULL) {
/* Try to guess tld file */
GString *fpath = g_string_new (NULL);
}
struct metric *
-rspamd_config_new_metric (struct rspamd_config *cfg, struct metric *c)
+rspamd_config_new_metric (struct rspamd_config *cfg, struct metric *c,
+ const gchar *name)
{
int i;
+
if (c == NULL) {
c = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (struct metric));
c->grow_factor = 1.0;
c->actions[i].score = -1.0;
}
c->subject = SPAM_SUBJECT;
+ c->name = rspamd_mempool_strdup (cfg->cfg_pool, name);
rspamd_mempool_add_destructor (cfg->cfg_pool,
(rspamd_mempool_destruct_t) g_hash_table_destroy,
c->symbols);
rspamd_mempool_add_destructor (cfg->cfg_pool,
(rspamd_mempool_destruct_t) g_hash_table_destroy,
c->descriptions);
+
+ g_hash_table_insert (cfg->metrics, (void *)c->name, c);
+ cfg->metrics_list = g_list_prepend (cfg->metrics_list, c);
+
+ if (strcmp (c->name, DEFAULT_METRIC) == 0) {
+ cfg->default_metric = c;
+ }
}
return c;
/* Get module opt structure */
if ((metric = g_hash_table_lookup (cfg->metrics, name)) == NULL) {
- metric = rspamd_config_new_metric (cfg, metric);
- metric->name = rspamd_mempool_strdup (cfg->cfg_pool, name);
+ metric = rspamd_config_new_metric (cfg, metric, name);
}
/* Now iterate throught module table */