mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-04-17 00:56:34 +02:00
yes: avoid redundant diagnostics on write error
* src/yes.c (main): For large inputs only write a single diagnostic for write errors. * tests/misc/yes.sh: Test when /dev/full is available.
This commit is contained in:
@@ -121,6 +121,7 @@ main (int argc, char **argv)
|
||||
if ((pbuf - buf) && fwrite (buf, pbuf - buf, 1, stdout) != 1)
|
||||
{
|
||||
error (0, errno, _("standard output"));
|
||||
clearerr (stdout);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
for (j = i; j < argc; j++)
|
||||
@@ -128,6 +129,7 @@ main (int argc, char **argv)
|
||||
|| putchar (j == argc - 1 ? '\n' : ' ') == EOF)
|
||||
{
|
||||
error (0, errno, _("standard output"));
|
||||
clearerr (stdout);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,9 +30,9 @@ for size in 1 1999 4095 4096 8191 8192 16383 16384; do
|
||||
done
|
||||
|
||||
# Check the many small items case,
|
||||
# both fitting and overflowing the internal buffer
|
||||
external=env
|
||||
if external true $(seq 4000); then
|
||||
# both fitting and overflowing the internal buffer.
|
||||
# First check that 4000 arguments supported.
|
||||
if test 4000 -eq $(sh -c 'echo $#' 0 $(seq 4000)); then
|
||||
for i in 100 4000; do
|
||||
seq $i | paste -s -d ' ' | sed p > out.1
|
||||
yes $(seq $i) | head -n2 > out.2
|
||||
@@ -40,4 +40,17 @@ if external true $(seq 4000); then
|
||||
done
|
||||
fi
|
||||
|
||||
# Check a single appropriate diagnostic is output on write error
|
||||
if test -w /dev/full && test -c /dev/full; then
|
||||
# The single output diagnostic expected,
|
||||
# (without the possibly varying :strerror(ENOSPC) suffix).
|
||||
printf '%s\n' "yes: standard output" > exp
|
||||
|
||||
for size in 1 16384; do
|
||||
returns_ 1 yes "$(printf %${size}s '')" >/dev/full 2>errt
|
||||
sed 's/\(yes:.*\):.*/\1/' errt > err
|
||||
compare exp err || fail=1
|
||||
done
|
||||
fi
|
||||
|
||||
Exit $fail
|
||||
|
||||
Reference in New Issue
Block a user