mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-01 08:48:49 +00:00
Kernel: Add support for the MSG_WAITALL sys$recvmsg flag
This commit is contained in:
parent
5514d60d8d
commit
e521ffd156
Notes:
sideshowbarker
2024-07-17 23:10:44 +09:00
Author: https://github.com/IdanHo
Commit: e521ffd156
Pull-request: https://github.com/SerenityOS/serenity/pull/11152
Reviewed-by: https://github.com/awesomekling
3 changed files with 22 additions and 10 deletions
|
@ -391,15 +391,26 @@ ErrorOr<size_t> IPv4Socket::recvfrom(OpenFileDescription& description, UserOrKer
|
|||
|
||||
dbgln_if(IPV4_SOCKET_DEBUG, "recvfrom: type={}, local_port={}", type(), local_port());
|
||||
|
||||
ErrorOr<size_t> nreceived = 0;
|
||||
if (buffer_mode() == BufferMode::Bytes)
|
||||
nreceived = receive_byte_buffered(description, buffer, buffer_length, flags, user_addr, user_addr_length);
|
||||
else
|
||||
nreceived = receive_packet_buffered(description, buffer, buffer_length, flags, user_addr, user_addr_length, packet_timestamp);
|
||||
ErrorOr<size_t> total_nreceived = 0;
|
||||
do {
|
||||
auto offset_buffer = buffer.offset(total_nreceived.value());
|
||||
auto offset_buffer_length = buffer_length - total_nreceived.value();
|
||||
|
||||
if (!nreceived.is_error())
|
||||
Thread::current()->did_ipv4_socket_read(nreceived.value());
|
||||
return nreceived;
|
||||
ErrorOr<size_t> nreceived = 0;
|
||||
if (buffer_mode() == BufferMode::Bytes)
|
||||
nreceived = receive_byte_buffered(description, offset_buffer, offset_buffer_length, flags, user_addr, user_addr_length);
|
||||
else
|
||||
nreceived = receive_packet_buffered(description, offset_buffer, offset_buffer_length, flags, user_addr, user_addr_length, packet_timestamp);
|
||||
|
||||
if (nreceived.is_error())
|
||||
total_nreceived = nreceived;
|
||||
else
|
||||
total_nreceived.value() += nreceived.value();
|
||||
} while ((flags & MSG_WAITALL) && !total_nreceived.is_error() && total_nreceived.value() < buffer_length);
|
||||
|
||||
if (!total_nreceived.is_error())
|
||||
Thread::current()->did_ipv4_socket_read(total_nreceived.value());
|
||||
return total_nreceived;
|
||||
}
|
||||
|
||||
bool IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port, ReadonlyBytes packet, const Time& packet_timestamp)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue