Commit 4b360633 authored by Kristofer Pettersson's avatar Kristofer Pettersson

Bug#54569 Some options are not allowed to take argument when passed with loose- prefix

Boolean options cause parsing failures when they are given
with prefix loose- and an argument, either in the command
line or in configuration file.

The reason was a faulty logic which forced the parsing
to throw an error when an argument of type NO_ARG was
used together with an argument which has been identified
as a key-value pair. Despite the attribute NO_ARG these
options actually take arguments if they are of type
BOOL.


include/my_getopt.h:
  * More comments to help future refactoring
mysys/my_getopt.c:
  * removed if-statement which prevented logic for handling boolean types with arguments to be executed.
  * Added comments to aid in future refactoring.
parent 401e6c90
...@@ -39,6 +39,13 @@ C_MODE_START ...@@ -39,6 +39,13 @@ C_MODE_START
#define GET_ASK_ADDR 128 #define GET_ASK_ADDR 128
#define GET_TYPE_MASK 127 #define GET_TYPE_MASK 127
/**
Enumeration of the my_option::arg_type attributes.
It should be noted that for historical reasons variables with the combination
arg_type=NO_ARG, my_option::var_type=GET_BOOL still accepts
arguments. This is someone counter intuitive and care should be taken
if the code is refactored.
*/
enum get_opt_arg_type { NO_ARG, OPT_ARG, REQUIRED_ARG }; enum get_opt_arg_type { NO_ARG, OPT_ARG, REQUIRED_ARG };
struct st_typelib; struct st_typelib;
......
...@@ -360,14 +360,6 @@ int handle_options(int *argc, char ***argv, ...@@ -360,14 +360,6 @@ int handle_options(int *argc, char ***argv,
} }
return EXIT_OPTION_DISABLED; return EXIT_OPTION_DISABLED;
} }
if (must_be_var && optp->arg_type == NO_ARG)
{
if (my_getopt_print_errors)
my_getopt_error_reporter(ERROR_LEVEL,
"%s: option '%s' cannot take an argument",
my_progname, optp->name);
return EXIT_NO_ARGUMENT_ALLOWED;
}
error= 0; error= 0;
value= optp->var_type & GET_ASK_ADDR ? value= optp->var_type & GET_ASK_ADDR ?
(*getopt_get_addr)(key_name, (uint) strlen(key_name), optp, &error) : (*getopt_get_addr)(key_name, (uint) strlen(key_name), optp, &error) :
...@@ -377,6 +369,11 @@ int handle_options(int *argc, char ***argv, ...@@ -377,6 +369,11 @@ int handle_options(int *argc, char ***argv,
if (optp->arg_type == NO_ARG) if (optp->arg_type == NO_ARG)
{ {
/*
Due to historical reasons GET_BOOL var_types still accepts arguments
despite the NO_ARG arg_type attribute. This can seems a bit unintuitive
and care should be taken when refactoring this code.
*/
if (optend && (optp->var_type & GET_TYPE_MASK) != GET_BOOL) if (optend && (optp->var_type & GET_TYPE_MASK) != GET_BOOL)
{ {
if (my_getopt_print_errors) if (my_getopt_print_errors)
...@@ -391,7 +388,7 @@ int handle_options(int *argc, char ***argv, ...@@ -391,7 +388,7 @@ int handle_options(int *argc, char ***argv,
Set bool to 1 if no argument or if the user has used Set bool to 1 if no argument or if the user has used
--enable-'option-name'. --enable-'option-name'.
*optend was set to '0' if one used --disable-option *optend was set to '0' if one used --disable-option
*/ */
(*argc)--; (*argc)--;
if (!optend || *optend == '1' || if (!optend || *optend == '1' ||
!my_strcasecmp(&my_charset_latin1, optend, "true")) !my_strcasecmp(&my_charset_latin1, optend, "true"))
...@@ -418,10 +415,9 @@ int handle_options(int *argc, char ***argv, ...@@ -418,10 +415,9 @@ int handle_options(int *argc, char ***argv,
else if (optp->arg_type == REQUIRED_ARG && !optend) else if (optp->arg_type == REQUIRED_ARG && !optend)
{ {
/* Check if there are more arguments after this one, /* Check if there are more arguments after this one,
Note: options loaded from config file that requires value
Note: options loaded from config file that requires value should always be in the form '--option=value'.
should always be in the form '--option=value'. */
*/
if (!is_cmdline_arg || !*++pos) if (!is_cmdline_arg || !*++pos)
{ {
if (my_getopt_print_errors) if (my_getopt_print_errors)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment