On 6/20/2022 9:53 AM, Eliot Moss wrote:
Good idea to wait for Corinna. I did a smidge of research, looking through
the Wikipedia page on the POSIX terminal interface. It suggests that this
part was largely borrowed from System-V, so that may explain what we see in
newlib. And looking up the POSIX spec, it says this:
"Special character on input, which is recognized if the ICANON flag is
set. When received, all the bytes waiting to be read are immediately passed to
the process without waiting for a <newline>, and the EOF is discarded. Thus,
if there are no bytes waiting (that is, the EOF occurred at the beginning of a
line), a byte count of zero shall be returned from the read(), representing an
end-of-file indication. If ICANON is set, the EOF character shall be discarded
when processed."
This suggests that indeed control-D will need to be typed twice before a
blocking read on a terminal with ICANON will appear to be at eof. I guess we
can consider getchar to be (almost) like a read of size 1, except where read
would return 0, getchar returns -1.
The quoted text above implies that the second control-D will set the
end-of-file indicator. So I agree that it looks like the ifndef should be
removed. And of course, wherever we said control-D, EOF should be implied (it
is normally control-D, but the user can change which character is associated
with the EOF semantics).
I would frame the issue slightly differently, since this is not just about
terminals; the code we're discussing applies to any file. Suppose EOF has been
seen in a call to one of the stdio input functions. Prior to commit 1f8f7e2d,
any further calls to those functions would immediately return EOF. Since that
commit, however, another attempt is made to read, and the EOF indicator for the
file is turned off if input is found. In many cases (e.g., an ordinary disk
file), this second read will still return EOF. In other cases (e.g., a
terminal), the second read might block if there's still no input available.
Ken
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple