From baaa0348a9627634699c34af6f285cdf910c6958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 26 Mar 2010 19:47:23 +0000 Subject: [PATCH] Implemented ioctl(FIONREAD) on tty devices. Untested. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35960 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/tty/tty.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/add-ons/kernel/drivers/tty/tty.cpp b/src/add-ons/kernel/drivers/tty/tty.cpp index ed6eebd9c0..5c4b6dd05c 100644 --- a/src/add-ons/kernel/drivers/tty/tty.cpp +++ b/src/add-ons/kernel/drivers/tty/tty.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -1739,6 +1740,26 @@ tty_ioctl(tty_cookie* cookie, uint32 op, void* buffer, size_t length) return B_OK; } + case FIONREAD: + { + int toRead = 0; + + // release the mutex and grab a read lock + locker.Unlock(); + ReaderLocker readLocker(cookie); + + status_t status = readLocker.AcquireReader(0, 1); + if (status >= B_OK) + toRead = readLocker.AvailableBytes(); + else if(status != B_WOULD_BLOCK) + return status; + + if (user_memcpy(buffer, &toRead, sizeof(int)) != B_OK) + return B_BAD_ADDRESS; + + return B_OK; + } + case TCWAITEVENT: // BeOS (uint*) // wait for event (timeout if !NULL) case TCVTIME: // BeOS (bigtime_t*) set highrez VTIME