diff --git a/orbis-kernel/src/sys/sys_descrip.cpp b/orbis-kernel/src/sys/sys_descrip.cpp index 5899aef54..ff9893c20 100644 --- a/orbis-kernel/src/sys/sys_descrip.cpp +++ b/orbis-kernel/src/sys/sys_descrip.cpp @@ -27,8 +27,43 @@ orbis::SysResult orbis::sys_closefrom(Thread *thread, sint lowfd) { return ErrorCode::NOSYS; } orbis::SysResult orbis::sys_fstat(Thread *thread, sint fd, ptr ub) { - ORBIS_LOG_TODO(__FUNCTION__, fd, ub); - return ErrorCode::NOSYS; + ORBIS_LOG_WARNING(__FUNCTION__, fd, ub); + thread->where(); + if (fd == 0) { + return ErrorCode::PERM; + } + + auto result = sys_lseek(thread, fd, 0, SEEK_CUR); + auto oldpos = thread->retval[0]; + if (result.isError()) { + return result; + } + + result = sys_lseek(thread, fd, 0, SEEK_END); + auto len = thread->retval[0]; + if (result.isError()) { + return result; + } + + result = sys_read(thread, fd, ub, 1); + if (result.isError()) { + *ub = {}; + ub->mode = 0777 | 0x4000; + } else { + *ub = {}; + ub->size = len; + ub->blksize = 1; + ub->blocks = len; + ub->mode = 0777 | 0x8000; + } + + result = sys_lseek(thread, fd, oldpos, SEEK_SET); + if (result.isError()) { + return result; + } + + thread->retval[0] = 0; + return {}; } orbis::SysResult orbis::sys_nfstat(Thread *thread, sint fd, ptr sb) {