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.
This commit is contained in:
Willy Tarreau 2021-11-18 17:42:50 +01:00
parent 002e2068cc
commit ec347b1239
2 changed files with 20 additions and 3 deletions

View File

@ -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 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 list of several values separated by spaces, it can be expanded as individual
arguments by enclosing the variable with braces and appending the suffix '[*]' 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: Example:
bind "fd@${FD_APP1}" 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" user "$HAPROXY_USER"

View File

@ -5440,13 +5440,27 @@ uint32_t parse_line(char *in, char *out, size_t *outlen, char **args, int *nbarg
} }
if (brace) { 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 */ /* unmatched brace */
err |= PARSE_ERR_BRACE; err |= PARSE_ERR_BRACE;
if (errptr) if (errptr)
*errptr = brace; *errptr = brace;
goto leave; goto leave;
} }
/* brace found, skip it */
in++; in++;
brace = NULL; brace = NULL;
} }