diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index 946043a5..513949e7 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -12,7 +12,8 @@ extern syscall_close extern syscall_isatty extern syscall_write extern syscall_stat -func_count equ 11 +extern syscall_fstat +func_count equ 12 func_table: @@ -27,6 +28,7 @@ func_table: dq syscall_isatty dq syscall_write dq syscall_stat + dq syscall_fstat section .text global asm_syscall_entry diff --git a/src/sys/syscalls/fstat.c b/src/sys/syscalls/fstat.c new file mode 100644 index 00000000..3f63416b --- /dev/null +++ b/src/sys/syscalls/fstat.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include +#include + +syscallret syscall_fstat(int ifd, stat* st){ + syscallret retv; + retv.ret = -1; + + if(st > USER_SPACE_END){ + retv.errno = EFAULT; + return retv; + } + + proc_t* proc = arch_getcls()->thread->proc; + + fd_t* fd = proc->fds + ifd; + + spinlock_acquire(&proc->fdlock); + + if(proc->fdcount <= ifd || fd->node == NULL || (fd->flags & FD_FLAGS_READ) == 0){ + spinlock_release(&proc->fdlock); + retv.errno = EBADF; + return retv; + } + + spinlock_acquire(&fd->lock); + spinlock_release(&proc->fdlock); + + memcpy(st, &fd->node->st, sizeof(stat)); // XXX user memcpy + + spinlock_release(&fd->lock); + + retv.errno = 0; + retv.ret = 0; + + return retv; + +}