diff options
author | guenther <> | 2011-03-05 22:10:11 +0000 |
---|---|---|
committer | guenther <> | 2011-03-05 22:10:11 +0000 |
commit | 9d057237f371a465ccec3f1a7a68c19af8920051 (patch) | |
tree | 448ef6b71a537dcd5d0e6ce2a7893a402dc7c930 /src/lib/libc/stdlib/getopt_long.c | |
parent | 40abb7da20d82cdfbe24fc623f51d100e7ae76d4 (diff) | |
download | openbsd-9d057237f371a465ccec3f1a7a68c19af8920051.tar.gz openbsd-9d057237f371a465ccec3f1a7a68c19af8920051.tar.bz2 openbsd-9d057237f371a465ccec3f1a7a68c19af8920051.zip |
Fix PR 6267: recheck POSIXLY_CORRECT each time getopt_long() starts a new
argv and don't suppress the handling of leading '-' in optstring when
POSIXLY_CORRECT is set.
Based on patch from Eric Blake.
ok and manpage update from millert@, manpage ok jmc@
Diffstat (limited to 'src/lib/libc/stdlib/getopt_long.c')
-rw-r--r-- | src/lib/libc/stdlib/getopt_long.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/lib/libc/stdlib/getopt_long.c b/src/lib/libc/stdlib/getopt_long.c index eb1e3ef4be..e149fe0ace 100644 --- a/src/lib/libc/stdlib/getopt_long.c +++ b/src/lib/libc/stdlib/getopt_long.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: getopt_long.c,v 1.24 2010/07/22 19:31:53 blambert Exp $ */ | 1 | /* $OpenBSD: getopt_long.c,v 1.25 2011/03/05 22:10:11 guenther Exp $ */ |
2 | /* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ | 2 | /* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ |
3 | 3 | ||
4 | /* | 4 | /* |
@@ -285,25 +285,25 @@ getopt_internal(int nargc, char * const *nargv, const char *options, | |||
285 | return (-1); | 285 | return (-1); |
286 | 286 | ||
287 | /* | 287 | /* |
288 | * XXX Some GNU programs (like cvs) set optind to 0 instead of | ||
289 | * XXX using optreset. Work around this braindamage. | ||
290 | */ | ||
291 | if (optind == 0) | ||
292 | optind = optreset = 1; | ||
293 | |||
294 | /* | ||
288 | * Disable GNU extensions if POSIXLY_CORRECT is set or options | 295 | * Disable GNU extensions if POSIXLY_CORRECT is set or options |
289 | * string begins with a '+'. | 296 | * string begins with a '+'. |
290 | */ | 297 | */ |
291 | if (posixly_correct == -1) | 298 | if (posixly_correct == -1 || optreset) |
292 | posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); | 299 | posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); |
293 | if (posixly_correct || *options == '+') | 300 | if (*options == '-') |
294 | flags &= ~FLAG_PERMUTE; | ||
295 | else if (*options == '-') | ||
296 | flags |= FLAG_ALLARGS; | 301 | flags |= FLAG_ALLARGS; |
302 | else if (posixly_correct || *options == '+') | ||
303 | flags &= ~FLAG_PERMUTE; | ||
297 | if (*options == '+' || *options == '-') | 304 | if (*options == '+' || *options == '-') |
298 | options++; | 305 | options++; |
299 | 306 | ||
300 | /* | ||
301 | * XXX Some GNU programs (like cvs) set optind to 0 instead of | ||
302 | * XXX using optreset. Work around this braindamage. | ||
303 | */ | ||
304 | if (optind == 0) | ||
305 | optind = optreset = 1; | ||
306 | |||
307 | optarg = NULL; | 307 | optarg = NULL; |
308 | if (optreset) | 308 | if (optreset) |
309 | nonopt_start = nonopt_end = -1; | 309 | nonopt_start = nonopt_end = -1; |