mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
syscalls: umask
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -471,6 +471,8 @@ void sched_runinit(){
|
|||||||
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);
|
||||||
|
|
||||||
switch_thread(thread);
|
switch_thread(thread);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user