From: Willy Tarreau Date: Wed, 8 Sep 2021 09:38:25 +0000 (+0200) Subject: MINOR: vars: add a VF_CREATEONLY flag for creation X-Git-Tag: v2.5-dev7~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4994b57728af4cbd446dedb7aa71c44d43503b69;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/vars-t.h b/include/haproxy/vars-t.h index 0e35ade198..06f2712e12 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 df26ac160a..80a6a4520c 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) {