From daad608a3a3d8ebf0adb4bf9b5a3ff4cfaa678e3 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Thu, 5 Apr 2007 16:23:04 +0000 Subject: [PATCH] Sigh, ignore previous commit, Open Group Specification is ambiguous. Now we properly support MSG_WAITALL. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20585 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index f69ad1ed24..1a4853360b 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -498,10 +498,14 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) // read data out of buffer // TODO: add support for urgent data (MSG_OOB) + size_t dataNeeded = socket->receive.low_water_mark; + if (flags & MSG_WAITALL) + dataNeeded = numBytes; + bigtime_t timeout = system_time() + socket->receive.timeout; while (fReceiveQueue.PushedData() == 0 - && fReceiveQueue.Available() < numBytes + && fReceiveQueue.Available() < dataNeeded && (fFlags & FLAG_NO_RECEIVE) == 0) { locker.Unlock(); @@ -510,8 +514,7 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) // block until the full amount of data can be returned. status_t status = acquire_sem_etc(fReceiveLock, 1, - ((flags & MSG_WAITALL) ? 0 : B_ABSOLUTE_TIMEOUT) - | B_CAN_INTERRUPT, timeout); + B_ABSOLUTE_TIMEOUT | B_CAN_INTERRUPT, timeout); locker.Lock();