Fix up getopt() reset management so it works on recent mingw.
authorTom Lane
Thu, 16 Dec 2010 04:50:49 +0000 (23:50 -0500)
committerTom Lane
Thu, 16 Dec 2010 04:50:49 +0000 (23:50 -0500)
The mingw people don't appear to care about compatibility with non-GNU
versions of getopt, so force use of our own copy of getopt on Windows.
Also, ensure that we make use of optreset when using our own copy.

Per report from Andrew Dunstan.  Back-patch to all versions supported
on Windows.

configure
configure.in
src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c

index 70000347538b96ef9f7072adc5d8a3321282856f..f96c0ffdd60a08305f58b8eeec198e6fde141419 100755 (executable)
--- a/configure
+++ b/configure
@@ -20713,6 +20713,23 @@ esac
 
 fi
 
+# mingw has adopted a GNU-centric interpretation of optind/optreset,
+# so always use our version on Windows.
+if test "$PORTNAME" = "win32"; then
+  case " $LIBOBJS " in
+  *" getopt.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS getopt.$ac_objext"
+ ;;
+esac
+
+  case " $LIBOBJS " in
+  *" getopt_long.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext"
+ ;;
+esac
+
+fi
+
 # Cygwin's erand48() is broken (always returns zero) in some releases,
 # so force use of ours.
 if test "$PORTNAME" = "cygwin"; then
 done
 
 
-case " $LIBOBJS " in
+  case " $LIBOBJS " in
   *" kill.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS kill.$ac_objext"
  ;;
 esac
 
-case " $LIBOBJS " in
+  case " $LIBOBJS " in
   *" open.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS open.$ac_objext"
  ;;
 esac
 
-case " $LIBOBJS " in
+  case " $LIBOBJS " in
   *" win32env.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS win32env.$ac_objext"
  ;;
 esac
 
-case " $LIBOBJS " in
+  case " $LIBOBJS " in
   *" win32error.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS win32error.$ac_objext"
  ;;
index df95cc7b09bf9247114dded05dc4ac4012a60fb7..b0644dfb6d3fbc63bdc11541728cc6e808967047 100644 (file)
@@ -1328,6 +1328,13 @@ if test "$PORTNAME" = "solaris"; then
   AC_LIBOBJ(getopt)
 fi
 
+# mingw has adopted a GNU-centric interpretation of optind/optreset,
+# so always use our version on Windows.
+if test "$PORTNAME" = "win32"; then
+  AC_LIBOBJ(getopt)
+  AC_LIBOBJ(getopt_long)
+fi
+
 # Cygwin's erand48() is broken (always returns zero) in some releases,
 # so force use of ours.
 if test "$PORTNAME" = "cygwin"; then
@@ -1336,13 +1343,13 @@ fi
 
 # Win32 support
 if test "$PORTNAME" = "win32"; then
-AC_REPLACE_FUNCS(gettimeofday)
-AC_LIBOBJ(kill)
-AC_LIBOBJ(open)
-AC_LIBOBJ(win32env)
-AC_LIBOBJ(win32error)
-AC_DEFINE([HAVE_SYMLINK], 1,
-          [Define to 1 if you have the `symlink' function.])
+  AC_REPLACE_FUNCS(gettimeofday)
+  AC_LIBOBJ(kill)
+  AC_LIBOBJ(open)
+  AC_LIBOBJ(win32env)
+  AC_LIBOBJ(win32error)
+  AC_DEFINE([HAVE_SYMLINK], 1,
+            [Define to 1 if you have the `symlink' function.])
 fi
 
 if test "$with_readline" = yes; then
index 279f0f081a4600805e55b98e01f5840900eb16bc..7e8af148ac8c66453bac07ba53841859fa87bb3e 100644 (file)
@@ -312,7 +312,8 @@ extern char *optarg;
 extern int optind,
            opterr;
 
-#ifdef HAVE_INT_OPTRESET
+/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */
+#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
 extern int optreset;           /* might not be declared by system headers */
 #endif
 
@@ -750,7 +751,7 @@ PostmasterMain(int argc, char *argv[])
     * getopt(3) library so that it will work correctly in subprocesses.
     */
    optind = 1;
-#ifdef HAVE_INT_OPTRESET
+#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
    optreset = 1;               /* some systems need this too */
 #endif
 
index 62adaca2174807830e1a44388623a352c3647363..052b2565570d15762bc7ad4eff760671a9ab8bac 100644 (file)
@@ -77,7 +77,8 @@
 extern char *optarg;
 extern int optind;
 
-#ifdef HAVE_INT_OPTRESET
+/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */
+#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
 extern int optreset;           /* might not be declared by system headers */
 #endif
 
@@ -3439,7 +3440,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
     * or when this function is called a second time with another array.
     */
    optind = 1;
-#ifdef HAVE_INT_OPTRESET
+#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
    optreset = 1;               /* some systems need this too */
 #endif