From b3b5981f7ab71e08746480cf6ac4f1465195b311 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 20 Aug 2022 12:18:54 -0300 Subject: [PATCH] isatty syscall --- src/arch/x86_64/syscall.asm | 4 +++- src/fs/vfs.c | 9 +++++++++ src/include/kernel/devman.h | 2 ++ src/include/kernel/vfs.h | 1 + src/sys/devman.c | 9 +++++++++ src/sys/syscalls/isatty.c | 38 +++++++++++++++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/sys/syscalls/isatty.c diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index db797d31..e44e6b06 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -9,7 +9,8 @@ extern syscall_open extern syscall_read extern syscall_lseek extern syscall_close -func_count equ 8 +extern syscall_isatty +func_count equ 9 func_table: @@ -21,6 +22,7 @@ func_table: dq syscall_read dq syscall_lseek dq syscall_close + dq syscall_isatty section .text global asm_syscall_entry diff --git a/src/fs/vfs.c b/src/fs/vfs.c index 133499a8..7b071863 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -78,6 +78,15 @@ int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset } +int vfs_isatty(vnode_t* node){ + + if(GETTYPE(node->st.st_mode) != TYPE_CHARDEV) + return ENOTTY; + + return devman_isatty(node->st.st_rdev); + +} + int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset){ int type = GETTYPE(node->st.st_mode); diff --git a/src/include/kernel/devman.h b/src/include/kernel/devman.h index 900f7ca2..e0ccfddf 100644 --- a/src/include/kernel/devman.h +++ b/src/include/kernel/devman.h @@ -7,11 +7,13 @@ typedef struct{ int (*read)(int* error, int minor, void* buff, size_t count, size_t offset); int (*write)(int* error, int minor, void* buff, size_t count, size_t offset); + int (*isatty)(int minor); } devcalls; int devman_read(int *error, int dev, void* buff, size_t count, size_t offset); int devman_write(int *error, int dev, void* buff, size_t count, size_t offset); int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls); +int devman_isatty(int dev); void devman_init(); #endif diff --git a/src/include/kernel/vfs.h b/src/include/kernel/vfs.h index 191231a8..c7212187 100644 --- a/src/include/kernel/vfs.h +++ b/src/include/kernel/vfs.h @@ -67,6 +67,7 @@ int vfs_mkdir(dirnode_t* ref, char* path, mode_t mode); int vfs_create(dirnode_t* ref, char* path, mode_t mode); int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset); int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset); +int vfs_isatty(vnode_t* node); void vfs_init(); dirnode_t* vfs_root(); diff --git a/src/sys/devman.c b/src/sys/devman.c index bc1fd766..e7c05459 100644 --- a/src/sys/devman.c +++ b/src/sys/devman.c @@ -47,6 +47,15 @@ int devman_read(int *error, int dev, void* buff, size_t count, size_t offset){ } +int devman_isatty(int dev){ + + if(major(dev) > highestmajor) + return ENOTTY; + + return majorcalls[major(dev)]->isatty(minor(dev)); + +} + void devman_init(){ devfs_init(); diff --git a/src/sys/syscalls/isatty.c b/src/sys/syscalls/isatty.c new file mode 100644 index 00000000..89bec527 --- /dev/null +++ b/src/sys/syscalls/isatty.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include + +syscallret syscall_isatty(int ifd){ + + syscallret retv; + retv.ret = -1; + + proc_t* proc = arch_getcls()->thread->proc; + + fd_t* fd = proc->fds + ifd; + + spinlock_acquire(&proc->fdlock); + + if(proc->fdcount <= ifd || fd->node == NULL){ + spinlock_release(&proc->fdlock); + retv.errno = EBADF; + return retv; + } + + spinlock_acquire(&fd->lock); + spinlock_release(&proc->fdlock); + + int ret = vfs_isatty(fd->node); + + retv.errno = ret; + + retv.ret = retv.errno == ENOTTY ? 0 : 1; + + spinlock_release(&fd->lock); + + return retv; + +}