From aa7f642769abcfbce658aeaaffdc9fb4790cd905 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Wed, 7 Apr 2010 17:16:27 -0700 Subject: Fix -W with optional parameters in getopt. According to the getopt documentation, if "W;" is part of optstring, then '-W foo' should behave like '--foo'. But if "foo" uses an optional_argument, this is not the case, since optarg is not NULL when using -W. --- posix/getopt.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'posix/getopt.c') diff --git a/posix/getopt.c b/posix/getopt.c index 88acff0e2f..01c1071ecb 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -911,7 +911,10 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, pfound = p; indfound = option_index; } - else + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } @@ -1028,6 +1031,8 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, return optstring[0] == ':' ? ':' : '?'; } } + else + d->optarg = NULL; d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; -- cgit v1.2.3