From 4c4b8ea443bceb14e041e6d4e6b6a56988aad0c7 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Tue, 10 Aug 2021 21:03:36 +0200 Subject: [PATCH] Kernel: Properly handle non-blocking I/O on pipes Previously, non-blocking read operations on pipes returned EOF instead of EAGAIN and non-blocking write operations blocked. This fixes pkgsrc's bmake "eof on job pipe!" error message when running in non-compatibility mode. --- Kernel/FileSystem/FIFO.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Kernel/FileSystem/FIFO.cpp b/Kernel/FileSystem/FIFO.cpp index 95da205a4e..27c272eb45 100644 --- a/Kernel/FileSystem/FIFO.cpp +++ b/Kernel/FileSystem/FIFO.cpp @@ -131,19 +131,25 @@ bool FIFO::can_write(const FileDescription&, size_t) const return m_buffer->space_for_writing() || !m_readers; } -KResultOr FIFO::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size) +KResultOr FIFO::read(FileDescription& fd, u64, UserOrKernelBuffer& buffer, size_t size) { - if (!m_writers && m_buffer->is_empty()) - return 0; + if (m_buffer->is_empty()) { + if (!m_writers) + return 0; + if (m_writers && !fd.is_blocking()) + return EAGAIN; + } return m_buffer->read(buffer, size); } -KResultOr FIFO::write(FileDescription&, u64, const UserOrKernelBuffer& buffer, size_t size) +KResultOr FIFO::write(FileDescription& fd, u64, const UserOrKernelBuffer& buffer, size_t size) { if (!m_readers) { Thread::current()->send_signal(SIGPIPE, Process::current()); return EPIPE; } + if (!fd.is_blocking() && m_buffer->space_for_writing() == 0) + return EAGAIN; return m_buffer->write(buffer, size); }