From 8927167d28351a3b837f5fd7048b9102435fb436 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Thu, 5 Apr 2007 16:16:51 +0000 Subject: [PATCH] support MSG_WAITALL in TCP git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20584 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 56e611affd..f69ad1ed24 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -505,14 +505,19 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) && (fFlags & FLAG_NO_RECEIVE) == 0) { locker.Unlock(); + // Open Group Base Specification states that when + // MSG_WAITALL is set then the function should + // block until the full amount of data can be returned. + status_t status = acquire_sem_etc(fReceiveLock, 1, - B_ABSOLUTE_TIMEOUT | B_CAN_INTERRUPT, timeout); + ((flags & MSG_WAITALL) ? 0 : B_ABSOLUTE_TIMEOUT) + | B_CAN_INTERRUPT, timeout); locker.Lock(); if (status < B_OK) { // TODO: If we are timing out, should we push the - // available data? + // available data to the user? if (status == B_TIMED_OUT && fReceiveQueue.Available() > 0) break; return status;