git: 2abbb9dd7802 - stable/12 - xargs: fix exit code when using -P
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 10 Nov 2022 22:45:35 UTC
The branch stable/12 has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=2abbb9dd7802c4408922104e1b961603008fde2e commit 2abbb9dd7802c4408922104e1b961603008fde2e Author: liu-du <duliujimmy@hotmail.com> AuthorDate: 2022-10-16 03:41:54 +0000 Commit: Mateusz Guzik <mjg@FreeBSD.org> CommitDate: 2022-11-10 22:45:24 +0000 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 (cherry picked from commit 0ca740d9a639ab635f5a28be9051d0124a9544a1) --- usr.bin/xargs/tests/regress.sh | 7 ++++++- usr.bin/xargs/xargs.c | 12 ++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/usr.bin/xargs/tests/regress.sh b/usr.bin/xargs/tests/regress.sh index 72458a42d774..e79bfd4352fa 100644 --- a/usr.bin/xargs/tests/regress.sh +++ b/usr.bin/xargs/tests/regress.sh @@ -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() diff --git a/usr.bin/xargs/xargs.c b/usr.bin/xargs/xargs.c index 2825a26f4dfa..6520d43dae50 100644 --- a/usr.bin/xargs/xargs.c +++ b/usr.bin/xargs/xargs.c @@ -314,8 +314,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': @@ -405,8 +407,10 @@ arg2: *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;