1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:38:10 +00:00

Kernel: Report EAGAIN from read() on a non-blocking socket if the buffer is empty

This is not EOF, and never should have been so -- can trip up other code
when porting.

Also updates LibGUI and WindowServer which both relied on the old
behaviour (and didn't work without changes). There may be others, but I
didn't run into them with a quick inspection.
This commit is contained in:
Robin Burchell 2019-05-20 01:18:33 +02:00 committed by Andreas Kling
parent 40a5eb4e6e
commit a8864dc590
3 changed files with 20 additions and 11 deletions

View file

@ -153,10 +153,20 @@ bool LocalSocket::can_read(FileDescriptor& descriptor) const
ssize_t LocalSocket::read(FileDescriptor& descriptor, byte* buffer, ssize_t size)
{
auto role = descriptor.socket_role();
if (role == SocketRole::Accepted)
if (role == SocketRole::Accepted) {
if (!descriptor.is_blocking()) {
if (m_for_server.is_empty())
return -EAGAIN;
}
return m_for_server.read(buffer, size);
if (role == SocketRole::Connected)
}
if (role == SocketRole::Connected) {
if (!descriptor.is_blocking()) {
if (m_for_client.is_empty())
return -EAGAIN;
}
return m_for_client.read(buffer, size);
}
ASSERT_NOT_REACHED();
}