mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
file decriptors
This commit is contained in:
@@ -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
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <arch/regs.h>
|
#include <arch/regs.h>
|
||||||
#include <kernel/vfs.h>
|
#include <kernel/vfs.h>
|
||||||
#include <kernel/vmm.h>
|
#include <kernel/vmm.h>
|
||||||
|
#include <kernel/fd.h>
|
||||||
|
|
||||||
#define THREAD_PRIORITY_INTERRUPT 0
|
#define THREAD_PRIORITY_INTERRUPT 0
|
||||||
#define THREAD_PRIORITY_KERNEL 1
|
#define THREAD_PRIORITY_KERNEL 1
|
||||||
@@ -39,6 +40,9 @@ typedef struct _proc_t{
|
|||||||
pid_t pid;
|
pid_t pid;
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
|
fd_t* fds;
|
||||||
|
size_t fdcount;
|
||||||
|
off_t firstfreefd;
|
||||||
vmm_context* context;
|
vmm_context* context;
|
||||||
thread_t** threads;
|
thread_t** threads;
|
||||||
size_t threadcount;
|
size_t threadcount;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <kernel/elf.h>
|
#include <kernel/elf.h>
|
||||||
|
|
||||||
|
#define PROC_START_FD_COUNT 3
|
||||||
#define THREAD_QUANTUM 10000
|
#define THREAD_QUANTUM 10000
|
||||||
|
|
||||||
// queue 0: interrupt threads
|
// queue 0: interrupt threads
|
||||||
@@ -34,6 +35,17 @@ static proc_t* allocproc(size_t threadcount){
|
|||||||
return NULL;
|
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();
|
proc->context = vmm_newcontext();
|
||||||
|
|
||||||
if(!proc->context){
|
if(!proc->context){
|
||||||
@@ -277,8 +289,47 @@ void sched_runinit(){
|
|||||||
proc->cwd = vfs_root();
|
proc->cwd = vfs_root();
|
||||||
proc->pid = 1;
|
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;
|
vnode_t* node;
|
||||||
size_t ret = vfs_open(&node, vfs_root(), "sbin/init");
|
ret = vfs_open(&node, vfs_root(), "sbin/init");
|
||||||
|
|
||||||
if(ret){
|
if(ret){
|
||||||
printf("Open failed: %s\n", strerror(ret));
|
printf("Open failed: %s\n", strerror(ret));
|
||||||
@@ -293,8 +344,6 @@ void sched_runinit(){
|
|||||||
printf("ELF load error: %s\n", strerror(ret));
|
printf("ELF load error: %s\n", strerror(ret));
|
||||||
_panic("Could not load init", 0);
|
_panic("Could not load init", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->extraregs.gsbase = 0xFFFFFFFFDEADBEEF;
|
|
||||||
|
|
||||||
switch_thread(thread);
|
switch_thread(thread);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user