MINOR: config: add predicates "streq()" and "strneq()" to conditional expressions

"streq(str1,str2)" will return true if the two strings match while
"strneq(str1,str2)" will return true only if they differ. This is
convenient to match an environment variable against a predefined value.
This commit is contained in:
Willy Tarreau 2021-05-06 16:10:09 +02:00
parent 42ed14b529
commit 6492e87b0e
2 changed files with 23 additions and 0 deletions

View File

@ -814,6 +814,9 @@ The list of currently supported predicates is the following:
- defined(<name>) : returns true if an environment variable <name>
exists, regardless of its contents
- streq(<str1>,<str2>) : returns true only if the two strings are equal
- strneq(<str1>,<str2>) : returns true only if the two strings differ
Example:
.if defined(HAPROXY_MWORKER)
@ -822,6 +825,14 @@ Example:
...
.endif
.if strneq("$SSL_ONLY",yes)
bind :80
.endif
.if streq("$WITH_SSL",yes)
bind :443 ssl crt ...
.endif
Three other directives are provided to report some status:
- .notice "message" : emit this message at level NOTICE

View File

@ -137,6 +137,8 @@ enum nested_cond_state {
enum cond_predicate {
CFG_PRED_NONE, // none
CFG_PRED_DEFINED, // "defined"
CFG_PRED_STREQ, // "streq"
CFG_PRED_STRNEQ, // "strneq"
};
struct cond_pred_kw {
@ -148,6 +150,8 @@ struct cond_pred_kw {
/* supported condition predicates */
const struct cond_pred_kw cond_predicates[] = {
{ "defined", CFG_PRED_DEFINED, ARG1(1, STR) },
{ "streq", CFG_PRED_STREQ, ARG2(2, STR, STR) },
{ "strneq", CFG_PRED_STRNEQ, ARG2(2, STR, STR) },
{ NULL, CFG_PRED_NONE, 0 }
};
@ -1718,6 +1722,14 @@ static int cfg_eval_condition(char **args, char **err, const char **errptr)
ret = getenv(argp[0].data.str.area) != NULL;
goto done;
case CFG_PRED_STREQ: // checks if the two arg are equal
ret = strcmp(argp[0].data.str.area, argp[1].data.str.area) == 0;
goto done;
case CFG_PRED_STRNEQ: // checks if the two arg are different
ret = strcmp(argp[0].data.str.area, argp[1].data.str.area) != 0;
goto done;
default:
memprintf(err, "internal error: unhandled conditional expression predicate '%s'", cond_pred->word);
if (errptr)