From: Tom Lane Date: Thu, 16 Dec 2010 04:50:49 +0000 (-0500) Subject: Fix up getopt() reset management so it works on recent mingw. X-Git-Tag: REL9_0_3~32 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=770bddc1b4b59338395185966100056d90e6dcf9;p=postgresql 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. --- diff --git a/configure b/configure index 7000034753..f96c0ffdd6 100755 --- 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 @@ -20835,25 +20852,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" ;; diff --git a/configure.in b/configure.in index df95cc7b09..b0644dfb6d 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 279f0f081a..7e8af148ac 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -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 diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 62adaca217..052b256557 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -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