From aec5a09cafb63cedfbe595674aaa7ff59187bbe1 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 3 Jun 2024 03:36:25 +0300 Subject: [PATCH] Kernel/LibC: Implement SYS_ISATTY and isatty() --- kernel/include/kernel/Process.h | 2 ++ kernel/kernel/Process.cpp | 9 +++++++++ libc/include/sys/syscall.h | 1 + libc/unistd.cpp | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index ac010ed3..84bc6b96 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -162,6 +162,8 @@ namespace Kernel BAN::ErrorOr sys_smo_delete(SharedMemoryObjectManager::Key); BAN::ErrorOr sys_smo_map(SharedMemoryObjectManager::Key); + BAN::ErrorOr sys_isatty(int fildes); + BAN::ErrorOr sys_tty_ctrl(int fildes, int command, int flags); BAN::ErrorOr sys_signal(int, void (*)(int)); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index abc02a7d..ac737e58 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1433,6 +1433,15 @@ namespace Kernel return m_mapped_regions.back()->vaddr(); } + BAN::ErrorOr Process::sys_isatty(int fildes) + { + LockGuard _(m_process_lock); + auto inode = TRY(m_open_file_descriptors.inode_of(fildes)); + if (!inode->is_tty()) + return BAN::Error::from_errno(ENOTTY); + return 0; + } + BAN::ErrorOr Process::sys_tty_ctrl(int fildes, int command, int flags) { LockGuard _(m_process_lock); diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h index 429e4351..a720c1a8 100644 --- a/libc/include/sys/syscall.h +++ b/libc/include/sys/syscall.h @@ -77,6 +77,7 @@ __BEGIN_DECLS O(SYS_SMO_CREATE, smo_create) \ O(SYS_SMO_DELETE, smo_delete) \ O(SYS_SMO_MAP, smo_map) \ + O(SYS_ISATTY, isatty) \ enum Syscall { diff --git a/libc/unistd.cpp b/libc/unistd.cpp index 3ad3e91b..e7405bc9 100644 --- a/libc/unistd.cpp +++ b/libc/unistd.cpp @@ -114,6 +114,11 @@ int dup2(int fildes, int fildes2) return syscall(SYS_DUP2, fildes, fildes2); } +int isatty(int fildes) +{ + return syscall(SYS_ISATTY, fildes) >= 0; +} + int execl(const char* pathname, const char* arg0, ...) { if (arg0 == nullptr)