Kernel: Move {set,get}sockopt to sockets
Sockets can now actually implement socket options :D
This commit is contained in:
@@ -297,6 +297,34 @@ namespace Kernel
|
||||
return {};
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> TCPSocket::getsockopt_impl(int level, int option, void* value, socklen_t* value_len)
|
||||
{
|
||||
if (level != SOL_SOCKET)
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
|
||||
int result;
|
||||
switch (option)
|
||||
{
|
||||
case SO_ERROR:
|
||||
result = 0;
|
||||
break;
|
||||
case SO_SNDBUF:
|
||||
result = m_send_window.scaled_size();
|
||||
break;
|
||||
case SO_RCVBUF:
|
||||
result = m_recv_window.buffer->size();
|
||||
break;
|
||||
default:
|
||||
return BAN::Error::from_errno(ENOTSUP);
|
||||
}
|
||||
|
||||
const size_t len = BAN::Math::min<size_t>(sizeof(result), *value_len);
|
||||
memcpy(value, &result, len);
|
||||
*value_len = sizeof(int);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> TCPSocket::ioctl_impl(int request, void* argument)
|
||||
{
|
||||
switch (request)
|
||||
|
||||
@@ -213,6 +213,34 @@ namespace Kernel
|
||||
return TRY(m_network_layer.sendto(*this, buffer.span(), address, address_len));
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> UDPSocket::getsockopt_impl(int level, int option, void* value, socklen_t* value_len)
|
||||
{
|
||||
if (level != SOL_SOCKET)
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
|
||||
int result;
|
||||
switch (option)
|
||||
{
|
||||
case SO_ERROR:
|
||||
result = 0;
|
||||
break;
|
||||
case SO_SNDBUF:
|
||||
result = m_packet_buffer->size();
|
||||
break;
|
||||
case SO_RCVBUF:
|
||||
result = m_packet_buffer->size();
|
||||
break;
|
||||
default:
|
||||
return BAN::Error::from_errno(ENOTSUP);
|
||||
}
|
||||
|
||||
const size_t len = BAN::Math::min<size_t>(sizeof(result), *value_len);
|
||||
memcpy(value, &result, len);
|
||||
*value_len = sizeof(int);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> UDPSocket::ioctl_impl(int request, void* argument)
|
||||
{
|
||||
switch (request)
|
||||
|
||||
@@ -678,4 +678,33 @@ namespace Kernel
|
||||
return {};
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> UnixDomainSocket::getsockopt_impl(int level, int option, void* value, socklen_t* value_len)
|
||||
{
|
||||
if (level != SOL_SOCKET)
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
|
||||
int result;
|
||||
switch (option)
|
||||
{
|
||||
case SO_ERROR:
|
||||
result = 0;
|
||||
break;
|
||||
case SO_SNDBUF:
|
||||
result = m_packet_buffer->size();
|
||||
break;
|
||||
case SO_RCVBUF:
|
||||
result = m_packet_buffer->size();
|
||||
break;
|
||||
default:
|
||||
dwarnln("getsockopt(SOL_SOCKET, {})", option);
|
||||
return BAN::Error::from_errno(ENOTSUP);
|
||||
}
|
||||
|
||||
const size_t len = BAN::Math::min<size_t>(sizeof(result), *value_len);
|
||||
memcpy(value, &result, len);
|
||||
*value_len = sizeof(int);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user