From 1a6857b9c198ff3f22ae0b3d1d09f419110939d8 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 29 Oct 2020 09:21:43 +0100 Subject: [PATCH] MINOR: pattern: implement pat_ref_load() to load a pattern at a given generation pat_ref_load() basically combines pat_ref_append() and pat_ref_commit(). It's very similar to pat_ref_add() except that it also allows to set the generation ID and the line number. pat_ref_add() was modified to directly rely on it to avoid code duplication. Note that a previous declaration of pat_ref_load() was removed as it was just a leftover of an earlier incarnation of something possibly similar, so no existing functionality was changed here. --- include/haproxy/pattern.h | 2 +- src/pattern.c | 35 +++++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/include/haproxy/pattern.h b/include/haproxy/pattern.h index 40db3559a..ac06eeeaa 100644 --- a/include/haproxy/pattern.h +++ b/include/haproxy/pattern.h @@ -182,6 +182,7 @@ struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags); struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key); struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line); +struct pat_ref_elt *pat_ref_load(struct pat_ref *ref, unsigned int gen, const char *pattern, const char *sample, int line, char **err); int pat_ref_push(struct pat_ref_elt *elt, struct pattern_expr *expr, int patflags, char **err); int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err); int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err); @@ -190,7 +191,6 @@ int pat_ref_delete(struct pat_ref *ref, const char *key); void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt); int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt); int 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); int pat_ref_commit(struct pat_ref *ref, struct pat_ref_elt *elt, char **err); void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace); diff --git a/src/pattern.c b/src/pattern.c index fe5176922..5613512ce 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -1945,6 +1945,32 @@ int pat_ref_commit(struct pat_ref *ref, struct pat_ref_elt *elt, char **err) return 1; } +/* Loads : into for generation . may be + * NULL if none exists (e.g. ACL). If not needed, the generation number should + * be set to ref->curr_gen. The error pointer must initially point to NULL. The + * new entry will be propagated to all use places, involving allocation, parsing + * and indexing. On error (parsing, allocation), the operation will be rolled + * back, an error may be reported, and NULL will be reported. On success, the + * freshly allocated element will be returned. The PATREF lock on must be + * held during the operation. + */ +struct pat_ref_elt *pat_ref_load(struct pat_ref *ref, unsigned int gen, + const char *pattern, const char *sample, + int line, char **err) +{ + struct pat_ref_elt *elt; + + elt = pat_ref_append(ref, pattern, sample, line); + if (elt) { + elt->gen_id = gen; + if (!pat_ref_commit(ref, elt, err)) + elt = NULL; + } else + memprintf(err, "out of memory error"); + + return elt; +} + /* This function adds entry to . It can fail on memory error. The new * entry is added at all the pattern_expr registered in this reference. The * function stops on the first error encountered. It returns 0 and is @@ -1955,14 +1981,7 @@ int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err) { - struct pat_ref_elt *elt; - - elt = pat_ref_append(ref, pattern, sample, -1); - if (!elt) { - memprintf(err, "out of memory error"); - return 0; - } - return pat_ref_commit(ref, elt, err); + return !!pat_ref_load(ref, ref->curr_gen, pattern, sample, -1, err); } /* This function prunes , replaces all references by the references