From db076058b9e82e4efb2afc641911e0a60a5354b6 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 5 Apr 2023 01:10:25 +0300 Subject: [PATCH] Kernel: Process can now initialize stdio This allows the use of the fds STD{IN,OUT,ERR}_FILENO --- kernel/include/kernel/Process.h | 2 ++ kernel/kernel/Process.cpp | 14 ++++++++++++-- kernel/kernel/kernel.cpp | 8 +++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 3227da221..4762abb3d 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -27,6 +27,8 @@ namespace Kernel BAN::ErrorOr add_thread(entry_t, void*); void on_thread_exit(Thread&); + BAN::ErrorOr init_stdio(); + pid_t pid() const { return m_pid; } BAN::ErrorOr open(BAN::StringView, int); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index d3058aaf6..923722425 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -18,6 +18,16 @@ namespace Kernel return process; } + BAN::ErrorOr Process::init_stdio() + { + if (!m_open_files.empty()) + return BAN::Error::from_c_string("Could not init stdio, process already has open files"); + TRY(open("/dev/tty1", O_RDONLY)); // stdin + TRY(open("/dev/tty1", O_WRONLY)); // stdout + TRY(open("/dev/tty1", O_WRONLY)); // stderr + return {}; + } + BAN::ErrorOr Process::add_thread(entry_t entry, void* data) { Thread* thread = TRY(Thread::create(entry, data, this)); @@ -43,7 +53,7 @@ namespace Kernel BAN::ErrorOr Process::open(BAN::StringView path, int flags) { - if (flags != O_RDONLY) + if (flags & ~O_RDWR) return BAN::Error::from_errno(ENOTSUP); BAN::String absolute_path = TRY(absolute_path_of(path)); @@ -97,7 +107,7 @@ namespace Kernel auto open_fd_copy = open_file_description(fd); m_lock.unlock(); - if (!(open_fd_copy.flags & O_RDONLY)) + if (!(open_fd_copy.flags & O_WRONLY)) return BAN::Error::from_errno(EBADF); size_t n_written = TRY(open_fd_copy.inode->write(open_fd_copy.offset, buffer, count)); open_fd_copy.offset += n_written; diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 0fde0d7f4..8a85b73fd 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -22,6 +22,8 @@ #include #include +#include + extern "C" const char g_kernel_cmdline[]; struct ParsedCommandLine @@ -223,12 +225,12 @@ static void init2(void* terminal_driver) MUST(Process::create_kernel( [](void*) { - int fd = MUST(Process::current()->open("/dev/tty1", 1)); + MUST(Process::current()->init_stdio()); while (true) { char buffer[1024]; - int n_read = MUST(Process::current()->read(fd, buffer, sizeof(buffer))); - MUST(Process::current()->write(fd, buffer, n_read)); + int n_read = MUST(Process::current()->read(STDIN_FILENO, buffer, sizeof(buffer))); + MUST(Process::current()->write(STDOUT_FILENO, buffer, n_read)); dprintln("{} bytes", n_read); } }, nullptr