diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index b2957e4ee..4035c7e56 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -328,7 +328,7 @@ class fhandler_base virtual bool get_readahead_valid () { return raixget () < ralen (); } int puts_readahead (const char *s, size_t len = (size_t) -1); - int put_readahead (char value); + virtual int put_readahead (char value); int get_readahead (); int peek_readahead (int queryput = 0); @@ -2381,6 +2381,7 @@ public: int process_slave_output (char *buf, size_t len, int pktmode_on); void doecho (const void *str, DWORD len); int accept_input (); + int put_readahead (char value); int open (int flags, mode_t mode = 0); void open_setup (int flags); ssize_t __stdcall write (const void *ptr, size_t len); diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index b091765b3..d017cde38 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -532,6 +532,14 @@ fhandler_pty_master::doecho (const void *str, DWORD len) release_output_mutex (); } +int +fhandler_pty_master::put_readahead (char value) +{ + if (to_be_read_from_pcon ()) + return 1; + return fhandler_base::put_readahead (value); +} + int fhandler_pty_master::accept_input () { @@ -542,12 +550,14 @@ fhandler_pty_master::accept_input () bytes_left = eat_readahead (-1); - if (!bytes_left) + if (to_be_read_from_pcon ()) + ; /* Do nothing */ + else if (!bytes_left) { termios_printf ("sending EOF to slave"); get_ttyp ()->read_retval = 0; } - else if (!to_be_read_from_pcon ()) + else { char *p = rabuf (); DWORD rc;