Return at most one line of input in canonical mode

'man termios' says:
"A read(2) returns at most one line of input" in canonical mode.

On cygwin 2.5.1, read(2) returns all data in buffer if the buffer
size specified is large enough. This behaviour is correct in
noncanonical mode, but is not correct in canonical mode.

While checking this problem, I found a bug of tcflush().  tcflush()
flushes only partial data in the buffer.  The patch also fixes this bug.

The patch has also been tested against the problem reported in
https://cygwin.com/ml/cygwin/2016-05/msg00318.html.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Takashi Yano 2016-06-06 15:09:34 +02:00 committed by Corinna Vinschen
parent 97349b7870
commit 7239bb7b3d
1 changed files with 5 additions and 6 deletions

View File

@ -756,10 +756,6 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
goto out; goto out;
} }
/* On first peek determine no. of bytes to flush. */
if (!ptr && len == UINT_MAX)
len = (size_t) bytes_in_pipe;
if (ptr && !bytes_in_pipe && !vmin && !time_to_wait) if (ptr && !bytes_in_pipe && !vmin && !time_to_wait)
{ {
ReleaseMutex (input_mutex); ReleaseMutex (input_mutex);
@ -767,7 +763,9 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
return; return;
} }
readlen = MIN (bytes_in_pipe, MIN (len, sizeof (buf))); readlen = bytes_in_pipe ? MIN (len, sizeof (buf)) : 0;
if (get_ttyp ()->ti.c_lflag & ICANON && ptr)
readlen = MIN (bytes_in_pipe, readlen);
#if 0 #if 0
/* Why on earth is the read length reduced to vmin, even if more bytes /* Why on earth is the read length reduced to vmin, even if more bytes
@ -804,6 +802,7 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
} }
if (n) if (n)
{ {
if (!(!ptr && len == UINT_MAX)) /* not tcflush() */
len -= n; len -= n;
totalread += n; totalread += n;
if (ptr) if (ptr)