From f844fafd324fbf4c7a986df2f0814f2e2d93bcd8 Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 13 Sep 2018 14:32:28 +0200 Subject: thinking about syscalls and pipes --- .gitignore | 3 +-- README.md | 2 ++ kernel/syscalls.c | 10 ++++------ kernel/syscalls.h | 9 +++++---- test/pipetest.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ xxx/README.md | 1 + 6 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 test/pipetest.c create mode 100644 xxx/README.md diff --git a/.gitignore b/.gitignore index a96dac3..89365a6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -*.swp .lastvimsession .ycm_extra_conf.pyc -xxx/ +.gdb_history diff --git a/README.md b/README.md index ee84a1e..ac12421 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,8 @@ FoolOS is tested/developed on the following emulators/machines Todos ----- +* pipe\_syscall +* Newlib errno / return value / argv / env * Cleanup Virtual Memory Manager / Flush TLB (?) * Mouse & KB processing in seperate task. * Kernel Stuff Reent? diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 8246df8..6707ec3 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -128,12 +128,10 @@ int syscall_write(int file, char *buf, int len) return len; } -int chk_syscall_read(int file, char *buf, int len) -{ - if(len> fifo_data_len[file])return 0; - return 1; -} - +/** + * __read()__ attemts to read up to _len_ bytes from file descriptor _file_ + * into the buffer starting at _buf_. + */ int syscall_read(int file, char *buf, int len) { //file 0 = stdin , file 1 = stdout , file 2 = stderr diff --git a/kernel/syscalls.h b/kernel/syscalls.h index 8b88e6a..b31d32c 100644 --- a/kernel/syscalls.h +++ b/kernel/syscalls.h @@ -6,11 +6,11 @@ #define SYSCALL_OPEN 65 #define SYSCALL_GETPID 78 -#define SYSCALL_ISATTY 68 +#define SYSCALL_ISATTY 68 // linux?? #define SYSCALL_LINK 82 #define SYSCALL_LSEEK 69 #define SYSCALL_READ 62 -#define SYSCALL_SBRK 70 +#define SYSCALL_SBRK 70 // linux?? #define SYSCALL_STAT 74 #define SYSCALL_FSTAT 67 #define SYSCALL_LSTAT 79 @@ -19,14 +19,15 @@ #define SYSCALL_WAIT 77 #define SYSCALL_WRITE 61 #define SYSCALL_GETTIMEOFDAY 71 -#define SYSCALL_READDIR 63 +#define SYSCALL_READDIR 63 // getdents? #define SYSCALL_KILL 73 #define SYSCALL_POLL 80 //shit!? #define SYSCALL_CLONE 83 +#define SYSCALL_PIPE 84 // TODO! unnamed and named pipes (fifos) SYSCALL_MKNOD char* syscall_get_name(uint32_t num); uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid); -int chk_syscall_read(int file, char *buf, int len); + int syscall_open(char *name, int flags, int mode); int syscall_write(int file, char *buf, int len); diff --git a/test/pipetest.c b/test/pipetest.c new file mode 100644 index 0000000..e848049 --- /dev/null +++ b/test/pipetest.c @@ -0,0 +1,54 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + printf("LINUX PIPE TEST\n"); + + if(argc<=1) + { + printf("one argument please [read|write]\n"); + } + + if(!strcmp(argv[1],"read")) + { + FILE *p=fopen("./testpipe","r"); + printf("opened for reading\n"); + printf("feof: %i\n",feof(p)); + + if(p==NULL) + { + int err=errno; + printf("Opening pipe failed with errno %d : %s\n",err,strerror(err)); + } + + while(1) + { + char buf[256]; + int ret=fread(buf,1,10,p); + buf[10]=0; + printf("read: %i %s\n",ret,buf); + printf("feof: %i\n",feof(p)); + if (feof(p)) break; + } + } + + if(!strcmp(argv[1],"write")) + { + FILE *p=fopen("./testpipe","a"); + printf("opened for writing\n"); + if(p==NULL) + { + int err=errno; + printf("Opening pipe failed with errno %d : %s\n",err,strerror(err)); + } + fwrite("DUPA123",1,7,p); + fwrite("DUPA123",1,7,p); + for(int i=0;i<10000;i++) + { + fwrite("DUPA123",1,7,p); + } + //fclose(p); + } +} diff --git a/xxx/README.md b/xxx/README.md new file mode 100644 index 0000000..16aeeac --- /dev/null +++ b/xxx/README.md @@ -0,0 +1 @@ +some old files -- cgit v1.2.3