From 36d63eb96f05425eb86d66502a365dab2dbc7c9b Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 12 Oct 2022 19:04:21 -0300 Subject: [PATCH] syscalls: umask --- src/arch/x86_64/syscall.asm | 4 +++- src/include/kernel/sched.h | 1 + src/sys/sched/scheduler.c | 2 ++ src/sys/syscalls/fork.c | 1 + src/sys/syscalls/mkdir.c | 2 +- src/sys/syscalls/open.c | 2 +- src/sys/syscalls/umask.c | 17 +++++++++++++++++ 7 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/sys/syscalls/umask.c diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index 3e6ae5f8..987e91b8 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -28,7 +28,8 @@ extern syscall_fstatat extern syscall_pipe2 extern syscall_mkdir extern syscall_munmap -func_count equ 27 +extern syscall_umask +func_count equ 28 func_table: @@ -59,6 +60,7 @@ func_table: dq syscall_pipe2 dq syscall_mkdir dq syscall_munmap + dq syscall_umask section .text global asm_syscall_entry diff --git a/src/include/kernel/sched.h b/src/include/kernel/sched.h index 35505440..94c051a1 100644 --- a/src/include/kernel/sched.h +++ b/src/include/kernel/sched.h @@ -58,6 +58,7 @@ typedef struct _proc_t{ dirnode_t* root; dirnode_t* cwd; event_t childevent; + mode_t umask; } proc_t; diff --git a/src/sys/sched/scheduler.c b/src/sys/sched/scheduler.c index 39ee3893..6df1d1d5 100644 --- a/src/sys/sched/scheduler.c +++ b/src/sys/sched/scheduler.c @@ -470,6 +470,8 @@ void sched_runinit(){ fd_release(stdinfd); fd_release(stdoutfd); fd_release(stderrfd); + + proc->umask = 022; timer_add(&arch_getcls()->schedreq, THREAD_QUANTUM, true); diff --git a/src/sys/syscalls/fork.c b/src/sys/syscalls/fork.c index 572fabfe..d46c8ec6 100644 --- a/src/sys/syscalls/fork.c +++ b/src/sys/syscalls/fork.c @@ -41,6 +41,7 @@ syscallret syscall_fork(arch_regs* ctx){ proc->child = newproc; newproc->gid = proc->gid; newproc->uid = proc->uid; + newproc->umask = proc->umask; vfs_acquirenode(proc->root); vfs_acquirenode(proc->cwd); diff --git a/src/sys/syscalls/mkdir.c b/src/sys/syscalls/mkdir.c index 2cbcb75c..fad1d468 100644 --- a/src/sys/syscalls/mkdir.c +++ b/src/sys/syscalls/mkdir.c @@ -19,7 +19,7 @@ syscallret syscall_mkdir(const char* pathname, mode_t mode){ strcpy(path, pathname); - retv.errno = vfs_mkdir(path[0] == '/' ? proc->root : proc->cwd, path, mode); + retv.errno = vfs_mkdir(path[0] == '/' ? proc->root : proc->cwd, path, mode & ~proc->umask); if(retv.errno == 0) retv.ret = 0; diff --git a/src/sys/syscalls/open.c b/src/sys/syscalls/open.c index 3207fac8..ffa58ae3 100644 --- a/src/sys/syscalls/open.c +++ b/src/sys/syscalls/open.c @@ -54,7 +54,7 @@ syscallret syscall_open(const char* pathname, int flags, mode_t mode){ if(ret == ENOENT && (flags & O_CREAT)){ ret = vfs_create( *name == '/' ? proc->root : proc->cwd, - name, mode); + name, mode & ~proc->umask); if(ret){ retv.errno = ret; diff --git a/src/sys/syscalls/umask.c b/src/sys/syscalls/umask.c new file mode 100644 index 00000000..689c228d --- /dev/null +++ b/src/sys/syscalls/umask.c @@ -0,0 +1,17 @@ +#include +#include + + +syscallret syscall_umask(mode_t mask){ + + syscallret retv; + retv.errno = 0; + + proc_t* proc = arch_getcls()->thread->proc; + + retv.ret = proc->umask; + proc->umask = mask & 0777; + + return retv; + +}