]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add tracking for rspamd expressions
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 28 Mar 2016 13:20:39 +0000 (14:20 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 28 Mar 2016 13:20:39 +0000 (14:20 +0100)
src/libutil/expression.c
src/libutil/expression.h

index 782ad2371de0081f1d9b129af6435808e4fc0367..5b31ef27da29dbd57ba81170c1cc964b4127b4cc 100644 (file)
@@ -920,7 +920,7 @@ rspamd_ast_do_op (struct rspamd_expression_elt *elt, gint val, gint acc, gint li
 
 static gint
 rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node,
-               gpointer data)
+               gpointer data, GPtrArray *track)
 {
        struct rspamd_expression_elt *elt, *celt, *parelt = NULL;
        GNode *cld;
@@ -949,6 +949,10 @@ rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node
 
                        if (elt->value) {
                                elt->p.atom->hits ++;
+
+                               if (track) {
+                                       g_ptr_array_add (track, elt->p.atom);
+                               }
                        }
 
                        if (calc_ticks) {
@@ -989,7 +993,7 @@ rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node
                                continue;
                        }
 
-                       val = rspamd_ast_process_node (expr, flags, cld, data);
+                       val = rspamd_ast_process_node (expr, flags, cld, data, track);
 
                        if (acc == G_MININT) {
                                acc = val;
@@ -1021,8 +1025,8 @@ rspamd_ast_cleanup_traverse (GNode *n, gpointer d)
 }
 
 gint
-rspamd_process_expression (struct rspamd_expression *expr, gint flags,
-               gpointer data)
+rspamd_process_expression_track (struct rspamd_expression *expr, gint flags,
+               gpointer data, GPtrArray *track)
 {
        gint ret = 0;
 
@@ -1030,7 +1034,7 @@ rspamd_process_expression (struct rspamd_expression *expr, gint flags,
        /* Ensure that stack is empty at this point */
        g_assert (expr->expression_stack->len == 0);
 
-       ret = rspamd_ast_process_node (expr, flags, expr->ast, data);
+       ret = rspamd_ast_process_node (expr, flags, expr->ast, data, track);
 
        /* Cleanup */
        g_node_traverse (expr->ast, G_IN_ORDER, G_TRAVERSE_ALL, -1,
@@ -1054,6 +1058,13 @@ rspamd_process_expression (struct rspamd_expression *expr, gint flags,
        return ret;
 }
 
+gint
+rspamd_process_expression (struct rspamd_expression *expr, gint flags,
+               gpointer data)
+{
+       return rspamd_process_expression_track (expr, flags, data, NULL);
+}
+
 static gboolean
 rspamd_ast_string_traverse (GNode *n, gpointer d)
 {
index 82c0c60c15c92907c45075174b298ac7ba650c52..2c0ec74977794b313c569ef8055f0b3108d4641a 100644 (file)
@@ -95,6 +95,17 @@ gboolean rspamd_parse_expression (const gchar *line, gsize len,
 gint rspamd_process_expression (struct rspamd_expression *expr, gint flags,
                gpointer data);
 
+/**
+ * Process the expression and return its value using atom 'process' functions with the specified data pointer.
+ * This function also accepts `track` argument where it writes matched atoms (those whose value is more than 0)
+ * @param expr expression to process
+ * @param data opaque data pointer for all the atoms
+ * @param track pointer array to atoms tracking
+ * @return the value of expression
+ */
+gint rspamd_process_expression_track (struct rspamd_expression *expr, gint flags,
+               gpointer data, GPtrArray *track);
+
 /**
  * Shows string representation of an expression
  * @param expr expression to show