summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_console.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r--winsup/cygwin/fhandler_console.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 4d2810203..5375721a1 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -892,13 +892,21 @@ fhandler_console::ioctl (unsigned int cmd, void *buf)
return -1;
case FIONREAD:
{
+ /* Per MSDN, max size of buffer required is below 64K. */
+#define INREC_SIZE (65536 / sizeof (INPUT_RECORD))
+
DWORD n;
- if (!GetNumberOfConsoleInputEvents (get_io_handle (), &n))
+ int ret = 0;
+ INPUT_RECORD inp[INREC_SIZE];
+ if (!PeekConsoleInputW (get_io_handle (), inp, INREC_SIZE, &n))
{
- __seterrno ();
+ set_errno (EINVAL);
return -1;
}
- *(int *) buf = (int) n;
+ while (n-- > 0)
+ if (inp[n].EventType == KEY_EVENT && inp[n].Event.KeyEvent.bKeyDown)
+ ++ret;
+ *(int *) buf = ret;
return 0;
}
break;