diff --git a/kernel/syscall.c b/kernel/syscall.c index d849354f..8c0af17e 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -25,19 +25,6 @@ #include #include -static int sys_read(int fd, const char *buf, size_t len) -{ - unsigned int readbytes; - readbytes = read_fs( - per_core(current_task)->fildes_table[fd].node, - (uint8_t*)buf, len, - per_core(current_task)->fildes_table[fd].offset); - per_core(current_task)->fildes_table[fd].offset += readbytes; - //kprintf("fd:%i, Dateilaenge:%i, Dateiinhalt: %s \n", fd, len, buf); - /* Beware: still reading above file limit! */ - return readbytes; -} - static int sys_write(int fd, const char *buf, size_t len) { unsigned int wrotebytes; @@ -70,7 +57,25 @@ static int sys_close(int fd) per_core(current_task)->fildes_table[fd].offset = 0; return 0; - } +} + +static int sys_read(int fd, const char *buf, size_t len) +{ + unsigned int readbytes; + readbytes = read_fs( + per_core(current_task)->fildes_table[fd].node, + (uint8_t*)buf, len, + per_core(current_task)->fildes_table[fd].offset); + per_core(current_task)->fildes_table[fd].offset += readbytes; + //kprintf("fd:%i, Dateilaenge:%i, Dateiinhalt: %s X: %i\n", fd, len, buf, readbytes); + /* Beware: still reading above file limit! */ + return readbytes; +} + +static int sys_lseek(int fd, off_t pos, int origin) +{ + return 2; +} static int sys_sbrk(int incr) { @@ -113,13 +118,6 @@ int syscall_handler(uint32_t sys_nr, ...) sys_exit(va_arg(vl, uint32_t)); ret = 0; break; - case __NR_read: { - int fd = va_arg(vl, int); - const char* buf = va_arg(vl, const char*); - size_t len = va_arg(vl, size_t); - ret = sys_read(fd, buf, len); - break; - } case __NR_write: { int fd = va_arg(vl, int); const char* buf = va_arg(vl, const char*); @@ -139,6 +137,21 @@ int syscall_handler(uint32_t sys_nr, ...) ret = sys_close(fd); break; } + case __NR_read: { + int fd = va_arg(vl, int); + const char* buf = va_arg(vl, const char*); + size_t len = va_arg(vl, size_t); + ret = sys_read(fd, buf, len); + break; + } + case __NR_lseek: { + int fd = va_arg(vl, int); + off_t pos = va_arg(vl, off_t); + int origin = va_arg(vl, int); + ret = sys_lseek(fd, pos, origin); + kprintf("hallo!!! %i", ret); + break; + } case __NR_sbrk: { int incr = va_arg(vl, int); diff --git a/newlib/src/libgloss/metalsvm/lseek.c b/newlib/src/libgloss/metalsvm/lseek.c index 82328753..2c2ff4ec 100644 --- a/newlib/src/libgloss/metalsvm/lseek.c +++ b/newlib/src/libgloss/metalsvm/lseek.c @@ -24,12 +24,21 @@ #undef errno extern int errno; #include "warning.h" +#include "syscall.h" int -_DEFUN (lseek, (file, ptr, dir), +_DEFUN (_lseek, (file, ptr, dir), int file _AND int ptr _AND int dir) { - return 0; + int ret; + + ret = SYSCALL3(__NR_lseek, file, ptr, dir); + if (ret < 0) { + errno = -ret; + ret = -1; + } + + return ret; }