Fix -W with optional parameters in getopt.
authorEric Blake <ebb9@byu.net>
Thu, 8 Apr 2010 00:16:27 +0000 (17:16 -0700)
committerUlrich Drepper <drepper@redhat.com>
Thu, 8 Apr 2010 00:16:27 +0000 (17:16 -0700)
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.

ChangeLog
posix/getopt.c

index d59224b..e1de2df 100644 (file)
--- 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
index 88acff0..01c1071 100644 (file)
@@ -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;