From 49f7ea16756dd7f341edeecd2dee45083ab38945 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sat, 9 Nov 2002 03:17:40 +0000 Subject: [PATCH] * fhandler.h (class fhandler_pipe): New ioctl() method. * pipe.cc (fhandler_pipe::ioctl): New. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler.h | 1 + winsup/cygwin/pipe.cc | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 95735e1f0..e69c47880 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2002-11-06 Sergey Okhapkin + + * fhandler.h (class fhandler_pipe): New ioctl() method. + * pipe.cc (fhandler_pipe::ioctl): New. + 2002-11-07 Christopher Faylor * fhandler_serial.cc (fhandler_serial::ioctl): Fix typo. diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 273475110..0e4267013 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -459,6 +459,7 @@ class fhandler_pipe: public fhandler_base int close (); void create_guard (SECURITY_ATTRIBUTES *sa) {guard = CreateMutex (sa, FALSE, NULL);} int dup (fhandler_base *child); + int ioctl (unsigned int cmd, void *); void fixup_after_fork (HANDLE); bool hit_eof (); void set_eof () {broken_pipe = true;} diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc index b37a7751e..fe712e25e 100644 --- a/winsup/cygwin/pipe.cc +++ b/winsup/cygwin/pipe.cc @@ -13,6 +13,7 @@ details. */ #include "winsup.h" #include #include +#include #include "cygerrno.h" #include "security.h" #include "fhandler.h" @@ -179,6 +180,33 @@ make_pipe (int fildes[2], unsigned int psize, int mode) return res; } +int +fhandler_pipe::ioctl (unsigned int cmd, void *p) +{ + int n; + + switch (cmd) + { + case FIONREAD: + if (get_device () == FH_PIPEW) + { + set_errno (EINVAL); + return -1; + } + if (!PeekNamedPipe (get_handle (), NULL, 0, NULL, (DWORD *) &n, NULL)) + { + __seterrno (); + return -1; + } + break; + default: + return fhandler_base::ioctl (cmd, p); + break; + } + *(int *) p = n; + return 0; +} + extern "C" int pipe (int filedes[2]) {