diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 7e8af148ac..279f0f081a 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -312,8 +312,7 @@ extern char *optarg; extern int optind, opterr; -/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */ -#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT) +#ifdef HAVE_INT_OPTRESET extern int optreset; /* might not be declared by system headers */ #endif @@ -751,7 +750,7 @@ PostmasterMain(int argc, char *argv[]) * getopt(3) library so that it will work correctly in subprocesses. */ optind = 1; -#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT) +#ifdef HAVE_INT_OPTRESET optreset = 1; /* some systems need this too */ #endif diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 052b256557..62adaca217 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -77,8 +77,7 @@ extern char *optarg; extern int optind; -/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */ -#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT) +#ifdef HAVE_INT_OPTRESET extern int optreset; /* might not be declared by system headers */ #endif @@ -3440,7 +3439,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) * or when this function is called a second time with another array. */ optind = 1; -#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT) +#ifdef HAVE_INT_OPTRESET optreset = 1; /* some systems need this too */ #endif diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h index 5c3bdd332c..8038f14ba1 100644 --- a/src/include/getopt_long.h +++ b/src/include/getopt_long.h @@ -18,7 +18,6 @@ extern int opterr; extern int optind; extern int optopt; extern char *optarg; -extern int optreset; #ifndef HAVE_STRUCT_OPTION diff --git a/src/port/getopt.c b/src/port/getopt.c index ed7f421a47..b759d53f0a 100644 --- a/src/port/getopt.c +++ b/src/port/getopt.c @@ -41,7 +41,7 @@ static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; * On some versions of Solaris, opterr and friends are defined in core libc * rather than in a separate getopt module. Define these variables only * if configure found they aren't there by default. (We assume that testing - * opterr is sufficient for all of these except optreset.) + * opterr is sufficient for all of these.) */ #ifndef HAVE_INT_OPTERR @@ -57,12 +57,6 @@ extern int optopt; extern char *optarg; #endif -#ifndef HAVE_INT_OPTRESET -int optreset; /* reset getopt */ -#else -extern int optreset; -#endif - #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" @@ -70,6 +64,12 @@ extern int optreset; /* * getopt * Parse argc/argv argument vector. + * + * This implementation does not use optreset. Instead, we guarantee that + * it can be restarted on a new argv array after a previous call returned -1, + * if the caller resets optind to 1 before the first call of the new series. + * (Internally, this means we must be sure to reset "place" to EMSG before + * returning -1.) */ int getopt(nargc, nargv, ostr) @@ -80,9 +80,8 @@ const char *ostr; static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ - if (optreset || !*place) + if (!*place) { /* update scanning pointer */ - optreset = 0; if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; @@ -102,7 +101,10 @@ const char *ostr; * if the user didn't specify '-' as an option, assume it means -1. */ if (optopt == (int) '-') + { + place = EMSG; return -1; + } if (!*place) ++optind; if (opterr && *ostr != ':') diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c index 9433b56827..1127803024 100644 --- a/src/port/getopt_long.c +++ b/src/port/getopt_long.c @@ -38,17 +38,21 @@ #include "getopt_long.h" -#ifndef HAVE_INT_OPTRESET -int optreset; - -/* else the "extern" was provided by getopt_long.h */ -#endif - #define BADCH '?' #define BADARG ':' #define EMSG "" +/* + * getopt_long + * Parse argc/argv argument vector, with long options. + * + * This implementation does not use optreset. Instead, we guarantee that + * it can be restarted on a new argv array after a previous call returned -1, + * if the caller resets optind to 1 before the first call of the new series. + * (Internally, this means we must be sure to reset "place" to EMSG before + * returning -1.) + */ int getopt_long(int argc, char *const argv[], const char *optstring, @@ -57,10 +61,8 @@ getopt_long(int argc, char *const argv[], static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ - if (optreset || !*place) + if (!*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= argc) { place = EMSG;