From ee1c78158f7f3a84b428999f0bfe0f1cab5eb88a Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 21 Apr 2025 10:49:18 +0300 Subject: [PATCH] RE sceNetConnect --- CMakeLists.txt | 2 ++ src/core/libraries/kernel/kernel.h | 1 + src/core/libraries/network/net.cpp | 47 ++++++++++++++++++++++++-- src/core/libraries/network/net.h | 2 +- src/core/libraries/network/net_error.h | 1 + src/core/libraries/network/sys_net.cpp | 14 ++++++++ src/core/libraries/network/sys_net.h | 13 +++++++ 7 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/core/libraries/network/sys_net.cpp create mode 100644 src/core/libraries/network/sys_net.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 04c780c38..f05e828e1 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -379,6 +379,8 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/ssl.h src/core/libraries/network/ssl2.cpp src/core/libraries/network/ssl2.h + src/core/libraries/network/sys_net.cpp + src/core/libraries/network/sys_net.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/core/libraries/kernel/kernel.h b/src/core/libraries/kernel/kernel.h index 58911727d..4d68aa357 100644 --- a/src/core/libraries/kernel/kernel.h +++ b/src/core/libraries/kernel/kernel.h @@ -18,6 +18,7 @@ namespace Libraries::Kernel { void ErrSceToPosix(int result); int ErrnoToSceKernelError(int e); void SetPosixErrno(int e); +int* PS4_SYSV_ABI __Error(); template struct WrapperImpl; diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 2e1c3b058..6f19079d1 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -10,6 +10,7 @@ #include #endif +#include #include "common/assert.h" #include "common/logging/log.h" #include "common/singleton.h" @@ -19,11 +20,14 @@ #include "net_error.h" #include "net_util.h" #include "netctl.h" +#include "sys_net.h" namespace Libraries::Net { static thread_local int32_t net_errno = 0; +static bool g_isNetInitialized = true; // TODO init it properly + int PS4_SYSV_ABI in6addr_any() { LOG_ERROR(Lib_Net, "(STUBBED) called"); return ORBIS_OK; @@ -469,9 +473,46 @@ int PS4_SYSV_ABI sceNetConfigWlanSetDeviceConfig() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetConnect() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen) { + if (!g_isNetInitialized) { + return ORBIS_NET_ERROR_ENOTINIT; + } + int result; + int err; + int positiveErr; + + do { + result = posix_connect(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 sceNetControl() { diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index 871133e70..f7635504c 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(); +int PS4_SYSV_ABI sceNetConnect(OrbisNetId s, 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/net_error.h b/src/core/libraries/network/net_error.h index 2232e821d..4634b0765 100644 --- a/src/core/libraries/network/net_error.h +++ b/src/core/libraries/network/net_error.h @@ -79,6 +79,7 @@ constexpr int ORBIS_NET_ENOMEM = 12; constexpr int ORBIS_NET_ENOBUFS = 55; // error codes +constexpr int ORBIS_NET_ERROR_BASE = 0x80410100; // not existed used for calculation constexpr int ORBIS_NET_ERROR_EPERM = 0x80410101; constexpr int ORBIS_NET_ERROR_ENOENT = 0x80410102; constexpr int ORBIS_NET_ERROR_EINTR = 0x80410104; diff --git a/src/core/libraries/network/sys_net.cpp b/src/core/libraries/network/sys_net.cpp new file mode 100644 index 000000000..7f4fde322 --- /dev/null +++ b/src/core/libraries/network/sys_net.cpp @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "sys_net.h" + +namespace Libraries::Net { + +int sys_connect(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 new file mode 100644 index 000000000..cbafd8078 --- /dev/null +++ b/src/core/libraries/network/sys_net.h @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" +#include "net.h" + +namespace Libraries::Net { + +int sys_connect(OrbisNetId s, OrbisNetSockaddr* addr, u32 addrlen); + +} \ No newline at end of file