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) {