Commit 5cdd65f3 authored by Tom Lane's avatar Tom Lane

Fix up getopt() reset management so it works on recent mingw.

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.
parent 2a6ebe70
...@@ -20758,6 +20758,23 @@ esac ...@@ -20758,6 +20758,23 @@ esac
fi 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, # Cygwin's erand48() is broken (always returns zero) in some releases,
# so force use of ours. # so force use of ours.
if test "$PORTNAME" = "cygwin"; then if test "$PORTNAME" = "cygwin"; then
...@@ -20880,25 +20897,25 @@ fi ...@@ -20880,25 +20897,25 @@ fi
done done
case " $LIBOBJS " in case " $LIBOBJS " in
*" kill.$ac_objext "* ) ;; *" kill.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS kill.$ac_objext" *) LIBOBJS="$LIBOBJS kill.$ac_objext"
;; ;;
esac esac
case " $LIBOBJS " in case " $LIBOBJS " in
*" open.$ac_objext "* ) ;; *" open.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS open.$ac_objext" *) LIBOBJS="$LIBOBJS open.$ac_objext"
;; ;;
esac esac
case " $LIBOBJS " in case " $LIBOBJS " in
*" win32env.$ac_objext "* ) ;; *" win32env.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS win32env.$ac_objext" *) LIBOBJS="$LIBOBJS win32env.$ac_objext"
;; ;;
esac esac
case " $LIBOBJS " in case " $LIBOBJS " in
*" win32error.$ac_objext "* ) ;; *" win32error.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS win32error.$ac_objext" *) LIBOBJS="$LIBOBJS win32error.$ac_objext"
;; ;;
......
...@@ -1328,6 +1328,13 @@ if test "$PORTNAME" = "solaris"; then ...@@ -1328,6 +1328,13 @@ if test "$PORTNAME" = "solaris"; then
AC_LIBOBJ(getopt) AC_LIBOBJ(getopt)
fi 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, # Cygwin's erand48() is broken (always returns zero) in some releases,
# so force use of ours. # so force use of ours.
if test "$PORTNAME" = "cygwin"; then if test "$PORTNAME" = "cygwin"; then
...@@ -1336,13 +1343,13 @@ fi ...@@ -1336,13 +1343,13 @@ fi
# Win32 support # Win32 support
if test "$PORTNAME" = "win32"; then if test "$PORTNAME" = "win32"; then
AC_REPLACE_FUNCS(gettimeofday) AC_REPLACE_FUNCS(gettimeofday)
AC_LIBOBJ(kill) AC_LIBOBJ(kill)
AC_LIBOBJ(open) AC_LIBOBJ(open)
AC_LIBOBJ(win32env) AC_LIBOBJ(win32env)
AC_LIBOBJ(win32error) AC_LIBOBJ(win32error)
AC_DEFINE([HAVE_SYMLINK], 1, AC_DEFINE([HAVE_SYMLINK], 1,
[Define to 1 if you have the `symlink' function.]) [Define to 1 if you have the `symlink' function.])
fi fi
if test "$with_readline" = yes; then if test "$with_readline" = yes; then
......
...@@ -313,7 +313,8 @@ extern char *optarg; ...@@ -313,7 +313,8 @@ extern char *optarg;
extern int optind, extern int optind,
opterr; 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 */ extern int optreset; /* might not be declared by system headers */
#endif #endif
...@@ -751,7 +752,7 @@ PostmasterMain(int argc, char *argv[]) ...@@ -751,7 +752,7 @@ PostmasterMain(int argc, char *argv[])
* getopt(3) library so that it will work correctly in subprocesses. * getopt(3) library so that it will work correctly in subprocesses.
*/ */
optind = 1; optind = 1;
#ifdef HAVE_INT_OPTRESET #if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
optreset = 1; /* some systems need this too */ optreset = 1; /* some systems need this too */
#endif #endif
......
...@@ -78,7 +78,8 @@ ...@@ -78,7 +78,8 @@
extern char *optarg; extern char *optarg;
extern int optind; 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 */ extern int optreset; /* might not be declared by system headers */
#endif #endif
...@@ -3442,7 +3443,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) ...@@ -3442,7 +3443,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
* or when this function is called a second time with another array. * or when this function is called a second time with another array.
*/ */
optind = 1; optind = 1;
#ifdef HAVE_INT_OPTRESET #if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
optreset = 1; /* some systems need this too */ optreset = 1; /* some systems need this too */
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment