*: move getopt reset code to better place(s)
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 28 Jan 2008 22:57:10 +0000 (22:57 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 28 Jan 2008 22:57:10 +0000 (22:57 -0000)
libbb/appletlib.c
libbb/getopt32.c
libbb/vfork_daemon_rexec.c
util-linux/getopt.c

index 80adff5e712f688d203efb33e68be4aa1e06d9b5..993618e98ead1152c2b82db802a87f1aa3bcb1c5 100644 (file)
@@ -638,7 +638,6 @@ void run_applet_no_and_exit(int applet_no, char **argv)
                argc++;
 
        /* Reinit some shared global data */
-       optind = 1;
        xfunc_error_retval = EXIT_FAILURE;
 
        applet_name = APPLET_NAME(applet_no);
index 2452eb0a5153485e7df8be33e7b05771089804d2..80d5d282252c53a1e95a78ff5db29a52e70a1c85 100644 (file)
@@ -473,11 +473,30 @@ getopt32(char **argv, const char *applet_opts, ...)
                }
        }
 
-       /* In case getopt32 was already called, reinit some state */
+       /* In case getopt32 was already called:
+        * reset the libc getopt() function, which keeps internal state.
+        *
+        * BSD-derived getopt() functions require that optind be set to 1 in
+        * order to reset getopt() state.  This used to be generally accepted
+        * way of resetting getopt().  However, glibc's getopt()
+        * has additional getopt() state beyond optind, and requires that
+        * optind be set to zero to reset its state.  So the unfortunate state of
+        * affairs is that BSD-derived versions of getopt() misbehave if
+        * optind is set to 0 in order to reset getopt(), and glibc's getopt()
+        * will core dump if optind is set 1 in order to reset getopt().
+        * 
+        * More modern versions of BSD require that optreset be set to 1 in
+        * order to reset getopt().   Sigh.  Standards, anyone?
+        */
+#ifdef __GLIBC__
+       optind = 0;
+#else /* BSD style */
        optind = 1;
-       /* optarg = NULL; opterr = 0; optopt = 0; ?? */
+       /* optreset = 1; */
+#endif
+       /* optarg = NULL; opterr = 0; optopt = 0; - do we need this?? */
 
-       /* Note: just "getopt() <= 0" will not work good for
+       /* Note: just "getopt() <= 0" will not work well for
         * "fake" short options, like this one:
         * wget $'-\203' "Test: test" http://kernel.org/
         * (supposed to act as --header, but doesn't) */
@@ -487,7 +506,7 @@ getopt32(char **argv, const char *applet_opts, ...)
 #else
        while ((c = getopt(argc, argv, applet_opts)) != -1) {
 #endif
-               c &= 0xff; /* fight libc's sign extends */
+               c &= 0xff; /* fight libc's sign extension */
  loop_arg_is_opt:
                for (on_off = complementary; on_off->opt != c; on_off++) {
                        /* c==0 if long opt have non NULL flag */
index 3a386c5c9b517248fa9203602ddc1d56119410e5..98339c930ca169761f6d1302ecd6a982bd00e355 100644 (file)
@@ -137,26 +137,6 @@ int run_nofork_applet_prime(struct nofork_save_area *old, int applet_no, char **
         * die_sleep and longjmp here instead. */
        die_sleep = -1;
 
-       /* Reset the libc getopt() function, which keeps internal state.
-        *
-        * BSD-derived getopt() functions require that optind be reset to 1 in
-        * order to reset getopt() state.  This used to be generally accepted
-        * way of resetting getopt().  However, glibc's getopt()
-        * has additional getopt() state beyond optind, and requires that
-        * optind be set zero to reset its state.  So the unfortunate state of
-        * affairs is that BSD-derived versions of getopt() misbehave if
-        * optind is set to 0 in order to reset getopt(), and glibc's getopt()
-        * will core ump if optind is set 1 in order to reset getopt().
-        * 
-        * More modern versions of BSD require that optreset be set to 1 in
-        * order to reset getopt().   Sigh.  Standards, anyone?
-        */
-#ifdef __GLIBC__
-       optind = 0;
-#else /* BSD style */
-       optind = 1;
-       /* optreset = 1; */
-#endif
        /* option_mask32 = 0; - not needed */
 
        argc = 1;
index 061750e77a1a15ff8a2afc6e5ec8170737e1e287..ee6c143936ed4c07cdd0aa17d994f6fa86919a5d 100644 (file)
@@ -155,7 +155,14 @@ static int generate_output(char **argv, int argc, const char *optstr, const stru
 
        if (quiet_errors) /* No error reporting from getopt(3) */
                opterr = 0;
-       optind = 0; /* Reset getopt(3) */
+
+       /* Reset getopt(3) (see libbb/getopt32.c for long rant) */
+#ifdef __GLIBC__
+        optind = 0;
+#else /* BSD style */
+        optind = 1;
+        /* optreset = 1; */
+#endif
 
        while (1) {
                opt =