From 9832bbaba966f0e52e183f10cd93fad7f8f643fe Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 15 Aug 2017 15:44:41 +0200 Subject: [PATCH] ash: unset OPTARG if getopts exits 1, support OPTERR=0 behavior function old new delta getoptscmd 522 547 +25 Signed-off-by: Denys Vlasenko --- shell/ash.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index 58999fac5..703802ff5 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -10948,6 +10948,7 @@ getopts(char *optstr, char *optvar, char **optfirst) p = *optnext; if (p == NULL || *p != '-' || *++p == '\0') { atend: + unsetvar("OPTARG"); p = NULL; done = 1; goto out; @@ -10960,7 +10961,11 @@ getopts(char *optstr, char *optvar, char **optfirst) c = *p++; for (q = optstr; *q != c;) { if (*q == '\0') { - if (optstr[0] == ':') { + /* OPTERR is a bashism */ + const char *cp = lookupvar("OPTERR"); + if ((cp && LONE_CHAR(cp, '0')) + || (optstr[0] == ':') + ) { sbuf[0] = c; /*sbuf[1] = '\0'; - already is */ setvar0("OPTARG", sbuf); @@ -10977,7 +10982,11 @@ getopts(char *optstr, char *optvar, char **optfirst) if (*++q == ':') { if (*p == '\0' && (p = *optnext) == NULL) { - if (optstr[0] == ':') { + /* OPTERR is a bashism */ + const char *cp = lookupvar("OPTERR"); + if ((cp && LONE_CHAR(cp, '0')) + || (optstr[0] == ':') + ) { sbuf[0] = c; /*sbuf[1] = '\0'; - already is */ setvar0("OPTARG", sbuf);