From e5aa5a96e8100b549ed72cdd2eee4b5f5060758f Mon Sep 17 00:00:00 2001 From: Ivan Chikish Date: Fri, 21 Jul 2023 19:51:15 +0300 Subject: [PATCH] [orbis-kernel] Hack sys_fstat --- orbis-kernel/src/sys/sys_descrip.cpp | 39 ++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) 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) {