OSDN Git Service

* fhandler_tty.cc (fhandler_pty_slave::ioctl): Drop FIONBIO case.
authorcorinna <corinna>
Fri, 22 Jul 2011 18:50:41 +0000 (18:50 +0000)
committercorinna <corinna>
Fri, 22 Jul 2011 18:50:41 +0000 (18:50 +0000)
Handle FIONREAD.
(fhandler_pty_master::ioctl): Ditto.  Call fhandler_base::ioctl to
decode default condition.
* fhandler_console.cc (fhandler_console::ioctl): Handle FIONREAD.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_console.cc
winsup/cygwin/fhandler_tty.cc

index 86848cf..64e90be 100644 (file)
@@ -1,3 +1,11 @@
+2011-07-22  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler_tty.cc (fhandler_pty_slave::ioctl): Drop FIONBIO case.
+       Handle FIONREAD.
+       (fhandler_pty_master::ioctl): Ditto.  Call fhandler_base::ioctl to
+       decode default condition.
+       * fhandler_console.cc (fhandler_console::ioctl): Handle FIONREAD.
+
 2011-07-21  Christopher Faylor  <me.cygwin2011@cgf.cx>
            Corinna Vinschen  <corinna@vinschen.de>
 
index bf42218..4d28102 100644 (file)
@@ -32,6 +32,7 @@ details. */
 #include "cygtls.h"
 #include "tls_pbuf.h"
 #include "registry.h"
+#include <asm/socket.h>
 
 /* Don't make this bigger than NT_MAX_PATH as long as the temporary buffer
    is allocated using tmp_pathbuf!!! */
@@ -887,11 +888,20 @@ fhandler_console::ioctl (unsigned int cmd, void *buf)
            *(unsigned char *) buf = (unsigned char) dev_state.nModifiers;
            return 0;
          }
-       else
-         {
-           set_errno (EINVAL);
-           return -1;
-         }
+       set_errno (EINVAL);
+       return -1;
+      case FIONREAD:
+       {
+         DWORD n;
+         if (!GetNumberOfConsoleInputEvents (get_io_handle (), &n))
+           {
+             __seterrno ();
+             return -1;
+           }
+         *(int *) buf = (int) n;
+         return 0;
+       }
+       break;
     }
 
   return fhandler_base::ioctl (cmd, buf);
index 2a398c9..1d8d862 100644 (file)
@@ -24,6 +24,7 @@ details. */
 #include "shared_info.h"
 #include "cygthread.h"
 #include "child_info.h"
+#include <asm/socket.h>
 
 #define close_maybe(h) \
   do { \
@@ -960,10 +961,6 @@ fhandler_pty_slave::ioctl (unsigned int cmd, void *arg)
     case TIOCGWINSZ:
     case TIOCSWINSZ:
       break;
-    case FIONBIO:
-      set_nonblocking (*(int *) arg);
-      retval = 0;
-      goto out;
     case TIOCGPGRP:
       {
        pid_t pid = this->tcgetpgrp ();
@@ -979,6 +976,21 @@ fhandler_pty_slave::ioctl (unsigned int cmd, void *arg)
     case TIOCSPGRP:
       retval = this->tcsetpgrp ((pid_t) arg);
       goto out;
+    case FIONREAD:
+      {
+       int n;
+       if (!PeekNamedPipe (get_handle (), NULL, 0, NULL, (DWORD *) &n, NULL))
+         {
+           __seterrno ();
+           retval = -1;
+         }
+       else
+         {
+           *(int *) arg = n;
+           retval = 0;
+         }
+      }
+      goto out;
     default:
       return fhandler_base::ioctl (cmd, arg);
     }
@@ -1364,12 +1376,19 @@ fhandler_pty_master::ioctl (unsigned int cmd, void *arg)
       break;
     case TIOCSPGRP:
       return this->tcsetpgrp ((pid_t) arg);
-    case FIONBIO:
-      set_nonblocking (*(int *) arg);
+    case FIONREAD:
+      {
+       int n;
+       if (!PeekNamedPipe (to_master, NULL, 0, NULL, (DWORD *) &n, NULL))
+         {
+           __seterrno ();
+           return -1;
+         }
+       *(int *) arg = n;
+      }
       break;
     default:
-      set_errno (EINVAL);
-      return -1;
+      return fhandler_base::ioctl (cmd, arg);
     }
   return 0;
 }