On 7/15/23 23:08, Pádraig Brady wrote:
The attached patch-set addresses two classes of issue:
1. Doubled error messages upon write errors
2. Continued processing upon write errors (the orig problem reported).
Nice work!
Patch 1:
> --- /dev/null
> +++ b/tests/misc/write-errors.sh
> @@ -0,0 +1,70 @@
> +if ! test -w /dev/full || ! test -c /dev/full; then
> + skip_ 'Need /dev/full'
Other tests use a slightly different skip message:
skip_ '/dev/full is required'
I'd favor the latter, so that we don't miss it once we'd like
to factor it out to a require_dev_full in init.cfg.
Re. patch 002:
> all: avoid repeated diagnostic upon write error
>
> * cfg.mk (sc_some_programs_must_avoid_exit_failure): Adjust to
> avoid false positive.
> (sc_prohibit_exit_write_error): A new syntax check to prohibit
> open coding error(..., "write error"); instead directiing to use...
s/ii/i/
> --- a/src/system.h
> +++ b/src/system.h
> @@ -762,6 +762,14 @@ The following directory is part of the cycle:\n
%s\n"), \
> } \
> while (0)
>
> +static inline void
> +write_error (void)
> +{
> + fflush (stdout); /* Ensure nothing buffered that might induce an
error. */
> + clearerr (stdout); /* To avoid extraneous diagnostic from close_stdout.
*/
> + error (EXIT_FAILURE, errno, _("write error"));
> +}
Hmm, fflush could theoretically change errno, couldn't it?
In that case, error() would give a wrong diagnostic.
FWIW: `man clearerr` states that this function doesn't touch errno.