1
0
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:
Pádraig Brady
2016-04-04 13:17:34 +01:00
parent 2ef6212519
commit 0f5d784bc6
2 changed files with 18 additions and 3 deletions

View File

@@ -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;
}
}

View File

@@ -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