summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-10-05 23:41:51 +0200
committerMiguel <m.i@gmx.at>2018-10-05 23:41:51 +0200
commitfe8180d88540bfa96595dcc58290de5425e534e3 (patch)
treea7a681cdcf013119d121fb17ce3b731763a4a644 /kernel/syscalls.c
parent4dbe6a264d7a3bd38ca1ac0921248654a50f1b5e (diff)
drunken proggin
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c46
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++;