1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

rm "I/O error" error msg; just keep >0 exit status (re: 9011fa93)

The bug was really that I/O errors in output builtins were
undetectable by any means. Having a >0 exit status is sufficient.
Adding an error message risks making existing ksh scripts noisier,
or even breaking them if they redirect stderr to stdout.

Note to self: in future, implement the minimum change necessary to
fix bugs, nothing more. The fact that I needed to add four extra
2>/dev/null to the regression tests should have been a hint.

src/cmd/ksh93/bltins/print.c,
src/cmd/ksh93/data/msg.c,
src/cmd/ksh93/include/io.h:
- Remove "I/O error" message.

src/cmd/ksh93/tests/builtins.sh:
- Update to check for exit status only.

src/cmd/ksh93/tests/basic.sh,
src/cmd/ksh93/tests/coprocess.sh:
- Revert four new '2>/dev/null' to suppress the error message.

(cherry picked from commit 5e17be24d18455b575b6e98bc631c6935ffc795a)
This commit is contained in:
Martijn Dekker 2020-06-09 21:57:05 +02:00
parent b883c7a7f8
commit a1f46d785f
7 changed files with 7 additions and 11 deletions

2
NEWS
View file

@ -164,7 +164,7 @@ Any uppercase BUG_* names are modernish shell bug IDs.
Ref.: https://github.com/att/ast/issues/425 Ref.: https://github.com/att/ast/issues/425
https://github.com/att/ast/pull/442 https://github.com/att/ast/pull/442
- Fix BUG_PUTIOERR: Output builtins now correctly detect and report - Fix BUG_PUTIOERR: Output builtins now correctly detect
input/output errors. This allows scripts to check for a nonzero exit input/output errors. This allows scripts to check for a nonzero exit
status on the 'print', 'printf' and 'echo' builtins and prevent possible status on the 'print', 'printf' and 'echo' builtins and prevent possible
infinite loops if SIGPIPE is ignored. infinite loops if SIGPIPE is ignored.

View file

@ -373,8 +373,6 @@ skip2:
if (sfsync(outfile) < 0) if (sfsync(outfile) < 0)
exitval = 1; exitval = 1;
} }
if (exitval)
errormsg(SH_DICT, 2, e_io);
return(exitval); return(exitval);
} }

View file

@ -89,7 +89,6 @@ const char e_access[] = "permission denied";
const char e_direct[] = "bad directory"; const char e_direct[] = "bad directory";
const char e_file[] = "%s: bad file unit number"; const char e_file[] = "%s: bad file unit number";
const char e_redirect[] = "redirection failed"; const char e_redirect[] = "redirection failed";
const char e_io[] = "I/O error";
const char e_trap[] = "%s: bad trap"; const char e_trap[] = "%s: bad trap";
const char e_readonly[] = "%s: is read only"; const char e_readonly[] = "%s: is read only";
const char e_badfield[] = "%d: negative field size"; const char e_badfield[] = "%d: negative field size";

View file

@ -97,7 +97,6 @@ extern const char e_tmpcreate[];
extern const char e_exists[]; extern const char e_exists[];
extern const char e_file[]; extern const char e_file[];
extern const char e_redirect[]; extern const char e_redirect[];
extern const char e_io[];
extern const char e_formspec[]; extern const char e_formspec[];
extern const char e_badregexp[]; extern const char e_badregexp[];
extern const char e_open[]; extern const char e_open[];

View file

@ -446,7 +446,7 @@ done | while read sec; do ( "$binsleep" "$sec"; "$binsleep" "$sec") done
s=SECONDS s=SECONDS
set -o pipefail set -o pipefail
for ((i=0; i < 30; i++)) for ((i=0; i < 30; i++))
do print hello 2>/dev/null do print hello
sleep .01 sleep .01
done | "$binsleep" .1 done | "$binsleep" .1
(( (SECONDS-s) < .2 )) || err_exit 'early termination not causing broken pipe' (( (SECONDS-s) < .2 )) || err_exit 'early termination not causing broken pipe'
@ -486,7 +486,7 @@ bintrue=$(whence -p true)
set -o pipefail set -o pipefail
float start=$SECONDS end float start=$SECONDS end
for ((i=0; i < 2; i++)) for ((i=0; i < 2; i++))
do print foo 2>/dev/null do print foo
sleep .15 sleep .15
done | { read; $bintrue; end=$SECONDS ;} done | { read; $bintrue; end=$SECONDS ;}
(( (SECONDS-start) < .1 )) && err_exit "pipefail not waiting for pipe to finish" (( (SECONDS-start) < .1 )) && err_exit "pipefail not waiting for pipe to finish"

View file

@ -662,8 +662,8 @@ actual=$(
) | true ) | true
} 2>&1 } 2>&1
) )
expect=$': print: I/O error\n1' expect='1'
if [[ $actual != *"$expect" ]] if [[ $actual != "$expect" ]]
then then
err_exit "I/O error not detected: expected $(printf %q "$expect"), got $(printf %q "$actual"))" err_exit "I/O error not detected: expected $(printf %q "$expect"), got $(printf %q "$actual"))"
fi fi

View file

@ -272,7 +272,7 @@ _COSHELL_msgfd=5
function cop function cop
{ {
read read
print ok 2>/dev/null print ok
} }
exp=ok exp=ok
@ -348,7 +348,7 @@ wait
function cop function cop
{ {
read read
print ok 2>/dev/null print ok
} }
exp=ok exp=ok
cop |& cop |&