]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: pattern: Add function to prune and reload pattern list.
authorThierry FOURNIER <tfournier@exceliance.fr>
Fri, 21 Mar 2014 20:45:15 +0000 (21:45 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 28 Mar 2014 12:23:07 +0000 (13:23 +0100)
This function it is used for dynamically update all the patterns
attached to one file. This function is atomic. All parsing or indexation
failures are reported in the haproxy logs.

include/proto/pattern.h
src/pattern.c

index 57294d8abedbb092e0a1c8019f80d559118f650d..2e1c9180175ae5d30a65c49764f4199e38d4d53b 100644 (file)
@@ -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.
index 16fb7047c64cddcaa2c61474d728824789e8a3af..3238fbb43fb86ed4bd21218025869c3fdee3c2f5 100644 (file)
@@ -19,6 +19,7 @@
 #include <types/global.h>
 #include <types/pattern.h>
 
+#include <proto/log.h>
 #include <proto/pattern.h>
 #include <proto/sample.h>
 
@@ -1723,6 +1724,34 @@ int pat_ref_add(struct pat_ref *ref,
        return 1;
 }
 
+/* This function prune <ref>, replace all reference by the references
+ * of <replace>, 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 <ref>. This function
  * prune the associated pattern_expr.
  */