Improve parsing of boolean command line options.

Accept true/1 as synonyms for 'on', and 'false'/0 as synonyms for
'off'. Also reject other values instead of silently converting them to
'off'.
This commit is contained in:
Alexey Kopytov
2018-04-12 22:11:16 +03:00
parent 0d0d214266
commit af11fa7bd4
2 changed files with 43 additions and 2 deletions

View File

@ -144,11 +144,19 @@ option_t *set_option(const char *name, const char *value, sb_arg_type_t type)
if (type != SB_ARG_TYPE_BOOL && (value == NULL || value[0] == '\0'))
return opt;
switch (type) {
case SB_ARG_TYPE_BOOL:
if (value == NULL || !strcmp(value, "on"))
if (value == NULL || !strcmp(value, "on") ||
!strcmp(value, "true") || !strcmp(value, "1"))
{
add_value(&opt->values, "on");
}
else if (strcmp(value, "off") && strcmp(value, "false") &&
strcmp(value, "0"))
{
return NULL;
}
break;
case SB_ARG_TYPE_INT:
case SB_ARG_TYPE_SIZE:

View File

@ -488,3 +488,36 @@ Command line options tests
cmdline_module loaded
FATAL: */cmdline_module.lua:5: test error (glob)
[1]
##########################################################################
# Test boolean option validation
##########################################################################
$ cat > cmdline.lua <<EOF
> sysbench.cmdline.options = {
> bool_opt = {"Flag", false}
> }
>
> function prepare()
> print("bool_opt = " .. tostring(sysbench.opt.bool_opt))
> end
> EOF
$ SB_ARGS=--verbosity=0
$ sysbench $SB_ARGS cmdline.lua --bool-opt=on prepare
bool_opt = true
$ sysbench $SB_ARGS cmdline.lua --bool-opt=off prepare
bool_opt = false
$ sysbench $SB_ARGS cmdline.lua --bool-opt=true prepare
bool_opt = true
$ sysbench $SB_ARGS cmdline.lua --bool-opt=false prepare
bool_opt = false
$ sysbench $SB_ARGS cmdline.lua --bool-opt=1 prepare
bool_opt = true
$ sysbench $SB_ARGS cmdline.lua --bool-opt=0 prepare
bool_opt = false
$ sysbench $SB_ARGS cmdline.lua --bool-opt=5 prepare
invalid option: --bool-opt=5
[1]
$ sysbench $SB_ARGS cmdline.lua --bool-opt=foo prepare
invalid option: --bool-opt=foo
[1]