diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 86848cff6..64e90be7b 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2011-07-22 Corinna Vinschen + + * 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 Corinna Vinschen diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index bf42218f4..4d2810203 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -32,6 +32,7 @@ details. */ #include "cygtls.h" #include "tls_pbuf.h" #include "registry.h" +#include /* 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); diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 2a398c9d5..1d8d862ca 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -24,6 +24,7 @@ details. */ #include "shared_info.h" #include "cygthread.h" #include "child_info.h" +#include #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; }