From 0ca740d9a639ab635f5a28be9051d0124a9544a1 Mon Sep 17 00:00:00 2001 From: liu-du Date: Sun, 16 Oct 2022 03:41:54 +0000 Subject: [PATCH] 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 --- 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 7b664cfde1cc..21455e7be26e 100644 --- a/usr.bin/xargs/xargs.c +++ b/usr.bin/xargs/xargs.c @@ -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;