ash: unset OPTARG if getopts exits 1, support OPTERR=0 behavior

function                                             old     new   delta
getoptscmd                                           522     547     +25

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-08-15 15:44:41 +02:00
parent 4476c70301
commit 9832bbaba9

View File

@ -10948,6 +10948,7 @@ getopts(char *optstr, char *optvar, char **optfirst)
p = *optnext; p = *optnext;
if (p == NULL || *p != '-' || *++p == '\0') { if (p == NULL || *p != '-' || *++p == '\0') {
atend: atend:
unsetvar("OPTARG");
p = NULL; p = NULL;
done = 1; done = 1;
goto out; goto out;
@ -10960,7 +10961,11 @@ getopts(char *optstr, char *optvar, char **optfirst)
c = *p++; c = *p++;
for (q = optstr; *q != c;) { for (q = optstr; *q != c;) {
if (*q == '\0') { 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[0] = c;
/*sbuf[1] = '\0'; - already is */ /*sbuf[1] = '\0'; - already is */
setvar0("OPTARG", sbuf); setvar0("OPTARG", sbuf);
@ -10977,7 +10982,11 @@ getopts(char *optstr, char *optvar, char **optfirst)
if (*++q == ':') { if (*++q == ':') {
if (*p == '\0' && (p = *optnext) == NULL) { 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[0] = c;
/*sbuf[1] = '\0'; - already is */ /*sbuf[1] = '\0'; - already is */
setvar0("OPTARG", sbuf); setvar0("OPTARG", sbuf);