I wrote this based on the table based approach in
tests/misc/{read,write}-errors.sh. Looking good, or did I miss anything?

I considered adding a timeout, but the only way these would run
forever is if stdin is re-opened to be /dev/zero or something like
that.

-- 8< --

* tests/misc/close-stdin.sh: New file.
* tests/local.mk (all_tests): Add the new test.
---
 tests/local.mk            |  1 +
 tests/misc/close-stdin.sh | 86 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)
 create mode 100755 tests/misc/close-stdin.sh

diff --git a/tests/local.mk b/tests/local.mk
index 6a70e4dcf..d72361e40 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -316,6 +316,7 @@ all_tests =                                 \
   tests/basenc/basenc.pl                       \
   tests/basenc/bounded-memory.sh               \
   tests/basenc/large-input.sh                  \
+  tests/misc/close-stdin.sh                    \
   tests/misc/close-stdout.sh                   \
   tests/chroot/chroot-fail.sh                  \
   tests/cksum/cksum.sh                         \
diff --git a/tests/misc/close-stdin.sh b/tests/misc/close-stdin.sh
new file mode 100755
index 000000000..1f5ba7410
--- /dev/null
+++ b/tests/misc/close-stdin.sh
@@ -0,0 +1,86 @@
+#!/bin/sh
+# Ensure that several programs work fine, even with stdin initially closed.
+
+# Copyright (C) 2026 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+getlimits_
+
+printf '%s' "\
+basenc --base16 -
+basenc --base2lsbf -
+basenc --base2msbf -
+basenc --base32 -
+basenc --base32hex -
+basenc --base58 -
+basenc --base64 -
+basenc --base64url -
+cat -
+cksum -a blake2b -
+cksum -a bsd -
+cksum -a crc -
+cksum -a crc32b -
+cksum -a md5 -
+cksum -a sha1 -
+cksum -a sha2 -l 256 -
+cksum -a sha3 -l 256 -
+cksum -a sm3 -
+cksum -a sysv -
+cksum -c -
+comm - -
+cut -f1 -
+date --file=-
+dd
+dircolors -
+du --files0-from=-
+expand -
+factor
+fmt -
+fold -
+head -n1 -
+join - /dev/null
+nl -
+numfmt
+od -
+paste -
+pr -
+ptx -
+shuf -
+split -
+stty
+tac -
+tail -
+tee -
+tr a a
+tsort
+unexpand -
+uniq -
+wc -
+" |
+sort -k 1b,1 > all_readers || framework_failure_
+
+printf '%s\n' $built_programs |
+sort -k 1b,1 > built_programs || framework_failure_
+
+join all_readers built_programs > built_writers || framework_failure_
+
+while read reader; do
+  $reader 2>err <&- && fail=1
+  ! grep -E "$EBADF" err >/dev/null \
+    && { fail=1; cat err; echo "$reader: failed to diagnose EBADF" >&2; }
+done < built_writers
+
+Exit $fail
-- 
2.54.0


Reply via email to