James Youngman wrote:
> On Sun, Apr 11, 2010 at 1:06 PM, Jim Meyering <j...@meyering.net> wrote:
>> James Youngman wrote:
>>> * lib/closeout.c (close_stdout): Don't signal an error closing
>>> stdout or stderr if it was already closed.
>>> * lib/closein.c (close_stdin): Don't signal an error closing stdin
>>> if it was already closed.
>>> * lib/close-stream.c (close_stream): Make boolean variables const
>>> to document the fact that we set but do not change them.
>>
>> Hi James,
>>
>> Thanks for the patch, but why do you want to do that?
>>
>> Here are examples showing why we should keep the existing behavior.
>> Currently, cp diagnoses failure to write verbose output to a closed stdout:
>>
>>    $ cp --verbose a b >&-
>>    cp: write error: Bad file descriptor
>
> Right.   Here, potentially-useful data has been lost (at the
> instruction of the user, in this case).   The diagnostic is going to
> be useful for some programs.  Gnulib, being a library, has no way to
> know when the diagnostic will not be useful.
>
> However, while a failure to flush data should be diagnosed, I think
> that if no output data would in fact be lost, there is no problem and
> a diagnostic shouldn't be issued.   If you agree, I could submit a
> modified patch.

For output, that case is already handled.
Demonstrate by noting that "touch a >&-" prints no output when it succeeds.

> The use case I have in mind is a somewhat contrived example
>
> $  ./find/oldfind doc -mindepth 1 -ok echo {} \;  <&-
> < echo ... doc/Makefile > ? ./find/oldfind: error closing file

On the input side, rather than making a generic stream-closing function
ignore failure due to EBADF, how about making your code detect when
the file descriptor is invalid?  Testing fcntl (fd, F_GETFD) == -1 has
minimal cost.


Reply via email to