Skip to content

Commit

Permalink
Fix up getopt() reset management so it works on recent mingw.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tglsfdc committed Dec 16, 2010
1 parent 2a6ebe7 commit 5cdd65f
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 15 deletions.
25 changes: 21 additions & 4 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -20758,6 +20758,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
Expand Down Expand Up @@ -20880,25 +20897,25 @@ fi
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"
;;
Expand Down
21 changes: 14 additions & 7 deletions configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
5 changes: 3 additions & 2 deletions src/backend/postmaster/postmaster.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,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

Expand Down Expand Up @@ -751,7 +752,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

Expand Down
5 changes: 3 additions & 2 deletions src/backend/tcop/postgres.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,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

Expand Down Expand Up @@ -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.
*/
optind = 1;
#ifdef HAVE_INT_OPTRESET
#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT)
optreset = 1; /* some systems need this too */
#endif

Expand Down

0 comments on commit 5cdd65f

Please sign in to comment.