Kernel/LibC: Implement FIONREAD for tcp and udp sockets
This commit is contained in:
parent
009b073892
commit
5b587d199e
|
@ -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;
|
||||||
|
|
|
@ -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; }
|
||||||
|
@ -59,7 +61,7 @@ namespace Kernel
|
||||||
BAN::CircularQueue<PacketInfo, 32> m_packets;
|
BAN::CircularQueue<PacketInfo, 32> m_packets;
|
||||||
size_t m_packet_total_size { 0 };
|
size_t m_packet_total_size { 0 };
|
||||||
SpinLock m_packet_lock;
|
SpinLock m_packet_lock;
|
||||||
ThreadBlocker m_packet_thread_blocker;
|
ThreadBlocker m_packet_thread_blocker;
|
||||||
|
|
||||||
friend class BAN::RefPtr<UDPSocket>;
|
friend class BAN::RefPtr<UDPSocket>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue