From: Matthias Kruk Date: Wed, 13 Nov 2019 07:35:01 +0000 (+0900) Subject: Add some methods for process_t types: X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=0bcb8dd9499348bffc7ed72aa93091930b033d08;p=corax Add some methods for process_t types: - process_set_pagedir() / process_get_pagedir() - Convenience functions to access the process's pagedir - process_setuid() - Set the process's user id - process_setgid() - Set the process's group id --- diff --git a/kernel/core/process.c b/kernel/core/process.c index 710fc75..d1c860f 100644 --- a/kernel/core/process.c +++ b/kernel/core/process.c @@ -857,3 +857,61 @@ int process_suspend(process_t *proc) return(ret_val); } + +int process_setuid(process_t *proc, uid_t uid) +{ + process_t *cproc; + int ret_val; + + ret_val = -EINVAL; + cproc = process_get_current(); + + if(cproc) { + /* check if caller is allowed to do that */ + ret_val = -EACCES; + } + + return(ret_val); +} + +int process_setgid(process_t *proc, gid_t gid) +{ + return(-ENOSYS); +} + +int process_set_pagedir(process_t *proc, pg_dir_t *pd) +{ + int ret_val; + + ret_val = -EINVAL; + + if(proc && pd) { + /* FIXME: make sure none of the tasks are running */ + proc->p_pgdir = pd; + + /* FIXME: Set t_pgdir in all tasks */ + proc->p_tasks->t_pgdir = (u32_t)pg_dir_get_pdbr(pd); + + /* + * TODO: The old page directory may still be referenced + * by the tasks' return stacks. Should we handle that here? + */ + ret_val = 0; + } + + return(ret_val); +} + +int process_get_pagedir(process_t *proc, pg_dir_t **pd) +{ + int ret_val; + + ret_val = -EINVAL; + + if(proc && pd) { + *pd = proc->p_pgdir; + ret_val = 0; + } + + return(ret_val); +} diff --git a/kernel/include/process.h b/kernel/include/process.h index 03067e1..3e361fb 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -21,6 +21,7 @@ #include #include +#include #define PROC_ENTRY_FORK ((void*)0) #define PROC_ENTRY_VFORK ((void*)1) @@ -53,5 +54,10 @@ int process_exit(process_t*, int); int process_fork(int); int process_detach(process_t*); int process_suspend(process_t*); +int process_setuid(process_t*, uid_t); +int process_setgid(process_t*, gid_t); + +int process_set_pagedir(process_t*, pg_dir_t*); +int process_get_pagedir(process_t*, pg_dir_t**); #endif /* __PROCESS_H */