diff --git a/include/proto/pattern.h b/include/proto/pattern.h index ee193929a0..8c9c1c7025 100644 --- a/include/proto/pattern.h +++ b/include/proto/pattern.h @@ -58,7 +58,7 @@ static inline int pat_find_match_name(const char *name) * associated to the matching patterned will be put there. The function returns * PAT_MATCH or PAT_NOMATCH. */ -enum pat_match_res pattern_exec_match(struct pattern_expr *expr, struct sample *smp, struct sample_storage **sample); +enum pat_match_res pattern_exec_match(struct pattern_expr *expr, struct sample *smp, struct sample_storage **sample, struct pattern **pat, struct pat_idx_elt **elt); /* * diff --git a/src/acl.c b/src/acl.c index ef6b4a3416..b033f2afd1 100644 --- a/src/acl.c +++ b/src/acl.c @@ -977,7 +977,7 @@ enum acl_test_res acl_exec_cond(struct acl_cond *cond, struct proxy *px, struct continue; } - acl_res |= pat2acl(pattern_exec_match(&expr->pat, &smp, NULL)); + acl_res |= pat2acl(pattern_exec_match(&expr->pat, &smp, NULL, NULL, NULL)); /* * OK now acl_res holds the result of this expression * as one of ACL_TEST_FAIL, ACL_TEST_MISS or ACL_TEST_PASS. diff --git a/src/map.c b/src/map.c index a13c5b7bdb..b1fa7f672d 100644 --- a/src/map.c +++ b/src/map.c @@ -467,7 +467,7 @@ static int sample_conv_map(const struct arg *arg_p, struct sample *smp) desc = arg_p[0].data.map; /* Execute the match function. */ - ret = pattern_exec_match(desc->pat, smp, &sample); + ret = pattern_exec_match(desc->pat, smp, &sample, NULL, NULL); if (ret != PAT_MATCH) { if (!desc->def) return 0; diff --git a/src/pattern.c b/src/pattern.c index 43011cd097..c9e8978724 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -1046,7 +1046,8 @@ int pattern_read_from_file(struct pattern_expr *expr, * PAT_NOMATCH or PAT_MATCH. */ enum pat_match_res pattern_exec_match(struct pattern_expr *expr, struct sample *smp, - struct sample_storage **sample) + struct sample_storage **sample, + struct pattern **pat, struct pat_idx_elt **idx_elt) { enum pat_match_res pat_res = PAT_NOMATCH; struct pattern *pattern; @@ -1079,6 +1080,8 @@ enum pat_match_res pattern_exec_match(struct pattern_expr *expr, struct sample * elt = ebmb_entry(node, struct pat_idx_elt, node); if (sample) *sample = elt->smp; + if (idx_elt) + *idx_elt = elt; } } @@ -1090,6 +1093,8 @@ enum pat_match_res pattern_exec_match(struct pattern_expr *expr, struct sample * pat_res |= expr->match(smp, pattern); if (sample) *sample = pattern->smp; + if (pat) + *pat = pattern; } }