From 1832e7d79bfffc6efdcacf3698ee9ec6fadf2849 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 21 Apr 2025 11:10:51 +0300 Subject: [PATCH] RE sceNetAccept --- src/core/libraries/network/net.cpp | 41 ++++++++++++++++++++++++-- src/core/libraries/network/sys_net.cpp | 7 +++-- src/core/libraries/network/sys_net.h | 5 ++-- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 8648fee09..ca258e742 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -69,8 +69,45 @@ int PS4_SYSV_ABI sce_net_in6addr_nodelocal_allnodes() { } OrbisNetId PS4_SYSV_ABI sceNetAccept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; + if (!g_isNetInitialized) { + return ORBIS_NET_ERROR_ENOTINIT; + } + int result; + int err; + int positiveErr; + + do { + result = sys_accept(s, addr, paddrlen); + + if (result >= 0) { + return result; // Success + } + + err = *Libraries::Kernel::__Error(); // Standard errno + + // Convert to positive error for comparison + int positiveErr = (err < 0) ? -err : err; + + if ((positiveErr & 0xfff0000) != 0) { + // Unknown/fatal error range + *sceNetErrnoLoc() = ORBIS_NET_ERETURN; + return -positiveErr; + } + + // Retry if interrupted + } while (positiveErr == ORBIS_NET_EINTR); + + if (positiveErr == ORBIS_NET_EADDRINUSE) { + result = -ORBIS_NET_EBADF; + } else if (positiveErr == ORBIS_NET_EALREADY) { + result = -ORBIS_NET_EINTR; + } else { + result = -positiveErr; + } + + *sceNetErrnoLoc() = -result; + + return (-result) | ORBIS_NET_ERROR_BASE; // Convert to official ORBIS_NET_ERROR code } int PS4_SYSV_ABI sceNetAddrConfig6GetInfo() { diff --git a/src/core/libraries/network/sys_net.cpp b/src/core/libraries/network/sys_net.cpp index 028b8c0cf..b76181489 100644 --- a/src/core/libraries/network/sys_net.cpp +++ b/src/core/libraries/network/sys_net.cpp @@ -7,10 +7,13 @@ namespace Libraries::Net { -int sys_connect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen) { +int sys_connect(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) { return -1; } -int sys_bind(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen) { +int sys_bind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) { + return -1; +} +int sys_accept(OrbisNetId s, const OrbisNetSockaddr* addr, u32* paddrlen) { return -1; } } // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sys_net.h b/src/core/libraries/network/sys_net.h index 8f4dfc288..d2c240efa 100644 --- a/src/core/libraries/network/sys_net.h +++ b/src/core/libraries/network/sys_net.h @@ -8,7 +8,8 @@ namespace Libraries::Net { -int sys_connect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen); -int sys_bind(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen); +int sys_connect(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen); +int sys_bind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen); +int sys_accept(OrbisNetId s, const OrbisNetSockaddr* addr, u32* paddrlen); } // namespace Libraries::Net \ No newline at end of file