xargs: fix exit code when using -P

currently when xargs runs in parallel mode (e.g. -P2), it somtimes
incorrectly returns zero exit code.  this commit fix it and also adds
tests.

Reviewed by:	mjg
PR:	267110
This commit is contained in:
liu-du 2022-10-16 03:41:54 +00:00 committed by Mateusz Guzik
parent b136983a8a
commit 0ca740d9a6
2 changed files with 14 additions and 5 deletions

View file

@ -1,6 +1,6 @@
# $FreeBSD$
echo 1..16
echo 1..20
REGRESSION_START($1)
@ -21,4 +21,9 @@ REGRESSION_TEST(`0L', `xargs -0 -L2 echo <${SRCDIR}/regress.0.in')
REGRESSION_TEST(`0P1', `xargs -0 -P1 echo <${SRCDIR}/regress.0.in')
REGRESSION_TEST(`quotes', `xargs -n1 echo <${SRCDIR}/regress.quotes.in')
REGRESSION_TEST_FREEFORM(`parallel1', `echo /var/empty /var/empty | xargs -n1 -P2 test -d; [ $? = 0 ]')
REGRESSION_TEST_FREEFORM(`parallel2', `echo /var/empty /var/empty/nodir | xargs -n1 -P2 test -d; [ $? = 1 ]')
REGRESSION_TEST_FREEFORM(`parallel3', `echo /var/empty/nodir /var/empty | xargs -n1 -P2 test -d; [ $? = 1 ]')
REGRESSION_TEST_FREEFORM(`parallel4', `echo /var/empty/nodir /var/empty/nodir | xargs -n1 -P2 test -d; [ $? = 1 ]')
REGRESSION_END()

View file

@ -315,8 +315,10 @@ parse_input(int argc, char *argv[])
switch (ch = getchar()) {
case EOF:
/* No arguments since last exec. */
if (p == bbp)
xexit(*av, rval);
if (p == bbp) {
waitchildren(*av, 1);
exit(rval);
}
goto arg1;
case ' ':
case '\t':
@ -406,8 +408,10 @@ arg1: if (insingle || indouble) {
*xp++ = *avj;
}
prerun(argc, av);
if (ch == EOF || foundeof)
xexit(*av, rval);
if (ch == EOF || foundeof) {
waitchildren(*av, 1);
exit(rval);
}
p = bbp;
xp = bxp;
count = 0;