diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-02-13 11:42:42 +0900 |
---|---|---|
committer | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-02-13 23:36:43 +0900 |
commit | 02f7f6543abc35a25fd024d8a58f374a86633846 (patch) | |
tree | fed01a568695f6747f4c4fea171d3fa3ebf54de3 | |
parent | 73cd80c976e1bc4af5f63c02be94a112dd2cfecc (diff) | |
download | newlib-02f7f6543abc35a25fd024d8a58f374a86633846.zip newlib-02f7f6543abc35a25fd024d8a58f374a86633846.tar.gz newlib-02f7f6543abc35a25fd024d8a58f374a86633846.tar.bz2 |
Cygwin: console: Make VMIN and VTIME work.
Previously, VMIN and VTIME did not work at all. This patch fixes that.
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
-rw-r--r-- | winsup/cygwin/fhandler/console.cc | 26 | ||||
-rw-r--r-- | winsup/cygwin/release/3.5.1 | 2 |
2 files changed, 20 insertions, 8 deletions
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc index 1c8d383..b0907eb 100644 --- a/winsup/cygwin/fhandler/console.cc +++ b/winsup/cygwin/fhandler/console.cc @@ -1131,10 +1131,14 @@ fhandler_console::read (void *pv, size_t& buflen) push_process_state process_state (PID_TTYIN); - int copied_chars = 0; + size_t copied_chars = 0; - DWORD timeout = is_nonblocking () ? 0 : INFINITE; + DWORD timeout = is_nonblocking () ? 0 : + (get_ttyp ()->ti.c_lflag & ICANON ? INFINITE : + (get_ttyp ()->ti.c_cc[VMIN] == 0 ? 0 : + (get_ttyp ()->ti.c_cc[VTIME]*100 ? : INFINITE))); +read_more: while (!input_ready && !get_cons_readahead_valid ()) { int bgres; @@ -1157,6 +1161,11 @@ wait_retry: pthread::static_cancel_self (); /*NOTREACHED*/ case WAIT_TIMEOUT: + if (copied_chars) + { + buflen = copied_chars; + return; + } set_sig_errno (EAGAIN); buflen = (size_t) -1; return; @@ -1204,19 +1213,20 @@ wait_retry: } /* Check console read-ahead buffer filled from terminal requests */ - while (con.cons_rapoi && *con.cons_rapoi && buflen) - { - buf[copied_chars++] = *con.cons_rapoi++; - buflen --; - } + while (con.cons_rapoi && *con.cons_rapoi && buflen > copied_chars) + buf[copied_chars++] = *con.cons_rapoi++; copied_chars += - get_readahead_into_buffer (buf + copied_chars, buflen); + get_readahead_into_buffer (buf + copied_chars, buflen - copied_chars); if (!con_ra.ralen) input_ready = false; release_input_mutex (); + if (buflen > copied_chars && !(get_ttyp ()->ti.c_lflag & ICANON) + && copied_chars < get_ttyp ()->ti.c_cc[VMIN]) + goto read_more; + #undef buf buflen = copied_chars; diff --git a/winsup/cygwin/release/3.5.1 b/winsup/cygwin/release/3.5.1 index 715fcf7..e041f98 100644 --- a/winsup/cygwin/release/3.5.1 +++ b/winsup/cygwin/release/3.5.1 @@ -16,3 +16,5 @@ Fixes: - Fix handle leak in pty master which occurs when non-cygwin process is started in pty. Addresses: https://github.com/msys2/msys2-runtime/issues/198 + +- Fix the problem that VMIN and VTIME does not work at all in console. |