diff options
author | Tom Lane | 2010-12-16 21:22:05 +0000 |
---|---|---|
committer | Tom Lane | 2010-12-16 21:23:05 +0000 |
commit | 61b53695fbbedb7fa9d394e71bf2affdc494e6b0 (patch) | |
tree | ca0928724860207b44639a6bfbf0c4feb8a4db84 /src/port/getopt.c | |
parent | cd1fefa973968ff4e3760a9593f70fe2da0def48 (diff) |
Remove optreset from src/port/ implementations of getopt and getopt_long.
We don't actually need optreset, because we can easily fix the code to
ensure that it's cleanly restartable after having completed a scan over the
argv array; which is the only case we need to restart in. Getting rid of
it avoids a class of interactions with the system libraries and allows
reversion of my change of yesterday in postmaster.c and postgres.c.
Back-patch to 8.4. Before that the getopt code was a bit different anyway.
Diffstat (limited to 'src/port/getopt.c')
-rw-r--r-- | src/port/getopt.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/port/getopt.c b/src/port/getopt.c index 90c882c1fd8..aacfbc3e540 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 != ':') |