Commit 8837e8f5 authored by serg@serg.mylan's avatar serg@serg.mylan

bug#3529 - my_getopt doesn't process short OPT_ARG options correctly

cleanup
parent 2bcfab10
...@@ -32,7 +32,7 @@ static longlong getopt_ll(char *arg, const struct my_option *optp, int *err); ...@@ -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, static ulonglong getopt_ull(char *arg, const struct my_option *optp,
int *err); int *err);
static void init_variables(const struct my_option *options); 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); my_bool set_maximum_value);
/* /*
...@@ -315,8 +315,8 @@ int handle_options(int *argc, char ***argv, ...@@ -315,8 +315,8 @@ int handle_options(int *argc, char ***argv,
{ {
if (!optend) /* No argument -> enable option */ if (!optend) /* No argument -> enable option */
*((my_bool*) optp->value)= (my_bool) 1; *((my_bool*) optp->value)= (my_bool) 1;
else /* If argument differs from 0, enable option, else disable */ else
*((my_bool*) optp->value)= (my_bool) atoi(optend) != 0; argument= optend;
} }
} }
else if (optp->arg_type == REQUIRED_ARG && !optend) else if (optp->arg_type == REQUIRED_ARG && !optend)
...@@ -362,18 +362,24 @@ int handle_options(int *argc, char ***argv, ...@@ -362,18 +362,24 @@ int handle_options(int *argc, char ***argv,
/* This is in effect a jump out of the outer loop */ /* This is in effect a jump out of the outer loop */
optend= (char*) " "; optend= (char*) " ";
} }
else if (optp->arg_type == REQUIRED_ARG) else
{ {
/* Check if there are more arguments after this one */ /* Check if there are more arguments after this one */
if (!*++pos) if (!pos[1])
{
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) if (my_getopt_print_errors)
fprintf(stderr, fprintf(stderr,
"%s: option '-%c' requires an argument\n", "%s: option '-%c' requires an argument\n",
progname, optp->id); progname, optp->id);
return EXIT_ARGUMENT_REQUIRED; return EXIT_ARGUMENT_REQUIRED;
} }
argument= *pos; argument= *++pos;
(*argc)--; (*argc)--;
/* the other loop will break, because *optend + 1 == 0 */ /* the other loop will break, because *optend + 1 == 0 */
} }
...@@ -445,6 +451,9 @@ static int setval(const struct my_option *opts, char *argument, ...@@ -445,6 +451,9 @@ static int setval(const struct my_option *opts, char *argument,
return EXIT_NO_PTR_TO_VARIABLE; return EXIT_NO_PTR_TO_VARIABLE;
switch (opts->var_type) { 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_INT:
case GET_UINT: /* fall through */ case GET_UINT: /* fall through */
*((int*) result_pos)= (int) getopt_ll(argument, opts, &err); *((int*) result_pos)= (int) getopt_ll(argument, opts, &err);
......
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