LibCore: Accept ReadonlyBytes/Bytes in System::send/recv

Instead of passing in a pointer+size, let's use safer AK types.
This commit is contained in:
Timothy Flynn 2025-12-01 06:48:10 -05:00 committed by Tim Flynn
parent e9519b132f
commit 85fd4d5ea1
Notes: github-actions[bot] 2025-12-01 13:56:47 +00:00
6 changed files with 23 additions and 29 deletions

View file

@ -126,7 +126,7 @@ ErrorOr<Bytes> PosixSocketHelper::read(Bytes buffer, int flags)
return Error::from_errno(ENOTCONN);
}
ssize_t nread = TRY(System::recv(m_fd, buffer.data(), buffer.size(), flags));
ssize_t nread = TRY(System::recv(m_fd, buffer, flags));
if (nread == 0)
did_reach_eof_on_read();
@ -150,7 +150,7 @@ ErrorOr<size_t> PosixSocketHelper::write(ReadonlyBytes buffer, int flags)
return Error::from_errno(ENOTCONN);
}
return TRY(System::send(m_fd, buffer.data(), buffer.size(), flags));
return TRY(System::send(m_fd, buffer, flags));
}
void PosixSocketHelper::close()

View file

@ -557,9 +557,9 @@ ErrorOr<void> connect(int sockfd, struct sockaddr const* address, socklen_t addr
return {};
}
ErrorOr<ssize_t> send(int sockfd, void const* buffer, size_t buffer_length, int flags)
ErrorOr<ssize_t> send(int sockfd, ReadonlyBytes data, int flags)
{
auto sent = ::send(sockfd, buffer, buffer_length, flags);
auto sent = ::send(sockfd, data.data(), data.size(), flags);
if (sent < 0)
return Error::from_syscall("send"sv, errno);
return sent;
@ -573,17 +573,17 @@ ErrorOr<ssize_t> sendmsg(int sockfd, const struct msghdr* message, int flags)
return sent;
}
ErrorOr<ssize_t> sendto(int sockfd, void const* source, size_t source_length, int flags, struct sockaddr const* destination, socklen_t destination_length)
ErrorOr<ssize_t> sendto(int sockfd, ReadonlyBytes data, int flags, struct sockaddr const* destination, socklen_t destination_length)
{
auto sent = ::sendto(sockfd, source, source_length, flags, destination, destination_length);
auto sent = ::sendto(sockfd, data.data(), data.size(), flags, destination, destination_length);
if (sent < 0)
return Error::from_syscall("sendto"sv, errno);
return sent;
}
ErrorOr<ssize_t> recv(int sockfd, void* buffer, size_t length, int flags)
ErrorOr<ssize_t> recv(int sockfd, Bytes buffer, int flags)
{
auto received = ::recv(sockfd, buffer, length, flags);
auto received = ::recv(sockfd, buffer.data(), buffer.size(), flags);
if (received < 0)
return Error::from_syscall("recv"sv, errno);
return received;
@ -597,9 +597,9 @@ ErrorOr<ssize_t> recvmsg(int sockfd, struct msghdr* message, int flags)
return received;
}
ErrorOr<ssize_t> recvfrom(int sockfd, void* buffer, size_t buffer_length, int flags, struct sockaddr* address, socklen_t* address_length)
ErrorOr<ssize_t> recvfrom(int sockfd, Bytes buffer, int flags, struct sockaddr* address, socklen_t* address_length)
{
auto received = ::recvfrom(sockfd, buffer, buffer_length, flags, address, address_length);
auto received = ::recvfrom(sockfd, buffer.data(), buffer.size(), flags, address, address_length);
if (received < 0)
return Error::from_syscall("recvfrom"sv, errno);
return received;

View file

@ -117,12 +117,12 @@ ErrorOr<void> bind(int sockfd, struct sockaddr const*, socklen_t);
ErrorOr<void> listen(int sockfd, int backlog);
ErrorOr<int> accept(int sockfd, struct sockaddr*, socklen_t*);
ErrorOr<void> connect(int sockfd, struct sockaddr const*, socklen_t);
ErrorOr<ssize_t> send(int sockfd, void const*, size_t, int flags);
ErrorOr<ssize_t> send(int sockfd, ReadonlyBytes, int flags);
ErrorOr<ssize_t> sendmsg(int sockfd, const struct msghdr*, int flags);
ErrorOr<ssize_t> sendto(int sockfd, void const*, size_t, int flags, struct sockaddr const*, socklen_t);
ErrorOr<ssize_t> recv(int sockfd, void*, size_t, int flags);
ErrorOr<ssize_t> sendto(int sockfd, ReadonlyBytes, int flags, struct sockaddr const*, socklen_t);
ErrorOr<ssize_t> recv(int sockfd, Bytes, int flags);
ErrorOr<ssize_t> recvmsg(int sockfd, struct msghdr*, int flags);
ErrorOr<ssize_t> recvfrom(int sockfd, void*, size_t, int flags, struct sockaddr*, socklen_t*);
ErrorOr<ssize_t> recvfrom(int sockfd, Bytes, int flags, struct sockaddr*, socklen_t*);
ErrorOr<void> getsockopt(int sockfd, int level, int option, void* value, socklen_t* value_size);
ErrorOr<void> setsockopt(int sockfd, int level, int option, void const* value, socklen_t value_size);
ErrorOr<void> getsockname(int sockfd, struct sockaddr*, socklen_t*);

View file

@ -254,17 +254,17 @@ ErrorOr<int> accept(int sockfd, struct sockaddr* addr, socklen_t* addr_size)
return fd;
}
ErrorOr<ssize_t> sendto(int sockfd, void const* source, size_t source_length, int flags, struct sockaddr const* destination, socklen_t destination_length)
ErrorOr<ssize_t> sendto(int sockfd, ReadonlyBytes data, int flags, struct sockaddr const* destination, socklen_t destination_length)
{
auto sent = ::sendto(sockfd, static_cast<char const*>(source), source_length, flags, destination, destination_length);
auto sent = ::sendto(sockfd, reinterpret_cast<char const*>(data.data()), static_cast<int>(data.size()), flags, destination, destination_length);
if (sent == SOCKET_ERROR)
return Error::from_windows_error();
return sent;
}
ErrorOr<ssize_t> recvfrom(int sockfd, void* buffer, size_t buffer_length, int flags, struct sockaddr* address, socklen_t* address_length)
ErrorOr<ssize_t> recvfrom(int sockfd, Bytes buffer, int flags, struct sockaddr* address, socklen_t* address_length)
{
auto received = ::recvfrom(sockfd, static_cast<char*>(buffer), buffer_length, flags, address, address_length);
auto received = ::recvfrom(sockfd, reinterpret_cast<char*>(buffer.data()), static_cast<int>(buffer.size()), flags, address, address_length);
if (received == SOCKET_ERROR)
return Error::from_windows_error();
return received;

View file

@ -66,7 +66,7 @@ ErrorOr<ByteBuffer> UDPServer::receive(size_t size, sockaddr_in& in)
{
auto buf = TRY(ByteBuffer::create_uninitialized(size));
socklen_t in_len = sizeof(in);
auto bytes_received = TRY(Core::System::recvfrom(m_fd, buf.data(), size, 0, (sockaddr*)&in, &in_len));
auto bytes_received = TRY(Core::System::recvfrom(m_fd, buf, 0, (sockaddr*)&in, &in_len));
buf.resize(bytes_received);
return buf;
}
@ -105,16 +105,10 @@ Optional<u16> UDPServer::local_port() const
ErrorOr<size_t> UDPServer::send(ReadonlyBytes buffer, sockaddr_in const& to)
{
if (m_fd < 0) {
if (m_fd < 0)
return Error::from_errno(EBADF);
}
auto result = ::sendto(m_fd, buffer.data(), buffer.size(), 0, (sockaddr const*)&to, sizeof(to));
if (result < 0) {
return Error::from_errno(errno);
}
return result;
return System::sendto(m_fd, buffer, 0, (sockaddr const*)&to, sizeof(to));
}
}

View file

@ -56,7 +56,7 @@ ErrorOr<ByteBuffer> UDPServer::receive(size_t size, sockaddr_in& in)
{
auto buf = TRY(ByteBuffer::create_uninitialized(size));
socklen_t in_len = sizeof(in);
auto bytes_received = TRY(Core::System::recvfrom(m_fd, buf.data(), size, 0, (sockaddr*)&in, &in_len));
auto bytes_received = TRY(Core::System::recvfrom(m_fd, buf, 0, (sockaddr*)&in, &in_len));
buf.resize(bytes_received);
return buf;
}
@ -70,7 +70,7 @@ ErrorOr<ByteBuffer> UDPServer::receive(size_t size)
ErrorOr<size_t> UDPServer::send(ReadonlyBytes buffer, sockaddr_in const& to)
{
socklen_t to_len = sizeof(to);
return TRY(Core::System::sendto(m_fd, buffer.data(), buffer.size(), 0, (sockaddr const*)&to, to_len));
return TRY(Core::System::sendto(m_fd, buffer, 0, (sockaddr const*)&to, to_len));
}
Optional<IPv4Address> UDPServer::local_address() const