diff options
| author | Miguel <m.i@gmx.at> | 2018-10-05 23:41:51 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-10-05 23:41:51 +0200 |
| commit | fe8180d88540bfa96595dcc58290de5425e534e3 (patch) | |
| tree | a7a681cdcf013119d121fb17ce3b731763a4a644 /kernel/syscalls.c | |
| parent | 4dbe6a264d7a3bd38ca1ac0921248654a50f1b5e (diff) | |
drunken proggin
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 4bf63fc..130e6dd 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -31,36 +31,46 @@ static fd fds[MAX_PID][MAX_FD]; static bool open_fd[MAX_PID][MAX_FD]; -void fd_init_std_streams(uint32_t pid,bool fb) +fd *get_fd(uint32_t pid,uint32_t file) { + return &(fds[pid][file]); +} + +void fd_init_std_streams(uint32_t pid) +{ + // fds[pid][0]=fd_from_ringbuffer(); + // open_fd[pid][0]=true; + return; + static bool first=true; if(pid==0&&first) { first=false; //stdin / stdout /stderr fds[0][0]=fd_from_ringbuffer(); - if(!fb) // ega text mode + +// if(!fb) // ega text mode { - fds[0][1]=fd_from_term(); - fds[0][2]=fd_from_term(); + // fds[0][1]=fd_from_term(); + // fds[0][2]=fd_from_term(); } - else +// else { - fds[0][1]=fd_from_fb_term(); - fds[0][2]=fd_from_fb_term(); + //fds[0][1]=fd_from_fb_term(); + //fds[0][2]=fd_from_fb_term(); } open_fd[0][0]=true; - open_fd[0][1]=true; - open_fd[0][2]=true; +// open_fd[0][1]=true; +// open_fd[0][2]=true; } else { fds[pid][0]=fds[0][0]; - fds[pid][1]=fds[0][1]; - fds[pid][2]=fds[0][2]; +// fds[pid][1]=fds[0][1]; +// fds[pid][2]=fds[0][2]; open_fd[pid][0]=true; - open_fd[pid][1]=true; - open_fd[pid][2]=true; +// open_fd[pid][1]=true; +// open_fd[pid][2]=true; } } // @@ -178,6 +188,7 @@ int syscall_lseek(int file,int ptr,int dir,uint32_t pid) // TODO: /dev/console or /dev/tty1 - /dev/ttyN int syscall_write(int file, char *buf, int len,uint32_t pid) { + if(!open_fd[pid][file])kpanic("writing to closed file descriptor"); for(int i=0;i<len;i++) { fd_write(&fds[pid][file],buf[i]); @@ -191,6 +202,7 @@ int syscall_write(int file, char *buf, int len,uint32_t pid) */ int syscall_read(int file, char *buf, int len,uint32_t pid) { + if(!open_fd[pid][file])kpanic("reading from closed file descriptor"); if(fd_eof(&fds[pid][file]))return 0; *buf=fd_read(&fds[pid][file]); return 1; @@ -276,14 +288,16 @@ int syscall_execve(const char *name, char *const argv[], char *const env[], int int nextfd(int pid) { for(int i=0;i<MAX_FD;i++) + { if(!open_fd[pid][i]) { open_fd[pid][i]=true; return i; } - + } return -1; } + int syscall_open(char *name, int flags, int mode,uint32_t pid) { uint32_t fdn=nextfd(pid); @@ -303,6 +317,8 @@ uint32_t syscall_fork(int none1, int none2, int none3, int pid) fds[newpid][i]=fd_dupl(&fds[pid][i]); open_fd[newpid][i]=true; } +// fds[newpid][0]=fd_from_ringbuffer(); // TODO fix + open_fd[newpid][0]=true; return newpid; } @@ -390,6 +406,8 @@ uint32_t syscall_pipe(uint32_t *addr,int none1, int none2, uint32_t pid) int fd1=nextfd(pid); int fd2=nextfd(pid); + klog("new pipe read=%d, write=%d",fd1,fd2 ); + fds[pid][fd1]=pipfds[0] ; *addr=fd1; addr++; |
