diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h index e23c21f333..71a884c49c 100644 --- a/src/include/getopt_long.h +++ b/src/include/getopt_long.h @@ -23,6 +23,7 @@ struct option #define no_argument 0 #define required_argument 1 +#define optional_argument 2 #endif #ifndef HAVE_GETOPT_LONG diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c index b099091a76..aa5b7319fd 100644 --- a/src/port/getopt_long.c +++ b/src/port/getopt_long.c @@ -100,11 +100,14 @@ getopt_long(int argc, char *const argv[], if (strlen(longopts[i].name) == namelen && strncmp(place, longopts[i].name, namelen) == 0) { - if (longopts[i].has_arg) + int has_arg = longopts[i].has_arg; + + if (has_arg != no_argument) { if (place[namelen] == '=') optarg = place + namelen + 1; - else if (optind < argc - 1) + else if (optind < argc - 1 && + has_arg == required_argument) { optind++; optarg = argv[optind]; @@ -113,13 +116,18 @@ getopt_long(int argc, char *const argv[], { if (optstring[0] == ':') return BADARG; - if (opterr) + + if (opterr && has_arg == required_argument) fprintf(stderr, "%s: option requires an argument -- %s\n", argv[0], place); + place = EMSG; optind++; - return BADCH; + + if (has_arg == required_argument) + return BADCH; + optarg = NULL; } } else