diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 6f19079d1..8648fee09 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -129,8 +129,45 @@ int PS4_SYSV_ABI sceNetBandwidthControlSetPolicy() { } int PS4_SYSV_ABI sceNetBind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) { - 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_bind(s, addr, addrlen); + + 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 sceNetClearDnsCache() { @@ -473,7 +510,7 @@ int PS4_SYSV_ABI sceNetConfigWlanSetDeviceConfig() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen) { +int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) { if (!g_isNetInitialized) { return ORBIS_NET_ERROR_ENOTINIT; } @@ -482,7 +519,7 @@ int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen int positiveErr; do { - result = posix_connect(s, addr, addrlen); + result = sys_connect(s, addr, addrlen); if (result >= 0) { return result; // Success diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index f7635504c..d779eca20 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -117,7 +117,7 @@ int PS4_SYSV_ABI sceNetConfigWlanInfraLeave(); int PS4_SYSV_ABI sceNetConfigWlanInfraScanJoin(); int PS4_SYSV_ABI sceNetConfigWlanScan(); int PS4_SYSV_ABI sceNetConfigWlanSetDeviceConfig(); -int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen); +int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen); int PS4_SYSV_ABI sceNetControl(); int PS4_SYSV_ABI sceNetDhcpdStart(); int PS4_SYSV_ABI sceNetDhcpdStop(); diff --git a/src/core/libraries/network/sys_net.cpp b/src/core/libraries/network/sys_net.cpp index 7f4fde322..028b8c0cf 100644 --- a/src/core/libraries/network/sys_net.cpp +++ b/src/core/libraries/network/sys_net.cpp @@ -10,5 +10,7 @@ namespace Libraries::Net { int sys_connect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen) { return -1; } - +int sys_bind(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen) { + 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 cbafd8078..8f4dfc288 100644 --- a/src/core/libraries/network/sys_net.h +++ b/src/core/libraries/network/sys_net.h @@ -9,5 +9,6 @@ namespace Libraries::Net { int sys_connect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen); +int sys_bind(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen); -} \ No newline at end of file +} // namespace Libraries::Net \ No newline at end of file