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
commit a8864dc590
Notes: sideshowbarker 2024-07-19 14:00:46 +09:00
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();
}