aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2024-02-13 11:42:42 +0900
committerTakashi Yano <takashi.yano@nifty.ne.jp>2024-02-13 23:36:43 +0900
commit02f7f6543abc35a25fd024d8a58f374a86633846 (patch)
treefed01a568695f6747f4c4fea171d3fa3ebf54de3
parent73cd80c976e1bc4af5f63c02be94a112dd2cfecc (diff)
downloadnewlib-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.cc26
-rw-r--r--winsup/cygwin/release/3.5.12
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.