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.
This commit is contained in:
Willy Tarreau 2021-09-08 11:38:25 +02:00
parent 7978c5c422
commit 4994b57728
2 changed files with 7 additions and 0 deletions

View File

@ -27,6 +27,7 @@
/* flags used when setting/clearing variables */ /* flags used when setting/clearing variables */
#define VF_UPDATEONLY 0x00000001 // SCOPE_PROC variables are only updated #define VF_UPDATEONLY 0x00000001 // SCOPE_PROC variables are only updated
#define VF_CREATEONLY 0x00000002 // do nothing if the variable already exists
enum vars_scope { enum vars_scope {
SCOPE_SESS = 0, SCOPE_SESS = 0,

View File

@ -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: * 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 * - VF_UPDATEONLY: if the scope is SCOPE_PROC, the variable may only be
* updated but not created. * updated but not created.
* - VF_CREATEONLY: do nothing if the variable already exists (success).
* *
* It returns 0 on failure, non-zero on 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); var = var_get(vars, name);
if (var) { if (var) {
if (flags & VF_CREATEONLY) {
ret = 1;
goto unlock;
}
/* free its used memory. */ /* free its used memory. */
if (var->data.type == SMP_T_STR || if (var->data.type == SMP_T_STR ||
var->data.type == SMP_T_BIN) { var->data.type == SMP_T_BIN) {