]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: pattern: Each pattern expression element store the reference struct.
authorThierry FOURNIER <tfournier@exceliance.fr>
Tue, 28 Jan 2014 14:54:36 +0000 (15:54 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 17 Mar 2014 17:06:07 +0000 (18:06 +0100)
Now, each pattern entry known the original "struct pat_ref_elt" from
that was built. This patch permit to delete each pattern entry without
confusion. After this patch, each reference can use his pointer to be
targeted.

include/types/pattern.h
src/pattern.c

index ac76e37d40be434c040253f105ae21ab55fcec93..7fa860feb279f6e5f7cdf29af0b8b6bcc08874db 100644 (file)
@@ -125,6 +125,7 @@ struct pat_time {
  */
 struct pattern_tree {
        struct sample_storage *smp;
+       struct pat_ref_elt *ref;
        struct ebmb_node node;
 };
 
@@ -164,7 +165,7 @@ struct pattern {
        int flags;                      /* expr or pattern flags. */
        struct sample_storage *smp;     /* used to store a pointer to sample value associated
                                           with the match. It is used with maps */
-
+       struct pat_ref_elt *ref;
 };
 
 /* This struct is just used for chaining patterns */
index da50f73081bb21da9fc44517de6064086e353c55..eac123dac7f4d0183abf7e1f52757db333749215 100644 (file)
@@ -478,6 +478,7 @@ struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int
                        if (fill) {
                                elt = ebmb_entry(node, struct pattern_tree, node);
                                static_pattern.smp = elt->smp;
+                               static_pattern.ref = elt->ref;
                                static_pattern.flags = PAT_F_TREE;
                                static_pattern.type = SMP_T_STR;
                                static_pattern.ptr.str = (char *)elt->node.key;
@@ -764,6 +765,7 @@ struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int
                        if (fill) {
                                elt = ebmb_entry(node, struct pattern_tree, node);
                                static_pattern.smp = elt->smp;
+                               static_pattern.ref = elt->ref;
                                static_pattern.flags = PAT_F_TREE;
                                static_pattern.type = SMP_T_IPV4;
                                memcpy(&static_pattern.val.ipv4.addr.s_addr, elt->node.key, 4);
@@ -785,6 +787,7 @@ struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int
                        if (fill) {
                                elt = ebmb_entry(node, struct pattern_tree, node);
                                static_pattern.smp = elt->smp;
+                               static_pattern.ref = elt->ref;
                                static_pattern.flags = PAT_F_TREE;
                                static_pattern.type = SMP_T_IPV6;
                                memcpy(&static_pattern.val.ipv6.addr, elt->node.key, 16);
@@ -804,6 +807,7 @@ struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int
                        if (fill) {
                                elt = ebmb_entry(node, struct pattern_tree, node);
                                static_pattern.smp = elt->smp;
+                               static_pattern.ref = elt->ref;
                                static_pattern.flags = PAT_F_TREE;
                                static_pattern.type = SMP_T_IPV6;
                                memcpy(&static_pattern.val.ipv6.addr, elt->node.key, 16);
@@ -837,6 +841,7 @@ struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int
                                if (fill) {
                                        elt = ebmb_entry(node, struct pattern_tree, node);
                                        static_pattern.smp = elt->smp;
+                                       static_pattern.ref = elt->ref;
                                        static_pattern.flags = PAT_F_TREE;
                                        static_pattern.type = SMP_T_IPV4;
                                        memcpy(&static_pattern.val.ipv4.addr.s_addr, elt->node.key, 4);
@@ -1087,6 +1092,7 @@ int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err)
 
                        /* copy the pointer to sample associated to this node */
                        node->smp = pat->smp;
+                       node->ref = pat->ref;
 
                        /* FIXME: insert <addr>/<mask> into the tree here */
                        memcpy(node->node.key, &pat->val.ipv4.addr, 4); /* network byte order */
@@ -1112,6 +1118,7 @@ int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err)
 
                /* copy the pointer to sample associated to this node */
                node->smp = pat->smp;
+               node->ref = pat->ref;
 
                /* FIXME: insert <addr>/<mask> into the tree here */
                memcpy(node->node.key, &pat->val.ipv6.addr, 16); /* network byte order */
@@ -1154,6 +1161,7 @@ int pat_idx_tree_str(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* copy the pointer to sample associated to this node */
        node->smp = pat->smp;
+       node->ref = pat->ref;
 
        /* copy the string */
        memcpy(node->node.key, pat->ptr.str, len);
@@ -1819,6 +1827,7 @@ int pat_ref_push(struct pat_ref_elt *elt, struct pattern_expr *expr,
        memset(&pattern, 0, sizeof(pattern));
        pattern.flags = patflags;
        pattern.smp = smp;
+       pattern.ref = elt;
 
        /* parse pattern */
        if (!expr->pat_head->parse(elt->pattern, &pattern, err)) {
@@ -2125,6 +2134,7 @@ struct pattern *pattern_exec_match(struct pattern_head *head, struct sample *smp
        if (!head->match) {
                if (fill) {
                        static_pattern.smp = NULL;
+                       static_pattern.ref = NULL;
                        static_pattern.flags = 0;
                        static_pattern.type = SMP_T_UINT;
                        static_pattern.val.i = 1;