[newlib-cygwin] Cygwin: console: Make VMIN and VTIME work.
Takashi Yano
tyan0@sourceware.org
Tue Feb 13 14:38:10 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=ac92c4c9f564eda3158c1c0742c0939e6152f769
commit ac92c4c9f564eda3158c1c0742c0939e6152f769
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date: Tue Feb 13 11:42:42 2024 +0900
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>
Diff:
---
winsup/cygwin/fhandler/console.cc | 26 ++++++++++++++++++--------
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 1c8d383cd..b0907eb31 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 715fcf74d..e041f98f3 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.
More information about the Cygwin-cvs
mailing list