[PATCH] Cygwin: console: Fix ioctl() FIONREAD.

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] Cygwin: console: Fix ioctl() FIONREAD.

Takashi Yano
- ioctl() FIONREAD for console does not return correct value since
  commit cfb517f39a8bcf2d995a732d250563917600408a. This patch fixes
  the issue.
---
 winsup/cygwin/fhandler_console.cc | 37 +++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 7cb45b4a7..28cf00176 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -1280,10 +1280,39 @@ fhandler_console::ioctl (unsigned int cmd, void *arg)
       release_output_mutex ();
       return -1;
     }
-  while (n-- > 0)
-    if (inp[n].EventType == KEY_EVENT && inp[n].Event.KeyEvent.bKeyDown)
-      ++ret;
-  *(int *) arg = ret;
+  bool saw_eol = false;
+  for (DWORD i=0; i<n; i++)
+    if (inp[i].EventType == KEY_EVENT &&
+ inp[i].Event.KeyEvent.bKeyDown &&
+ inp[i].Event.KeyEvent.uChar.UnicodeChar)
+      {
+ WCHAR wc = inp[i].Event.KeyEvent.uChar.UnicodeChar;
+ char mbs[8];
+ int len = con.con_to_str (mbs, sizeof (mbs), wc);
+ if ((get_ttyp ()->ti.c_lflag & ICANON) &&
+    len == 1 && CCEQ (get_ttyp ()->ti.c_cc[VEOF], mbs[0]))
+  {
+    saw_eol = true;
+    break;
+  }
+ ret += len;
+ const char eols[] = {
+  '\n',
+  '\r',
+  (char) get_ttyp ()->ti.c_cc[VEOL],
+  (char) get_ttyp ()->ti.c_cc[VEOL2]
+ };
+ if ((get_ttyp ()->ti.c_lflag & ICANON) &&
+    len == 1 && memchr (eols, mbs[0], sizeof (eols)))
+  {
+    saw_eol = true;
+    break;
+  }
+      }
+  if ((get_ttyp ()->ti.c_lflag & ICANON) && !saw_eol)
+    *(int *) arg = 0;
+  else
+    *(int *) arg = ret;
   release_output_mutex ();
   return 0;
  }
--
2.21.0

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Cygwin: console: Fix ioctl() FIONREAD.

Corinna Vinschen-2
On Feb 18 13:05, Takashi Yano wrote:
> - ioctl() FIONREAD for console does not return correct value since
>   commit cfb517f39a8bcf2d995a732d250563917600408a. This patch fixes
>   the issue.
> ---
>  winsup/cygwin/fhandler_console.cc | 37 +++++++++++++++++++++++++++----
>  1 file changed, 33 insertions(+), 4 deletions(-)

Pushed.


Thanks,
Corinna

--
Corinna Vinschen
Cygwin Maintainer

signature.asc (849 bytes) Download Attachment