From 4994b57728af4cbd446dedb7aa71c44d43503b69 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 8 Sep 2021 11:38:25 +0200 Subject: [PATCH] MINOR: vars: add a VF_CREATEONLY flag for creation Passing this flag to var_set() will result in the variable to only be created if it did not exist, otherwise nothing is done (it's not even updated). This will be used for pre-registering names. --- include/haproxy/vars-t.h | 1 + src/vars.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/include/haproxy/vars-t.h b/include/haproxy/vars-t.h index 0e35ade19..06f2712e1 100644 --- a/include/haproxy/vars-t.h +++ b/include/haproxy/vars-t.h @@ -27,6 +27,7 @@ /* flags used when setting/clearing variables */ #define VF_UPDATEONLY 0x00000001 // SCOPE_PROC variables are only updated +#define VF_CREATEONLY 0x00000002 // do nothing if the variable already exists enum vars_scope { SCOPE_SESS = 0, diff --git a/src/vars.c b/src/vars.c index df26ac160..80a6a4520 100644 --- a/src/vars.c +++ b/src/vars.c @@ -356,6 +356,7 @@ static int smp_fetch_var(const struct arg *args, struct sample *smp, const char * Flags is a bitfield that may contain one of the following flags: * - VF_UPDATEONLY: if the scope is SCOPE_PROC, the variable may only be * updated but not created. + * - VF_CREATEONLY: do nothing if the variable already exists (success). * * It returns 0 on failure, non-zero on success. */ @@ -375,6 +376,11 @@ static int var_set(const char *name, enum vars_scope scope, struct sample *smp, var = var_get(vars, name); if (var) { + if (flags & VF_CREATEONLY) { + ret = 1; + goto unlock; + } + /* free its used memory. */ if (var->data.type == SMP_T_STR || var->data.type == SMP_T_BIN) {