git: 7f04c09fe745 - main - rc.subr: Fix wait_for_pids

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Fri, 01 Aug 2025 23:13:03 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=7f04c09fe74535c1646a4af120f8f1342fe1c328

commit 7f04c09fe74535c1646a4af120f8f1342fe1c328
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-08-01 23:11:40 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-08-01 23:11:57 +0000

    rc.subr: Fix wait_for_pids
    
    It looks like this function was intended to loop and print an update
    whenever at least one of the waited-for processes terminates.  However,
    the default behavior of pwait is to block until none of the watched
    processes exist.  Use pwait -o instead so it only blocks until at least
    one process terminates, and add a test.
    
    Sponsored by:   Klara, Inc.
    Sponsored by:   NetApp, Inc.
    Reviewed by:    siderop1_netapp.com, kevans
    Differential Revision:  https://reviews.freebsd.org/D51691
---
 libexec/rc/rc.subr               |  4 ++--
 libexec/rc/tests/rc_subr_test.sh | 27 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index a2e2e98a5087..06b1bd51384c 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -800,7 +800,7 @@ wait_for_pids()
 	fi
 	_prefix=
 	while true; do
-		_nlist="";
+		_nlist=""
 		for _j in $_list; do
 			if kill -0 $_j 2>/dev/null; then
 				_nlist="${_nlist}${_nlist:+ }$_j"
@@ -813,7 +813,7 @@ wait_for_pids()
 		_list=$_nlist
 		echo -n ${_prefix:-"Waiting for PIDS: "}$_list
 		_prefix=", "
-		pwait $_list 2>/dev/null
+		pwait -o $_list 2>/dev/null
 	done
 	if [ -n "$_prefix" ]; then
 		echo "."
diff --git a/libexec/rc/tests/rc_subr_test.sh b/libexec/rc/tests/rc_subr_test.sh
index 9931389e7a02..e8398c8d9b12 100644
--- a/libexec/rc/tests/rc_subr_test.sh
+++ b/libexec/rc/tests/rc_subr_test.sh
@@ -1,5 +1,8 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause
 #
 # Copyright 2022 Mateusz Piotrowski <0mp@FreeBSD.org>
+# Copyright (c) 2025 Klara, Inc.
 #
 # SPDX-License-Identifier: BSD-2-Clause
 #
@@ -104,8 +107,32 @@ oomprotect_yes_body()
 		/bin/sh "$__script" "$__name" "$__pidfile" onestop
 }
 
+atf_test_case wait_for_pids_progress
+wait_for_pids_progress_head()
+{
+	atf_set "descr" "Verify that wait_for_pids prints progress updates"
+}
+wait_for_pids_progress_body()
+{
+	cat >>script <<'EOF'
+. /etc/rc.subr
+sleep 15 &
+a=$!
+sleep 10 &
+b=$!
+sleep 5 &
+c=$!
+wait_for_pids $a $b $c
+EOF
+	re="^Waiting for PIDS: [0-9]+ [0-9]+ [0-9]+"
+	re="${re}, [0-9]+ [0-9]+"
+	re="${re}, [0-9]+\.$"
+	atf_check -s exit:0 -o match:"${re}" /bin/sh script
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case oomprotect_all
 	atf_add_test_case oomprotect_yes
+	atf_add_test_case wait_for_pids_progress
 }