diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-07-25 19:19:35 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-07-25 19:19:35 +0400 |
commit | f4fc0c59e371d4d726e10745101431214b6e3c73 (patch) | |
tree | 1471216171b0936822b85a7d02d4954e9feaf5b7 /winsup/cygwin/fhandler_console.cc | |
parent | 7d4b10de8152823167722a3738c9d7ea7f10ef6b (diff) |
* fhandler_console.cc (fhandler_console::ioctl): Fetch console events
using PeekConsoleInput and return only key down events in buf.
* fhandler_tty.cc (fhandler_pty_slave::ioctl): Always return EINVAL
if PeekNamedPipe fails.
(fhandler_pty_master::ioctl): Ditto.
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r-- | winsup/cygwin/fhandler_console.cc | 14 |
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; |