From 0d7f50a2461b418438403b88dafc0c5b49ee28ac Mon Sep 17 00:00:00 2001 From: Ivan Chikish Date: Fri, 14 Jul 2023 20:59:57 +0300 Subject: [PATCH] [orbis-kernel] +sys_utc_to_localtime, +sys_localtime_to_utc --- orbis-kernel/include/orbis/sys/sysproto.hpp | 11 ++++---- orbis-kernel/include/orbis/time.hpp | 5 ++++ orbis-kernel/src/sys/sys_sce.cpp | 29 ++++++++++++++++++--- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/orbis-kernel/include/orbis/sys/sysproto.hpp b/orbis-kernel/include/orbis/sys/sysproto.hpp index b1d8d3594..222653d9f 100644 --- a/orbis-kernel/include/orbis/sys/sysproto.hpp +++ b/orbis-kernel/include/orbis/sys/sysproto.hpp @@ -1,6 +1,7 @@ #include #include #include +#include namespace orbis { using acl_type_t = sint; @@ -11,9 +12,6 @@ using cpuwhich_t = sint; using cpulevel_t = sint; using SceKernelModule = ModuleHandle; -struct timeval; -struct timezone; - struct ModuleInfo; struct ModuleInfoEx; struct KEvent; @@ -740,8 +738,11 @@ SysResult sys_thr_get_ucontext(Thread *thread /* TODO */); SysResult sys_thr_set_ucontext(Thread *thread /* TODO */); SysResult sys_set_timezone_info(Thread *thread /* TODO */); SysResult sys_set_phys_fmem_limit(Thread *thread /* TODO */); -SysResult sys_utc_to_localtime(Thread *thread /* TODO */); -SysResult sys_localtime_to_utc(Thread *thread /* TODO */); +SysResult sys_utc_to_localtime(Thread *thread, int64_t time, int64_t *localtime, + orbis::timesec *_sec, int *_dst_sec); +SysResult sys_localtime_to_utc(Thread *thread, int64_t time, uint unk, + int64_t *ptime, orbis::timesec *_sec, + int *_dst_sec); SysResult sys_set_uevt(Thread *thread /* TODO */); SysResult sys_get_cpu_usage_proc(Thread *thread /* TODO */); SysResult sys_get_map_statistics(Thread *thread /* TODO */); diff --git a/orbis-kernel/include/orbis/time.hpp b/orbis-kernel/include/orbis/time.hpp index e8779ccfd..e73555e01 100644 --- a/orbis-kernel/include/orbis/time.hpp +++ b/orbis-kernel/include/orbis/time.hpp @@ -15,4 +15,9 @@ struct timezone { sint tz_minuteswest; sint tz_dsttime; }; +struct timesec { + int64_t tz_time; + sint tz_secwest; + sint tz_dstsec; +}; } // namespace orbis diff --git a/orbis-kernel/src/sys/sys_sce.cpp b/orbis-kernel/src/sys/sys_sce.cpp index 192c35577..3e7315465 100644 --- a/orbis-kernel/src/sys/sys_sce.cpp +++ b/orbis-kernel/src/sys/sys_sce.cpp @@ -4,6 +4,7 @@ #include "evf.hpp" #include "module/ModuleInfo.hpp" #include "module/ModuleInfoEx.hpp" +#include "orbis/time.hpp" #include "sys/sysproto.hpp" #include "utils/Logs.hpp" #include @@ -852,11 +853,31 @@ orbis::SysResult orbis::sys_set_timezone_info(Thread *thread /* TODO */) { orbis::SysResult orbis::sys_set_phys_fmem_limit(Thread *thread /* TODO */) { return ErrorCode::NOSYS; } -orbis::SysResult orbis::sys_utc_to_localtime(Thread *thread /* TODO */) { - return ErrorCode::NOSYS; +orbis::SysResult orbis::sys_utc_to_localtime(Thread *thread, int64_t time, + int64_t *localtime, + orbis::timesec *_sec, + int *_dst_sec) { + ORBIS_LOG_TRACE(__FUNCTION__, time, localtime, _sec, _dst_sec); + struct ::tm tp; + auto result = ::mktime(::localtime_r(&time, &tp)); + if (auto e = uwrite(localtime, result); e != ErrorCode{}) + return e; + uwrite(_sec, {}); + uwrite(_dst_sec, 0); + return {}; } -orbis::SysResult orbis::sys_localtime_to_utc(Thread *thread /* TODO */) { - return ErrorCode::NOSYS; +orbis::SysResult orbis::sys_localtime_to_utc(Thread *thread, int64_t time, + uint unk, int64_t *ptime, + orbis::timesec *_sec, + int *_dst_sec) { + ORBIS_LOG_TRACE(__FUNCTION__, time, unk, ptime, _sec, _dst_sec); + struct ::tm tp; + auto result = ::mktime(::gmtime_r(&time, &tp)); + if (auto e = uwrite(ptime, result); e != ErrorCode{}) + return e; + uwrite(_sec, {}); + uwrite(_dst_sec, 0); + return {}; } orbis::SysResult orbis::sys_set_uevt(Thread *thread /* TODO */) { return ErrorCode::NOSYS;