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>
This commit is contained in:
Takashi Yano 2024-02-13 11:42:42 +09:00
parent 8e24d162f4
commit ac92c4c9f5
2 changed files with 20 additions and 8 deletions

View File

@ -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)
{
while (con.cons_rapoi && *con.cons_rapoi && buflen > copied_chars)
buf[copied_chars++] = *con.cons_rapoi++;
buflen --;
}
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;

View File

@ -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.