diff --git a/src/include/kernel/fd.h b/src/include/kernel/fd.h new file mode 100644 index 00000000..07cf236e --- /dev/null +++ b/src/include/kernel/fd.h @@ -0,0 +1,36 @@ +#ifndef _FD_H_INCLUDE +#define _FD_H_INCLUDE + + +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_ACCMODE 001000003 + +#define O_CREAT 0100 +#define O_EXCL 0200 +#define O_NOCTTY 0400 +#define O_TRUNC 01000 +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_DSYNC 010000 +#define O_ASYNC 020000 +#define O_LARGEFILE 0100000 +#define O_DIRECTORY 0200000 +#define O_NOFOLLOW 0400000 +#define O_NOATIME 01000000 +#define O_CLOEXEC 02000000 +#define O_SYNC 04010000 +#define O_RSYNC 04010000 +#define O_TMPFILE 020000000 + + + +typedef struct { + vnode_t* node; + off_t offset; + int flags; +} fd_t; + + +#endif diff --git a/src/include/kernel/sched.h b/src/include/kernel/sched.h index ed8784c2..423acf55 100644 --- a/src/include/kernel/sched.h +++ b/src/include/kernel/sched.h @@ -5,6 +5,7 @@ #include #include #include +#include #define THREAD_PRIORITY_INTERRUPT 0 #define THREAD_PRIORITY_KERNEL 1 @@ -39,6 +40,9 @@ typedef struct _proc_t{ pid_t pid; gid_t gid; uid_t uid; + fd_t* fds; + size_t fdcount; + off_t firstfreefd; vmm_context* context; thread_t** threads; size_t threadcount; diff --git a/src/sys/sched/scheduler.c b/src/sys/sched/scheduler.c index f0efb023..1c7dfa52 100644 --- a/src/sys/sched/scheduler.c +++ b/src/sys/sched/scheduler.c @@ -9,6 +9,7 @@ #include #include +#define PROC_START_FD_COUNT 3 #define THREAD_QUANTUM 10000 // queue 0: interrupt threads @@ -34,6 +35,17 @@ static proc_t* allocproc(size_t threadcount){ return NULL; } + proc->fds = alloc(sizeof(fd_t) * PROC_START_FD_COUNT); + + if(!proc->fds){ + free(proc->threads); + free(proc); + return NULL; + } + + proc->fdcount = PROC_START_FD_COUNT; + proc->firstfreefd = PROC_START_FD_COUNT; + proc->context = vmm_newcontext(); if(!proc->context){ @@ -277,8 +289,47 @@ void sched_runinit(){ proc->cwd = vfs_root(); proc->pid = 1; + fd_t* stdinfd = &proc->fds[0]; + fd_t* stdoutfd = &proc->fds[1]; + fd_t* stderrfd = &proc->fds[2]; + + // dummy file before console actually gets implemented and a devfs node + + #define CONSOLE_DUMMY "etc/consoledummy" + + size_t ret = vfs_create(vfs_root(), CONSOLE_DUMMY, 0777); + + if(ret){ + printf("Create failed: %s\n", strerror(ret)); + _panic("Failed to create dummy console", 0); + } + ret = vfs_open(&stdinfd->node, vfs_root(), CONSOLE_DUMMY); + + if(ret){ + printf("Open failed: %s\n", strerror(ret)); + _panic("Could not open stdin for init", 0); + } + + ret = vfs_open(&stdoutfd->node, vfs_root(), CONSOLE_DUMMY); + + if(ret){ + printf("Open failed: %s\n", strerror(ret)); + _panic("Could not open stdout for init", 0); + } + + ret = vfs_open(&stderrfd->node, vfs_root(), CONSOLE_DUMMY); + + if(ret){ + printf("Open failed: %s\n", strerror(ret)); + _panic("Could not open stderr for init", 0); + } + + stdinfd->offset = stdoutfd->offset = stderrfd->offset = 0; + stdinfd->flags = O_RDONLY; + stdoutfd->flags = stderrfd->flags = O_WRONLY; + vnode_t* node; - size_t ret = vfs_open(&node, vfs_root(), "sbin/init"); + ret = vfs_open(&node, vfs_root(), "sbin/init"); if(ret){ printf("Open failed: %s\n", strerror(ret)); @@ -293,8 +344,6 @@ void sched_runinit(){ printf("ELF load error: %s\n", strerror(ret)); _panic("Could not load init", 0); } - - thread->extraregs.gsbase = 0xFFFFFFFFDEADBEEF; switch_thread(thread);