From: Willy Tarreau Date: Thu, 18 Nov 2021 16:42:50 +0000 (+0100) Subject: MINOR: config: support default values for environment variables X-Git-Tag: v2.5-dev15~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec347b1239202dafbccf89a06a39fb5986400e19;p=thirdparty%2Fhaproxy.git MINOR: config: support default values for environment variables Sometimes it is really useful to be able to specify a default value for an optional environment variable, like the ${name-value} construct in shell. In fact we're really missing this for a number of settings in reg tests, starting with timeouts. This commit simply adds support for the common syntax above. Other common forms like '+' to replace existing variables, or ':-' and ':+' to act on empty variables, were not implemented at this stage, as they are less commonly needed. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 4f306d73be..f597a8c605 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -727,13 +727,16 @@ shell. Variable names can contain alphanumerical characters or the character underscore ("_") but should not start with a digit. If the variable contains a list of several values separated by spaces, it can be expanded as individual arguments by enclosing the variable with braces and appending the suffix '[*]' -before the closing brace. +before the closing brace. It is also possible to specify a default value to +use when the variable is not set, by appending that value after a dash '-' +next to the variable name. Note that the default value only replaces non +existing variables, not empty ones. Example: bind "fd@${FD_APP1}" - log "${LOCAL_SYSLOG}:514" local0 notice # send to local server + log "${LOCAL_SYSLOG-127.0.0.1}:514" local0 notice # send to local server user "$HAPROXY_USER" diff --git a/src/tools.c b/src/tools.c index 8fc67163a9..5d8483d4e3 100644 --- a/src/tools.c +++ b/src/tools.c @@ -5440,13 +5440,27 @@ uint32_t parse_line(char *in, char *out, size_t *outlen, char **args, int *nbarg } if (brace) { - if (*in != '}') { + if (*in == '-') { + /* default value starts just after the '-' */ + if (!value) + value = in + 1; + + while (*in && *in != '}') + in++; + if (!*in) + goto no_brace; + *in = 0; // terminate the default value + } + else if (*in != '}') { + no_brace: /* unmatched brace */ err |= PARSE_ERR_BRACE; if (errptr) *errptr = brace; goto leave; } + + /* brace found, skip it */ in++; brace = NULL; }