On 12/15/2010 03:52 PM, Tom Lane wrote:
Andrew Dunstan<and...@dunslane.net>  writes:
And here is where it changed:
<http://sourceforge.net/project/shownotes.php?release_id=24832>
     * A replacement implementation for the getopt() family of functions,
        adding support for the GNU getopt_long_only() function.  Users
        should note that this intentionally *removes* support for the BSD
        or Mac OS-X specific, and non-standard, `optreset' global variable;
        to reset the getopt() scanner, use `optind = 0;' instead of relying
        on this non-standard, non-portable and now-unsupported feature.
Great.  So instead of a nonstandard but pretty portable API, they
decided on a nonstandard interpretation of optind ... which absolutely
will not work for our usage, because we need to be able to tell getopt
to skip over --single, even if we were willing to figure out whether
getopt behaves this way or the more usual way.  Dolts.

While I don't mind forcing use of our getopt() on mingw, I'm a mite
concerned by the idea that this might represent an upstream change we'll
soon see elsewhere, rather than just mingw-specific brain damage.
Anybody know?

                        

On my Fedora box, man 3 getopt says this:

   A program that scans multiple argument vectors, or rescans the same
   vector more than once, and wants to make use of GNU extensions such
   as '+'  and '-'  at  the start of optstring, or changes the value of
   POSIXLY_CORRECT between scans, must reinitialize getopt() by
resetting optind to 0, rather than the traditional value of 1. (Resetting to 0 forces the invocation of an internal initialization
   routine that rechecks POSIXLY_CORRECT and checks for GNU extensions
   in optstring.)

Modulo the --single issue, we don't have to force use of our getopt on Mingw. This patch seems to work, at least to get regression working:

   diff --git a/src/backend/postmaster/postmaster.c
   b/src/backend/postmaster/postmaster.c
   index 90854f4..9ae3767 100644
   --- a/src/backend/postmaster/postmaster.c
   +++ b/src/backend/postmaster/postmaster.c
   @@ -753,6 +753,8 @@ PostmasterMain(int argc, char *argv[])
         optind = 1;
     #ifdef HAVE_INT_OPTRESET
         optreset = 1;                /* some systems need this too */
   +#elsif defined (WIN32) &&  !defined(_MSC_VER)
   +    optind = 0;                 /* modern Mingw needs this instead */
     #endif

         /* For debugging: display postmaster environment */
   diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
   index ff2e9bd..ea4ae79 100644
   --- a/src/backend/tcop/postgres.c
   +++ b/src/backend/tcop/postgres.c
   @@ -3444,6 +3444,8 @@ process_postgres_switches(int argc, char
   *argv[], GucContext ctx)
         optind = 1;
     #ifdef HAVE_INT_OPTRESET
         optreset = 1;                /* some systems need this too */
   +#elsif defined (WIN32) &&  !defined(_MSC_VER)
   +        optind = 0;                             /* modern Mingw
   needs this instead */
     #endif

cheers

andrew



--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to