This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Return at most one line of input in canonical mode


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=7239bb7b3ded5ab961dc56dc346d8ab83660ba29

commit 7239bb7b3ded5ab961dc56dc346d8ab83660ba29
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Mon Jun 6 15:09:34 2016 +0200

    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>

Diff:
---
 winsup/cygwin/fhandler_tty.cc | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 6c00d61..733644f 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -756,10 +756,6 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
 	  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)
 	{
 	  ReleaseMutex (input_mutex);
@@ -767,7 +763,9 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
 	  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
       /* Why on earth is the read length reduced to vmin, even if more bytes
@@ -804,7 +802,8 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
 		}
 	      if (n)
 		{
-		  len -= n;
+		  if (!(!ptr && len == UINT_MAX)) /* not tcflush() */
+		    len -= n;
 		  totalread += n;
 		  if (ptr)
 		    {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]