getopt: handle W; without long options in getopt
authorEric Blake <eblake@redhat.com>
Thu, 7 Jul 2011 14:54:11 +0000 (08:54 -0600)
committerEric Blake <eblake@redhat.com>
Thu, 7 Jul 2011 14:54:11 +0000 (08:54 -0600)
This reverts commit cbf381169705782b144b2733798a62c11aa473a5, in
favor of the upstream glibc fix (commit 01636b214) plus a C89 fix.

[BZ #12922]
* lib/getopt.c (_getopt_internal_r): When "W;" is in short options
but no long options are defined, just return 'W'.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
lib/getopt.c

index 4d2b71d54f4b778ccb097a7581cd16d67c839a37..a5d52ee138022a99ecf91ca8153bdce5f93b7765 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-07-07  Ulrich Drepper  <drepper@gmail.com>
+
+       getopt: handle W; without long options in getopt [BZ #12922]
+       * lib/getopt.c (_getopt_internal_r): When "W;" is in short options
+       but no long options are defined, just return 'W'.
+
 2011-07-07  Bruno Haible  <bruno@clisp.org>
 
        Avoid literal tabs.
index 2af8352ee9c93ba7d19e0c8e34fd37306332b885..7c9f704061210f4473fee7edfe196350920dbab6 100644 (file)
@@ -829,7 +829,7 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
         return '?';
       }
     /* Convenience. Treat POSIX -W foo same as long option --foo */
-    if (temp[0] == 'W' && temp[1] == ';' && longopts)
+    if (temp[0] == 'W' && temp[1] == ';')
       {
         char *nameend;
         const struct option *p;
@@ -839,6 +839,9 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
         int indfound = 0;
         int option_index;
 
+        if (longopts == NULL)
+          goto no_longs;
+
         /* This is an option that requires an argument.  */
         if (*d->__nextchar != '\0')
           {
@@ -1046,8 +1049,10 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
               }
             return pfound->val;
           }
-          d->__nextchar = NULL;
-          return 'W';   /* Let the application handle it.   */
+
+      no_longs:
+        d->__nextchar = NULL;
+        return 'W';   /* Let the application handle it.   */
       }
     if (temp[1] == ':')
       {