Kernel/LibC: Implement FIONREAD for tcp and udp sockets

This commit is contained in:
Bananymous 2025-08-08 01:14:11 +03:00
parent 009b073892
commit 5b587d199e
5 changed files with 40 additions and 1 deletions

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <BAN/HashMap.h>
#include <BAN/Endianness.h> #include <BAN/Endianness.h>
#include <BAN/Queue.h> #include <BAN/Queue.h>
#include <kernel/Lock/Mutex.h> #include <kernel/Lock/Mutex.h>
@ -63,6 +64,8 @@ namespace Kernel
virtual BAN::ErrorOr<size_t> recvfrom_impl(BAN::ByteSpan, sockaddr*, socklen_t*) override; virtual BAN::ErrorOr<size_t> recvfrom_impl(BAN::ByteSpan, sockaddr*, socklen_t*) override;
virtual BAN::ErrorOr<void> getpeername_impl(sockaddr*, socklen_t*) override; virtual BAN::ErrorOr<void> getpeername_impl(sockaddr*, socklen_t*) override;
virtual BAN::ErrorOr<long> ioctl_impl(int, void*) override;
virtual void receive_packet(BAN::ConstByteSpan, const sockaddr* sender, socklen_t sender_len) override; virtual void receive_packet(BAN::ConstByteSpan, const sockaddr* sender, socklen_t sender_len) override;
virtual bool can_read_impl() const override; virtual bool can_read_impl() const override;

View File

@ -38,6 +38,8 @@ namespace Kernel
virtual BAN::ErrorOr<size_t> recvfrom_impl(BAN::ByteSpan buffer, sockaddr* address, socklen_t* address_len) override; virtual BAN::ErrorOr<size_t> recvfrom_impl(BAN::ByteSpan buffer, sockaddr* address, socklen_t* address_len) override;
virtual BAN::ErrorOr<void> getpeername_impl(sockaddr*, socklen_t*) override { return BAN::Error::from_errno(ENOTCONN); } virtual BAN::ErrorOr<void> getpeername_impl(sockaddr*, socklen_t*) override { return BAN::Error::from_errno(ENOTCONN); }
virtual BAN::ErrorOr<long> ioctl_impl(int, void*) override;
virtual bool can_read_impl() const override { return !m_packets.empty(); } virtual bool can_read_impl() const override { return !m_packets.empty(); }
virtual bool can_write_impl() const override { return true; } virtual bool can_write_impl() const override { return true; }
virtual bool has_error_impl() const override { return false; } virtual bool has_error_impl() const override { return false; }

View File

@ -8,6 +8,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <sys/ioctl.h>
namespace Kernel namespace Kernel
{ {
@ -255,6 +256,18 @@ namespace Kernel
return {}; return {};
} }
BAN::ErrorOr<long> TCPSocket::ioctl_impl(int request, void* argument)
{
switch (request)
{
case FIONREAD:
*static_cast<int*>(argument) = m_recv_window.data_size;
return 0;
}
return NetworkSocket::ioctl_impl(request, argument);
}
bool TCPSocket::can_read_impl() const bool TCPSocket::can_read_impl() const
{ {
if (m_has_connected && !m_has_sent_zero && m_state != State::Established && m_state != State::Listen) if (m_has_connected && !m_has_sent_zero && m_state != State::Established && m_state != State::Listen)

View File

@ -4,6 +4,7 @@
#include <kernel/Thread.h> #include <kernel/Thread.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <sys/ioctl.h>
namespace Kernel namespace Kernel
{ {
@ -138,4 +139,22 @@ namespace Kernel
return TRY(m_network_layer.sendto(*this, message, address, address_len)); return TRY(m_network_layer.sendto(*this, message, address, address_len));
} }
BAN::ErrorOr<long> UDPSocket::ioctl_impl(int request, void* argument)
{
switch (request)
{
case FIONREAD:
{
SpinLockGuard guard(m_packet_lock);
if (m_packets.empty())
*static_cast<int*>(argument) = 0;
else
*static_cast<int*>(argument) = m_packets.front().packet_size;
return 0;
}
}
return NetworkSocket::ioctl_impl(request, argument);
}
} }

View File

@ -37,6 +37,8 @@ __BEGIN_DECLS
#define KDLOADFONT 30 #define KDLOADFONT 30
#define FIONREAD 40 /* get number of input bytes available */
struct winsize struct winsize
{ {
unsigned short ws_row; unsigned short ws_row;