Commit ad3d7a21 authored by unknown's avatar unknown
Browse files

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

cleanup

parent fdee1cbb
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -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 (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);