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); }