From: Willy Tarreau Date: Thu, 6 May 2021 14:10:09 +0000 (+0200) Subject: MINOR: config: add predicates "streq()" and "strneq()" to conditional expressions X-Git-Tag: v2.4-dev19~109 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6492e87b0ec24c2320927a16d742528349da7e2d;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index ff90526d86..4242e014e9 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -814,6 +814,9 @@ The list of currently supported predicates is the following: - defined() : returns true if an environment variable exists, regardless of its contents + - streq(,) : returns true only if the two strings are equal + - strneq(,) : 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 diff --git a/src/cfgparse.c b/src/cfgparse.c index d8ba76a8b4..9daac06c2f 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -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)