diff --git a/doc/configuration.txt b/doc/configuration.txt index ff90526d8..4242e014e 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 d8ba76a8b..9daac06c2 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)