diff --git a/include/proto/pattern.h b/include/proto/pattern.h index 57294d8ab..2e1c91801 100644 --- a/include/proto/pattern.h +++ b/include/proto/pattern.h @@ -180,6 +180,8 @@ int pat_ref_delete(struct pat_ref *ref, const char *key); int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt); void pat_ref_prune(struct pat_ref *ref); int pat_ref_load(struct pat_ref *ref, struct pattern_expr *expr, int patflags, int soe, char **err); +void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace); + /* * pattern_head manipulation. diff --git a/src/pattern.c b/src/pattern.c index 16fb7047c..3238fbb43 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -1723,6 +1724,34 @@ int pat_ref_add(struct pat_ref *ref, return 1; } +/* This function prune , replace all reference by the references + * of , and reindex all the news values. + * + * The pattern are loaded in best effort and the errors are ignored, + * but writed in the logs. + */ +void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace) +{ + struct pattern_expr *expr; + struct pat_ref_elt *elt; + char *err = NULL; + + pat_ref_prune(ref); + + LIST_ADD(&replace->head, &ref->head); + LIST_DEL(&replace->head); + + list_for_each_entry(elt, &ref->head, list) { + list_for_each_entry(expr, &ref->pat, list) { + if (!pat_ref_push(elt, expr, 0, &err)) { + send_log(NULL, LOG_NOTICE, "%s", err); + free(err); + err = NULL; + } + } + } +} + /* This function prune all entries of . This function * prune the associated pattern_expr. */