From 52d4f34f054cd55a89efa581b6d26843ac72ceae Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 30 Oct 2022 19:55:38 +0100 Subject: [PATCH] Kernel, libc: Implement umask() --- kernel/include/sys/Syscall.h | 4 +++- kernel/include/thread/Task.h | 2 ++ kernel/src/sys/Syscall.cpp | 1 + kernel/src/sys/stdio.cpp | 9 ++++++++- libs/libc/include/sys/stat.h | 4 +++- libs/libc/include/sys/syscall.h | 1 + libs/libc/src/sys/stat.cpp | 4 ++-- libs/libc/src/syscall.cpp | 3 ++- 8 files changed, 22 insertions(+), 6 deletions(-) diff --git a/kernel/include/sys/Syscall.h b/kernel/include/sys/Syscall.h index d09e6ddc..94ffba07 100644 --- a/kernel/include/sys/Syscall.h +++ b/kernel/include/sys/Syscall.h @@ -30,6 +30,7 @@ #define SYS_dup2 24 #define SYS_setuid 25 #define SYS_setgid 26 +#define SYS_umask 27 struct stat; struct pstat; @@ -67,4 +68,5 @@ void sys_getdents(Context* context, int fd, struct luna_dirent* buf, size_t coun void sys_stat(Context* context, const char* path, struct stat* buf); void sys_dup2(Context* context, int fd, int fd2); void sys_setuid(Context* context, int new_uid, int new_euid); -void sys_setgid(Context* context, int new_gid, int new_egid); \ No newline at end of file +void sys_setgid(Context* context, int new_gid, int new_egid); +void sys_umask(Context* context, mode_t cmask); \ No newline at end of file diff --git a/kernel/include/thread/Task.h b/kernel/include/thread/Task.h index 60b16ebe..8faf4a8d 100644 --- a/kernel/include/thread/Task.h +++ b/kernel/include/thread/Task.h @@ -81,6 +81,8 @@ struct Task char name[128]; + mode_t umask; + BlockReason block_reason; union { diff --git a/kernel/src/sys/Syscall.cpp b/kernel/src/sys/Syscall.cpp index 357ab199..97cb07c2 100644 --- a/kernel/src/sys/Syscall.cpp +++ b/kernel/src/sys/Syscall.cpp @@ -40,6 +40,7 @@ void Syscall::entry(Context* context) case SYS_dup2: sys_dup2(context, (int)context->rdi, (int)context->rsi); break; case SYS_setuid: sys_setuid(context, (int)context->rdi, (int)context->rsi); break; case SYS_setgid: sys_setgid(context, (int)context->rdi, (int)context->rsi); break; + case SYS_umask: sys_umask(context, (mode_t)context->rdi); break; default: context->rax = -ENOSYS; break; } VMM::exit_syscall_context(); diff --git a/kernel/src/sys/stdio.cpp b/kernel/src/sys/stdio.cpp index 6384cc5c..8cc05a74 100644 --- a/kernel/src/sys/stdio.cpp +++ b/kernel/src/sys/stdio.cpp @@ -333,7 +333,7 @@ void sys_mkdir(Context* context, const char* filename, mode_t mode) Task* current_task = Scheduler::current_task(); - int rc = VFS::do_mkdir(kfilename, current_task->euid, current_task->egid, mode); + int rc = VFS::do_mkdir(kfilename, current_task->euid, current_task->egid, mode & (~current_task->umask)); kfree(kfilename); @@ -373,4 +373,11 @@ void sys_dup2(Context* context, int fd, int fd2) *file2 = *file1; kinfoln("dup2(): overwrote fd %d with fd %d", fd2, fd); context->rax = fd2; +} + +void sys_umask(Context* context, mode_t cmask) +{ + Task* current_task = Scheduler::current_task(); + context->rax = current_task->umask; + current_task->umask = cmask; } \ No newline at end of file diff --git a/libs/libc/include/sys/stat.h b/libs/libc/include/sys/stat.h index 6602677d..b2480f84 100644 --- a/libs/libc/include/sys/stat.h +++ b/libs/libc/include/sys/stat.h @@ -64,7 +64,9 @@ extern "C" /* Returns information about the file pointed at path in buf. */ int stat(const char* pathname, struct stat* buf); - mode_t umask(mode_t cmask); // Not implemented. + /* Changes the current process' file creation mask. */ + mode_t umask(mode_t cmask); + int chmod(const char* pathname, mode_t mode); // Not implemented. #ifdef __cplusplus diff --git a/libs/libc/include/sys/syscall.h b/libs/libc/include/sys/syscall.h index 1af1a0ad..f4699257 100644 --- a/libs/libc/include/sys/syscall.h +++ b/libs/libc/include/sys/syscall.h @@ -28,5 +28,6 @@ #define SYS_dup2 24 #define SYS_setuid 25 #define SYS_setgid 26 +#define SYS_umask 27 #endif \ No newline at end of file diff --git a/libs/libc/src/sys/stat.cpp b/libs/libc/src/sys/stat.cpp index 936a72f9..7b9b96c1 100644 --- a/libs/libc/src/sys/stat.cpp +++ b/libs/libc/src/sys/stat.cpp @@ -20,9 +20,9 @@ extern "C" return (int)__lc_fast_syscall2(SYS_stat, path, buf); } - mode_t umask(mode_t) + mode_t umask(mode_t cmask) { - NOT_IMPLEMENTED("umask"); + return (mode_t)__lc_fast_syscall1(SYS_umask, cmask); } int chmod(const char*, mode_t) diff --git a/libs/libc/src/syscall.cpp b/libs/libc/src/syscall.cpp index f835cbba..42602131 100644 --- a/libs/libc/src/syscall.cpp +++ b/libs/libc/src/syscall.cpp @@ -17,13 +17,14 @@ extern "C" long syscall(long number, ...) case SYS_exit: case SYS_getprocid: case SYS_close: - case SYS_mkdir: + case SYS_umask: case SYS_sleep: result = __luna_syscall1(number, va_arg(ap, arg)); break; case SYS_munmap: case SYS_execv: case SYS_access: case SYS_fstat: case SYS_stat: + case SYS_mkdir: case SYS_dup2: case SYS_clock_gettime: case SYS_setuid: