diff --git a/drivers/stdin/stdin.c b/drivers/stdin/stdin.c index 6a621156..9baecb3a 100644 --- a/drivers/stdin/stdin.c +++ b/drivers/stdin/stdin.c @@ -24,6 +24,8 @@ #include #include #include +#include + /* Implementation of a simple stdin device */ diff --git a/kernel/syscall.c b/kernel/syscall.c index ff105ecb..7c0ce5b5 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -33,10 +33,11 @@ static int sys_write(int fd, const char *buf, size_t len) (uint8_t*)buf, len); } -static int sys_open(const char* file, int flags, int mode) +static int sys_open(const char* fname, int flags, int mode) { int fd; - if (!findnode_fs((char*) file)) { + fildes_t* file = NULL; + if (!findnode_fs((char*) fname)) { if (flags & O_CREAT) { //create file, not implemented yet } @@ -48,9 +49,10 @@ static int sys_open(const char* file, int flags, int mode) for (fd = 3; fd < NR_OPEN; fd++) { if (per_core(current_task)->fildes_table[fd].node == NULL) { - per_core(current_task)->fildes_table[fd].node = findnode_fs((char*) file); - per_core(current_task)->fildes_table[fd].mode = mode; - per_core(current_task)->fildes_table[fd].flags = flags; + file = &(per_core(current_task)->fildes_table[fd]); + file->node = findnode_fs((char*) fname); + file->mode = mode; + file->flags = flags; } } if (fd >= NR_OPEN) { @@ -64,9 +66,12 @@ static int sys_open(const char* file, int flags, int mode) static int sys_close(int fd) { - close_fs(per_core(current_task)->fildes_table[fd].node); - per_core(current_task)->fildes_table[fd].node = NULL; - per_core(current_task)->fildes_table[fd].offset = 0; + fildes_t* file = &(per_core(current_task)->fildes_table[fd]); + close_fs(file->node); + file->node = NULL; + file->offset = 0; + file->mode = 0; + file->flags = 0; return 0; } @@ -80,24 +85,25 @@ static int sys_read(int fd, const char *buf, size_t len) static int sys_lseek(int fd, off_t pos, int origin) { int ret = -EINVAL; + fildes_t* file = &(per_core(current_task)->fildes_table[fd]); - if (BUILTIN_EXPECT(per_core(current_task)->fildes_table[fd].node->type != FS_FILE - && per_core(current_task)->fildes_table[fd].node->type != FS_CHARDEVICE, 0)); + if (BUILTIN_EXPECT(file->node->type != FS_FILE + && file->node->type != FS_CHARDEVICE, 0)); return -EINVAL; switch(origin) { case SEEK_SET: { /* set file offset to offset */ - per_core(current_task)->fildes_table[fd].offset = pos; + file->offset = pos; ret = 0; break; } case SEEK_CUR: { /* set file offset to current plus offset */ - ret = pos + per_core(current_task)->fildes_table[fd].offset; + ret = pos + file->offset; break; } case SEEK_END: { /* set file offset to EOF plus offset */ - per_core(current_task)->fildes_table[fd].offset = pos + per_core(current_task)->fildes_table[fd].node->block_size; + file->offset = pos + file->node->block_size; ret = 0; break; } @@ -157,10 +163,10 @@ int syscall_handler(uint32_t sys_nr, ...) break; } case __NR_open: { - const char* file = va_arg(vl, const char*); + const char* fname = va_arg(vl, const char*); int flags = va_arg(vl, int); int mode = va_arg(vl, int); - ret = sys_open(file, flags, mode); + ret = sys_open(fname, flags, mode); break; } case __NR_close: {