Commit c472a17d authored by unknown's avatar unknown

Fixed two bugs in my_getopt.


mysys/my_getopt.c:
  Fixed two bugs in my_getopt:
  
  - argc was decremented twice when type was GET_BOOL and short
    option was used. This caused all GET_BOOL -type short-options
    to malfunction.
  
  - Fixed a bug in argv handling. Any program that used argv directly
    without checking argc first, tried to use (already handled) options
    as non-option arguments, after all true non-option arguments were
    handled. At least mysqldump was affected by this bug.
parent 7cb2e2d1
...@@ -68,7 +68,7 @@ int handle_options(int *argc, char ***argv, ...@@ -68,7 +68,7 @@ int handle_options(int *argc, char ***argv,
{ {
uint opt_found, argvpos= 0, length, spec_len, i; uint opt_found, argvpos= 0, length, spec_len, i;
my_bool end_of_options= 0, must_be_var, set_maximum_value, special_used, my_bool end_of_options= 0, must_be_var, set_maximum_value, special_used,
option_is_loose; option_is_loose, option_used= 0;
char *progname= *(*argv), **pos, *optend, *prev_found; char *progname= *(*argv), **pos, *optend, *prev_found;
const struct my_option *optp; const struct my_option *optp;
int error; int error;
...@@ -84,6 +84,7 @@ int handle_options(int *argc, char ***argv, ...@@ -84,6 +84,7 @@ int handle_options(int *argc, char ***argv,
if (cur_arg[0] == '-' && cur_arg[1] && !end_of_options) /* must be opt */ if (cur_arg[0] == '-' && cur_arg[1] && !end_of_options) /* must be opt */
{ {
char *argument= 0; char *argument= 0;
option_used= 1;
must_be_var= 0; must_be_var= 0;
set_maximum_value= 0; set_maximum_value= 0;
special_used= 0; special_used= 0;
...@@ -336,7 +337,6 @@ int handle_options(int *argc, char ***argv, ...@@ -336,7 +337,6 @@ int handle_options(int *argc, char ***argv,
if (optp->var_type == GET_BOOL && optp->arg_type == NO_ARG) if (optp->var_type == GET_BOOL && optp->arg_type == NO_ARG)
{ {
*((my_bool*) optp->value)= (my_bool) 1; *((my_bool*) optp->value)= (my_bool) 1;
(*argc)--;
continue; // For GET_BOOL get_one_option() shouldn't be called continue; // For GET_BOOL get_one_option() shouldn't be called
} }
else if (optp->arg_type == REQUIRED_ARG || else if (optp->arg_type == REQUIRED_ARG ||
...@@ -401,6 +401,12 @@ int handle_options(int *argc, char ***argv, ...@@ -401,6 +401,12 @@ int handle_options(int *argc, char ***argv,
else /* non-option found */ else /* non-option found */
(*argv)[argvpos++]= cur_arg; (*argv)[argvpos++]= cur_arg;
} }
/* Destroy the first, already handled option, so that programs that look
for arguments in 'argv', without checking 'argc', know when to stop.
Items in argv, before the destroyed one, are all non-option -arguments
to the program, yet to be (possibly) handled. */
if (option_used)
(*argv)[argvpos]= 0;
return 0; return 0;
} }
......
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