summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c51
1 files changed, 16 insertions, 35 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 29b5b6b..507be13 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -28,12 +28,14 @@
#define MAX_PID 200
//TODO move to process.c and implement per process //
-static fd fds[MAX_PID][MAX_FD];
+static fd fds[MAX_PID][MAX_FD];
+static int tty[MAX_PID]; // keep track of /dev/tty fd for each process :P
+
static bool open_fd[MAX_PID][MAX_FD];
-fd *get_fd(uint32_t pid,uint32_t file)
+fd *get_tty(uint32_t pid)
{
- return &(fds[pid][file]);
+ return &(fds[pid][tty[pid]]);
}
void fd_init_std_streams(uint32_t pid)
@@ -48,37 +50,6 @@ void fd_init_std_streams(uint32_t pid)
open_fd[pid][2]=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
- {
- // fds[0][1]=fd_from_term();
- // fds[0][2]=fd_from_term();
- }
-// else
- {
- //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;
- }
- else
- {
- fds[pid][0]=fds[0][0];
-// 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;
- }
}
//
@@ -308,6 +279,8 @@ int nextfd(int pid)
int syscall_open(char *name, int flags, int mode,uint32_t pid)
{
+ if(!strcmp("/dev/tty",name))return tty[pid];
+
uint32_t fdn=nextfd(pid);
fds[pid][fdn]=mount_file_open(name);
if(*(uint32_t *)fds[pid][fdn].data==0)return -1;
@@ -325,8 +298,9 @@ 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;
}
+ tty[newpid]=tty[pid];
// fds[newpid][0]=fd_from_ringbuffer(); // TODO fix
- open_fd[newpid][0]=true;
+// open_fd[newpid][0]=true;
return newpid;
}
@@ -341,6 +315,7 @@ uint32_t syscall_clone(int none1, int none2, int none3, int pid)
fds[newpid][i]=fd_dupl(&fds[pid][i]);
open_fd[newpid][i]=true;
}
+ tty[newpid]=tty[pid];
return newpid;
}
@@ -383,6 +358,7 @@ int syscall_close(int file,int none1,int none2,int pid)
// TODO: check if file is a termminal!
int syscall_isatty(int file,int none1,int none2,int pid)
{
+ return 1;
if(fds[pid][file].type==FD_TYPE_FIFO)return 1;
return 0;
}
@@ -438,7 +414,12 @@ uint32_t syscall_gui_rect(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid)
}
uint32_t syscall_gui_win(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid)
{
+ uint32_t fdn=nextfd(pid);
+ fds[pid][fdn]=fd_from_ringbuffer();
+ tty[pid]=fdn;
+
task_add_win(pid);
+
return 1;
}