From aaff5a65e1f7af1291b8395f3b6ab747f90e76a5 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 17 Nov 2024 22:38:52 +0200 Subject: [PATCH] Kernel/init: /dev/tty is now custom symlink to controlling terminal kernel now passes the name of default console to init process so init knows which file to open as stdio. before /dev/tty was referencing the system wide current terminal which was inherited from cmdline. This doesn't work anymore as we have pseudo terminals implemented that can chage the current terminal during runtime :D --- kernel/include/kernel/Process.h | 2 +- kernel/kernel/Terminal/TTY.cpp | 52 +++++++++++++++++++++++--------- kernel/kernel/kernel.cpp | 4 +++ userspace/programs/init/main.cpp | 31 +++++-------------- 4 files changed, 51 insertions(+), 38 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 3b359453..406561ae 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -185,7 +185,7 @@ namespace Kernel BAN::ErrorOr sys_load_keymap(const char* path); - TTY& tty() { ASSERT(m_controlling_terminal); return *m_controlling_terminal; } + BAN::RefPtr controlling_terminal() { return m_controlling_terminal; } static Process& current() { return Thread::current().process(); } diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index aecd9a0f..e8c26f25 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -20,6 +20,42 @@ namespace Kernel { + class DevTTY : public TmpInode + { + public: + static BAN::ErrorOr> create(mode_t mode, uid_t uid, gid_t gid) + { + return TRY(BAN::RefPtr::create(mode | Inode::Mode::IFLNK, uid, gid)); + } + + protected: + BAN::ErrorOr link_target_impl() override + { + auto terminal = Process::current().controlling_terminal(); + if (!terminal) + return BAN::Error::from_errno(ENODEV); + return TRY(BAN::String::formatted("/dev/{}", terminal->name())); + } + + bool can_read_impl() const override { return false; } + bool can_write_impl() const override { return false; } + bool has_error_impl() const override { return false; } + + private: + DevTTY(mode_t mode, uid_t uid, gid_t gid) + : TmpInode( + DevFileSystem::get(), + MUST(DevFileSystem::get().allocate_inode(create_inode_info(mode, uid, gid))), + create_inode_info(mode, uid, gid) + ) + { + ASSERT(this->mode().iflnk()); + } + + private: + friend class BAN::RefPtr; + }; + static BAN::RefPtr s_tty; static dev_t next_tty_rdev() @@ -51,20 +87,6 @@ namespace Kernel { s_tty = this; clear(); - - auto inode_or_error = DevFileSystem::get().root_inode()->find_inode("tty"_sv); - if (inode_or_error.is_error()) - { - if (inode_or_error.error().get_error_code() == ENOENT) - DevFileSystem::get().add_inode("tty"_sv, MUST(TmpSymlinkInode::create_new(DevFileSystem::get(), 0666, 0, 0, s_tty->name()))); - else - dwarnln("{}", inode_or_error.error()); - return; - } - - auto inode = inode_or_error.release_value(); - if (inode->mode().iflnk()) - MUST(static_cast(*inode.ptr()).set_link_target(name())); } BAN::ErrorOr TTY::tty_ctrl(int command, int flags) @@ -138,6 +160,8 @@ namespace Kernel auto* thread = MUST(Thread::create_kernel(&TTY::keyboard_task, nullptr, nullptr)); MUST(Processor::scheduler().add_thread(thread)); + DevFileSystem::get().add_inode("tty", MUST(DevTTY::create(0666, 0, 0))); + initialized = true; } diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 17be7857..0956cec1 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -255,6 +255,10 @@ static void init2(void*) TTY::initialize_devices(); MUST(Process::create_userspace({ 0, 0, 0, 0 }, "/usr/bin/init"_sv, {})); + + auto console_path = MUST(BAN::String::formatted("/dev/{}", cmdline.console)); + auto console_path_sv = console_path.sv(); + MUST(Process::create_userspace({ 0, 0, 0, 0 }, "/usr/bin/init"_sv, BAN::Span(&console_path_sv, 1))); } extern "C" void ap_main() diff --git a/userspace/programs/init/main.cpp b/userspace/programs/init/main.cpp index 983afbb4..7ddc530c 100644 --- a/userspace/programs/init/main.cpp +++ b/userspace/programs/init/main.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -11,18 +10,16 @@ #include #include -void initialize_stdio() +int main(int argc, char** argv) { - const char* tty = "/dev/tty"; - if (open(tty, O_RDONLY | O_TTY_INIT) != 0) _exit(1); - if (open(tty, O_WRONLY) != 1) _exit(1); - if (open(tty, O_WRONLY) != 2) _exit(1); - if (open("/dev/debug", O_WRONLY) != 3) _exit(1); -} + ASSERT(argc == 2); -int main() -{ - initialize_stdio(); + const char* tty_name = argv[1]; + + if (open(tty_name, O_RDONLY | O_TTY_INIT) != 0) _exit(1); + if (open(tty_name, O_WRONLY) != 1) _exit(1); + if (open(tty_name, O_WRONLY) != 2) _exit(1); + if (open("/dev/debug", O_WRONLY) != 3) _exit(1); if (signal(SIGINT, [](int) {}) == SIG_ERR) perror("signal"); @@ -80,18 +77,6 @@ int main() if (pwd == nullptr) continue; - if (chown("/dev/tty", pwd->pw_uid, pwd->pw_gid) == -1) - { - perror("chown"); - continue; - } - - if (chmod("/dev/tty", 0600) == -1) - { - perror("chmod"); - continue; - } - pid_t pid = fork(); if (pid == 0) {