summaryrefslogtreecommitdiff
path: root/mysys/my_getopt.c
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2004-04-28 15:33:03 +0200
committerunknown <serg@serg.mylan>2004-04-28 15:33:03 +0200
commitad3d7a210df918b1f01e55f08fb15e7f95eb11c6 (patch)
tree942f55204daac6608e816f9c98cdaa9efcb7508e /mysys/my_getopt.c
parentfdee1cbbb43a668f50bc6496dae125786e78536b (diff)
downloadmariadb-git-ad3d7a210df918b1f01e55f08fb15e7f95eb11c6.tar.gz
bug#3529 - my_getopt doesn't process short OPT_ARG options correctly
cleanup
Diffstat (limited to 'mysys/my_getopt.c')
-rw-r--r--mysys/my_getopt.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c
index 8e1276990c0..d304b5076f9 100644
--- a/mysys/my_getopt.c
+++ b/mysys/my_getopt.c
@@ -32,7 +32,7 @@ static longlong getopt_ll(char *arg, const struct my_option *optp, int *err);
static ulonglong getopt_ull(char *arg, const struct my_option *optp,
int *err);
static void init_variables(const struct my_option *options);
-static int setval(const struct my_option *opts, char *argument,
+static int setval(const struct my_option *opts,char *argument,
my_bool set_maximum_value);
/*
@@ -315,8 +315,8 @@ int handle_options(int *argc, char ***argv,
{
if (!optend) /* No argument -> enable option */
*((my_bool*) optp->value)= (my_bool) 1;
- else /* If argument differs from 0, enable option, else disable */
- *((my_bool*) optp->value)= (my_bool) atoi(optend) != 0;
+ else
+ argument= optend;
}
}
else if (optp->arg_type == REQUIRED_ARG && !optend)
@@ -362,18 +362,24 @@ int handle_options(int *argc, char ***argv,
/* This is in effect a jump out of the outer loop */
optend= (char*) " ";
}
- else if (optp->arg_type == REQUIRED_ARG)
+ else
{
/* Check if there are more arguments after this one */
- if (!*++pos)
+ if (!pos[1])
{
- if (my_getopt_print_errors)
- fprintf(stderr,
- "%s: option '-%c' requires an argument\n",
- progname, optp->id);
- return EXIT_ARGUMENT_REQUIRED;
+ if (optp->var_type == GET_BOOL && optp->arg_type == OPT_ARG)
+ {
+ *((my_bool*) optp->value)= (my_bool) 1;
+ get_one_option(optp->id, optp, argument);
+ continue;
+ }
+ if (my_getopt_print_errors)
+ fprintf(stderr,
+ "%s: option '-%c' requires an argument\n",
+ progname, optp->id);
+ return EXIT_ARGUMENT_REQUIRED;
}
- argument= *pos;
+ argument= *++pos;
(*argc)--;
/* the other loop will break, because *optend + 1 == 0 */
}
@@ -445,6 +451,9 @@ static int setval(const struct my_option *opts, char *argument,
return EXIT_NO_PTR_TO_VARIABLE;
switch (opts->var_type) {
+ case GET_BOOL: /* If argument differs from 0, enable option, else disable */
+ *((my_bool*) result_pos)= (my_bool) atoi(argument) != 0;
+ break;
case GET_INT:
case GET_UINT: /* fall through */
*((int*) result_pos)= (int) getopt_ll(argument, opts, &err);