diff options
author | Eric Blake <ebb9@byu.net> | 2010-04-07 17:16:27 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2010-04-07 17:16:27 -0700 |
commit | aa7f642769abcfbce658aeaaffdc9fb4790cd905 (patch) | |
tree | ea9fe568ed20f3a3aefae5ff33f0831fc5d161ea | |
parent | 22ef35456ea0b36e09f3241043f894eb71d2c9da (diff) | |
download | glibc-aa7f642769abcfbce658aeaaffdc9fb4790cd905.tar.gz glibc-aa7f642769abcfbce658aeaaffdc9fb4790cd905.tar.xz glibc-aa7f642769abcfbce658aeaaffdc9fb4790cd905.zip |
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.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | posix/getopt.c | 7 |
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index d59224b46d..e1de2dffbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-12-02 Eric Blake <ebb9@byu.net> + + [BZ #11041] + * posix/getopt.c (_getopt_internal_r): Handle '-Wfoo' identically + to '--foo', with optional argument or non-ambiguous prefix. + 2010-04-07 Ulrich Drepper <drepper@redhat.com> [BZ #11134] @@ -9,7 +15,7 @@ if NSS_FLAG_ADJUNCT_AS_SHADOW is set. (_nss_nis_getpwnam_r): Likewise. (_nss_nis_getpwuid_r): Likewise. - * nis/nss_nis/nis-spwd.c (ent_adjunct_used): Nee global variable. + * nis/nss_nis/nis-spwd.c (ent_adjunct_used): New global variable. (_nss_nis_setspent): Also reset ent_adjunct_used. (internal_nis_getspent_r): If new_start is set and shadow.byname table does not exist and NSS_FLAG_ADJUNCT_AS_SHADOW is set, try to get 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; |