From: Matthias Kruk Date: Thu, 3 Oct 2019 09:39:51 +0000 (+0900) Subject: Add infrastructure to allocate file descriptors to processes X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=55a010559cf1e4fc23b6378ade251e698807314d;p=corax Add infrastructure to allocate file descriptors to processes --- diff --git a/kernel/core/fd.h b/kernel/core/fd.h new file mode 100644 index 0000000..1d87f6f --- /dev/null +++ b/kernel/core/fd.h @@ -0,0 +1,11 @@ +#ifndef __FD_H +#define __FD_H + +#define FD_VALID (1 << 0) + +struct fd { + int fd_flags; + int fd_socknum; +}; + +#endif /* __FD_H */ diff --git a/kernel/core/process.c b/kernel/core/process.c index bbad28d..06b00c8 100644 --- a/kernel/core/process.c +++ b/kernel/core/process.c @@ -6,11 +6,14 @@ #include #include #include "sched.h" +#include "fd.h" struct process { struct pagedir *p_pgdir; struct task *p_tasks; u32_t p_privl; + + struct fd p_fds[16]; }; extern int sched_enqueue(task_t*); @@ -54,6 +57,7 @@ int process_create(process_t **dst, u32_t ppl, void *entry) proc->p_tasks->t_kstack = kstack; proc->p_tasks->t_tslice = 50; proc->p_tasks->t_rslice = 50; + proc->p_tasks->t_proc = proc; if(sched_enqueue(proc->p_tasks) != 0) { PANIC("sched_enqueue() failed for a new task\n"); @@ -93,3 +97,41 @@ int process_switch(process_t *proc) return(ret_val); } + +int process_falloc(process_t *proc, int sock) +{ + int ret_val; + int i; + + ret_val = -EMFILE; + + for(i = 0; i < (sizeof(proc->p_fds) / sizeof(proc->p_fds[0])); i++) { + if(!(proc->p_fds[i].fd_flags & FD_VALID)) { + ret_val = i; + proc->p_fds[i].fd_socknum = sock; + proc->p_fds[i].fd_flags |= FD_VALID; + break; + } + } + + return(ret_val); +} + +int process_ffree(process_t *proc, int fd) +{ + int ret_val; + + ret_val = -EINVAL; + + if(fd >= 0 && fd < (sizeof(proc->p_fds) / sizeof(proc->p_fds[0]))) { + ret_val = -EBADF; + + if(proc->p_fds[fd].fd_flags & FD_VALID) { + proc->p_fds[fd].fd_flags = 0; + proc->p_fds[fd].fd_socknum = -1; + ret_val = 0; + } + } + + return(ret_val); +} diff --git a/kernel/include/process.h b/kernel/include/process.h index c201180..3b1e566 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -26,4 +26,7 @@ typedef struct process process_t; int process_create(process_t**, u32_t, void*); int process_switch(process_t*); +int process_falloc(process_t*, int); +int process_ffree(process_t*, int); + #endif /* __PROCESS_H */