OSDN Git Service

Remove optreset from src/port/ implementations of getopt and getopt_long.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Dec 2010 21:22:05 +0000 (16:22 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Dec 2010 21:23:05 +0000 (16:23 -0500)
We don't actually need optreset, because we can easily fix the code to
ensure that it's cleanly restartable after having completed a scan over the
argv array; which is the only case we need to restart in.  Getting rid of
it avoids a class of interactions with the system libraries and allows
reversion of my change of yesterday in postmaster.c and postgres.c.

Back-patch to 8.4.  Before that the getopt code was a bit different anyway.

src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c
src/include/getopt_long.h
src/port/getopt.c
src/port/getopt_long.c

index 50d0644..2b12b17 100644 (file)
@@ -313,8 +313,7 @@ extern char *optarg;
 extern int     optind,
                        opterr;
 
-/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */
-#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
+#ifdef HAVE_INT_OPTRESET
 extern int     optreset;                       /* might not be declared by system headers */
 #endif
 
@@ -752,7 +751,7 @@ PostmasterMain(int argc, char *argv[])
         * getopt(3) library so that it will work correctly in subprocesses.
         */
        optind = 1;
-#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
+#ifdef HAVE_INT_OPTRESET
        optreset = 1;                           /* some systems need this too */
 #endif
 
index 7657458..ff2e9bd 100644 (file)
@@ -78,8 +78,7 @@
 extern char *optarg;
 extern int     optind;
 
-/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */
-#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
+#ifdef HAVE_INT_OPTRESET
 extern int     optreset;                       /* might not be declared by system headers */
 #endif
 
@@ -3443,7 +3442,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
         * or when this function is called a second time with another array.
         */
        optind = 1;
-#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
+#ifdef HAVE_INT_OPTRESET
        optreset = 1;                           /* some systems need this too */
 #endif
 
index 3b05fad..0589ae6 100644 (file)
@@ -18,7 +18,6 @@ extern int    opterr;
 extern int     optind;
 extern int     optopt;
 extern char *optarg;
-extern int     optreset;
 
 #ifndef HAVE_STRUCT_OPTION
 
index 90c882c..aacfbc3 100644 (file)
@@ -41,7 +41,7 @@ static char sccsid[] = "@(#)getopt.c  8.3 (Berkeley) 4/27/95";
  * On some versions of Solaris, opterr and friends are defined in core libc
  * rather than in a separate getopt module.  Define these variables only
  * if configure found they aren't there by default.  (We assume that testing
- * opterr is sufficient for all of these except optreset.)
+ * opterr is sufficient for all of these.)
  */
 #ifndef HAVE_INT_OPTERR
 
@@ -57,12 +57,6 @@ extern int   optopt;
 extern char *optarg;
 #endif
 
-#ifndef HAVE_INT_OPTRESET
-int                    optreset;                       /* reset getopt */
-#else
-extern int     optreset;
-#endif
-
 #define BADCH  (int)'?'
 #define BADARG (int)':'
 #define EMSG   ""
@@ -70,6 +64,12 @@ extern int   optreset;
 /*
  * getopt
  *     Parse argc/argv argument vector.
+ *
+ * This implementation does not use optreset.  Instead, we guarantee that
+ * it can be restarted on a new argv array after a previous call returned -1,
+ * if the caller resets optind to 1 before the first call of the new series.
+ * (Internally, this means we must be sure to reset "place" to EMSG before
+ * returning -1.)
  */
 int
 getopt(nargc, nargv, ostr)
@@ -80,9 +80,8 @@ const char *ostr;
        static char *place = EMSG;      /* option letter processing */
        char       *oli;                        /* option letter list index */
 
-       if (optreset || !*place)
+       if (!*place)
        {                                                       /* update scanning pointer */
-               optreset = 0;
                if (optind >= nargc || *(place = nargv[optind]) != '-')
                {
                        place = EMSG;
@@ -102,7 +101,10 @@ const char *ostr;
                 * if the user didn't specify '-' as an option, assume it means -1.
                 */
                if (optopt == (int) '-')
+               {
+                       place = EMSG;
                        return -1;
+               }
                if (!*place)
                        ++optind;
                if (opterr && *ostr != ':')
index 418cce7..d624216 100644 (file)
 
 #include "getopt_long.h"
 
-#ifndef HAVE_INT_OPTRESET
-int                    optreset;
-
-/* else the "extern" was provided by getopt_long.h */
-#endif
-
 #define BADCH  '?'
 #define BADARG ':'
 #define EMSG   ""
 
 
+/*
+ * getopt_long
+ *     Parse argc/argv argument vector, with long options.
+ *
+ * This implementation does not use optreset.  Instead, we guarantee that
+ * it can be restarted on a new argv array after a previous call returned -1,
+ * if the caller resets optind to 1 before the first call of the new series.
+ * (Internally, this means we must be sure to reset "place" to EMSG before
+ * returning -1.)
+ */
 int
 getopt_long(int argc, char *const argv[],
                        const char *optstring,
@@ -57,10 +61,8 @@ getopt_long(int argc, char *const argv[],
        static char *place = EMSG;      /* option letter processing */
        char       *oli;                        /* option letter list index */
 
-       if (optreset || !*place)
+       if (!*place)
        {                                                       /* update scanning pointer */
-               optreset = 0;
-
                if (optind >= argc)
                {
                        place = EMSG;