Looks like we haven't updated `MSYS2-packages`' `msys2-runtime-3.4` directory in quite a while. This roll-up integrates: - https://github.com/msys2/msys2-runtime/pull/192 - https://github.com/msys2/msys2-runtime/pull/205 - https://github.com/msys2/msys2-runtime/pull/209 - https://github.com/msys2/msys2-runtime/pull/210 - https://github.com/msys2/msys2-runtime/pull/220 Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
75 lines
2.4 KiB
Diff
75 lines
2.4 KiB
Diff
From b3295b576d7662daf6e2c14761f50c5e05a21209 Mon Sep 17 00:00:00 2001
|
|
From: Takashi Yano <takashi.yano@nifty.ne.jp>
|
|
Date: Tue, 13 Feb 2024 11:42:42 +0900
|
|
Subject: [PATCH 59/N] Cygwin: console: Make VMIN and VTIME work.
|
|
|
|
Previously, VMIN and VTIME did not work at all. This patch fixes that.
|
|
|
|
Backported-from: 73cd80c976 (Cygwin: pty: Fix potential handle leak regarding CallNamedPipe()., 2024-02-13)
|
|
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
|
|
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
|
---
|
|
winsup/cygwin/fhandler/console.cc | 26 ++++++++++++++++++--------
|
|
1 file changed, 18 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
|
|
index b415a0a..f9a6946 100644
|
|
--- a/winsup/cygwin/fhandler/console.cc
|
|
+++ b/winsup/cygwin/fhandler/console.cc
|
|
@@ -1011,10 +1011,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;
|
|
@@ -1037,6 +1041,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;
|
|
@@ -1082,19 +1091,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;
|