From 51f0bdff0e8c4f74cd91c4c5fc4e14f9cd95fc73 Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 19 Mar 2023 11:25:14 +0100 Subject: [PATCH] kernel+libc: Add O_NONBLOCK --- kernel/src/sys/file.cpp | 7 ++++++- kernel/src/sys/open.cpp | 2 +- kernel/src/thread/Thread.cpp | 5 +++++ kernel/src/thread/Thread.h | 1 + libc/include/bits/open-flags.h | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/kernel/src/sys/file.cpp b/kernel/src/sys/file.cpp index eda1c035..0e3f7f7b 100644 --- a/kernel/src/sys/file.cpp +++ b/kernel/src/sys/file.cpp @@ -21,7 +21,12 @@ Result sys_read(Registers*, SyscallArgs args) if (!descriptor.is_readable()) return err(EBADF); - while (descriptor.inode->blocking()) { kernel_sleep(10); } + while (descriptor.inode->blocking()) + { + if (descriptor.should_block()) kernel_sleep(10); + else + return err(EAGAIN); + } usize nread = TRY(descriptor.inode->read(buf, descriptor.offset, size)); diff --git a/kernel/src/sys/open.cpp b/kernel/src/sys/open.cpp index 204c1699..5aaaf1cf 100644 --- a/kernel/src/sys/open.cpp +++ b/kernel/src/sys/open.cpp @@ -7,7 +7,7 @@ #include // These flags are needed after open(), the rest only affect open(). -constexpr int FLAGS_TO_KEEP = O_RDWR | O_APPEND; +constexpr int FLAGS_TO_KEEP = O_RDWR | O_APPEND | O_NONBLOCK; Result sys_open(Registers*, SyscallArgs args) { diff --git a/kernel/src/thread/Thread.cpp b/kernel/src/thread/Thread.cpp index f2992adc..8a44df98 100644 --- a/kernel/src/thread/Thread.cpp +++ b/kernel/src/thread/Thread.cpp @@ -50,6 +50,11 @@ bool FileDescriptor::should_append() return flags & O_APPEND; } +bool FileDescriptor::should_block() +{ + return flags & O_NONBLOCK; +} + bool FileDescriptor::is_readable() { return flags & O_RDONLY; diff --git a/kernel/src/thread/Thread.h b/kernel/src/thread/Thread.h index a731f243..89f81710 100644 --- a/kernel/src/thread/Thread.h +++ b/kernel/src/thread/Thread.h @@ -29,6 +29,7 @@ struct FileDescriptor int flags { 0 }; bool should_append(); + bool should_block(); bool is_writable(); bool is_readable(); }; diff --git a/libc/include/bits/open-flags.h b/libc/include/bits/open-flags.h index bfdfda2a..e51b0547 100644 --- a/libc/include/bits/open-flags.h +++ b/libc/include/bits/open-flags.h @@ -10,5 +10,6 @@ #define O_CREAT 8 #define O_EXCL 16 #define O_TRUNC 32 +#define O_NONBLOCK 64 #endif