syscalls: umask

This commit is contained in:
Matheus
2022-10-12 19:04:21 -03:00
parent f084193f39
commit 36d63eb96f
7 changed files with 26 additions and 3 deletions
+3 -1
View File
@@ -28,7 +28,8 @@ extern syscall_fstatat
extern syscall_pipe2 extern syscall_pipe2
extern syscall_mkdir extern syscall_mkdir
extern syscall_munmap extern syscall_munmap
func_count equ 27 extern syscall_umask
func_count equ 28
func_table: func_table:
@@ -59,6 +60,7 @@ func_table:
dq syscall_pipe2 dq syscall_pipe2
dq syscall_mkdir dq syscall_mkdir
dq syscall_munmap dq syscall_munmap
dq syscall_umask
section .text section .text
global asm_syscall_entry global asm_syscall_entry
+1
View File
@@ -58,6 +58,7 @@ typedef struct _proc_t{
dirnode_t* root; dirnode_t* root;
dirnode_t* cwd; dirnode_t* cwd;
event_t childevent; event_t childevent;
mode_t umask;
} proc_t; } proc_t;
+2
View File
@@ -470,6 +470,8 @@ void sched_runinit(){
fd_release(stdinfd); fd_release(stdinfd);
fd_release(stdoutfd); fd_release(stdoutfd);
fd_release(stderrfd); fd_release(stderrfd);
proc->umask = 022;
timer_add(&arch_getcls()->schedreq, THREAD_QUANTUM, true); timer_add(&arch_getcls()->schedreq, THREAD_QUANTUM, true);
+1
View File
@@ -41,6 +41,7 @@ syscallret syscall_fork(arch_regs* ctx){
proc->child = newproc; proc->child = newproc;
newproc->gid = proc->gid; newproc->gid = proc->gid;
newproc->uid = proc->uid; newproc->uid = proc->uid;
newproc->umask = proc->umask;
vfs_acquirenode(proc->root); vfs_acquirenode(proc->root);
vfs_acquirenode(proc->cwd); vfs_acquirenode(proc->cwd);
+1 -1
View File
@@ -19,7 +19,7 @@ syscallret syscall_mkdir(const char* pathname, mode_t mode){
strcpy(path, pathname); 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) if(retv.errno == 0)
retv.ret = 0; retv.ret = 0;
+1 -1
View File
@@ -54,7 +54,7 @@ syscallret syscall_open(const char* pathname, int flags, mode_t mode){
if(ret == ENOENT && (flags & O_CREAT)){ if(ret == ENOENT && (flags & O_CREAT)){
ret = vfs_create( ret = vfs_create(
*name == '/' ? proc->root : proc->cwd, *name == '/' ? proc->root : proc->cwd,
name, mode); name, mode & ~proc->umask);
if(ret){ if(ret){
retv.errno = ret; retv.errno = ret;
+17
View File
@@ -0,0 +1,17 @@
#include <kernel/syscalls.h>
#include <arch/cls.h>
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;
}