From af11fa7bd4a304cf7fd20fcbd9b1c84eeaa62dae Mon Sep 17 00:00:00 2001 From: Alexey Kopytov Date: Thu, 12 Apr 2018 22:11:16 +0300 Subject: [PATCH] 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'. --- src/sb_options.c | 12 ++++++++++-- tests/t/cmdline.t | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/sb_options.c b/src/sb_options.c index fe9aef9..16d0a4f 100644 --- a/src/sb_options.c +++ b/src/sb_options.c @@ -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: diff --git a/tests/t/cmdline.t b/tests/t/cmdline.t index d887dd2..8e80e77 100644 --- a/tests/t/cmdline.t +++ b/tests/t/cmdline.t @@ -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 < 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]