From 4c625c75cc6a6cf06e4854d1ff9c1eac6dee2538 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 10 Jan 2025 19:00:11 +0200 Subject: [PATCH] fake p2p sockets makes peggle2 works again --- CMakeLists.txt | 1 + src/core/libraries/network/net.cpp | 15 ++++++++--- src/core/libraries/network/net.h | 3 ++- src/core/libraries/network/p2p_sockets.cpp | 27 ++++++++++++++++++++ src/core/libraries/network/posix_sockets.cpp | 12 +++++++++ src/core/libraries/network/sockets.h | 13 ++++++++++ 6 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 src/core/libraries/network/p2p_sockets.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c90edf67..0b1872faa 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,6 +311,7 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/ssl2.cpp src/core/libraries/network/ssl2.h src/core/libraries/network/posix_sockets.cpp + src/core/libraries/network/p2p_sockets.cpp src/core/libraries/network/sockets.h src/core/libraries/network/net_error.h src/core/libraries/network/epoll.cpp diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index c5a4f900a..827780db9 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -1010,9 +1010,16 @@ int PS4_SYSV_ABI sceNetSendmsg() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetSendto() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNetSendto(OrbisNetId s, const void* buf, u32 len, int flags, + const OrbisNetSockaddr* addr, u32 addrlen) { + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->SendPacket(buf, len, flags, addr, addrlen); } int PS4_SYSV_ABI sceNetSetDns6Info() { @@ -1145,7 +1152,7 @@ OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int break; case ORBIS_NET_SOCK_DGRAM_P2P: case ORBIS_NET_SOCK_STREAM_P2P: - UNREACHABLE_MSG("we don't support P2P"); + sock = std::make_shared(family, type, protocol); break; default: UNREACHABLE_MSG("Unknown type {}", type); diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index c40fce7c2..cfceff0ce 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -276,7 +276,8 @@ int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecords(); int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecordsEx(); int PS4_SYSV_ABI sceNetSend(); int PS4_SYSV_ABI sceNetSendmsg(); -int PS4_SYSV_ABI sceNetSendto(); +int PS4_SYSV_ABI sceNetSendto(OrbisNetId s, const void* buf, u32 len, int flags, + const OrbisNetSockaddr* addr, u32 addrlen); int PS4_SYSV_ABI sceNetSetDns6Info(); int PS4_SYSV_ABI sceNetSetDns6InfoToKernel(); int PS4_SYSV_ABI sceNetSetDnsInfo(); diff --git a/src/core/libraries/network/p2p_sockets.cpp b/src/core/libraries/network/p2p_sockets.cpp new file mode 100644 index 000000000..c03883cce --- /dev/null +++ b/src/core/libraries/network/p2p_sockets.cpp @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "net.h" +#include "net_error.h" +#include "sockets.h" + +namespace Libraries::Net { +int P2PSocket::SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) { + return 0; +} + +int P2PSocket::Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) { + return 0; +} + +int P2PSocket::Listen(int backlog) { + return 0; +} + +int P2PSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) { + return -1; // fake value makes peggle2 work +} + +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 6ca60fbb4..2f8d59098 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -78,4 +78,16 @@ int PosixSocket::Listen(int backlog) { return ConvertReturnErrorCode(::listen(sock, backlog)); } +int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) { + if (to != nullptr) { + sockaddr addr; + convertOrbisNetSockaddrToPosix(to, &addr); + return ConvertReturnErrorCode( + sendto(sock, (const char*)msg, len, flags, &addr, sizeof(sockaddr_in))); + } else { + return ConvertReturnErrorCode(send(sock, (const char*)msg, len, flags)); + } +} + } // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 16c10eedf..7c5f7a56c 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -38,6 +38,8 @@ struct Socket { unsigned int optlen) = 0; virtual int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) = 0; virtual int Listen(int backlog) = 0; + virtual int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) = 0; }; struct PosixSocket : public Socket { @@ -48,6 +50,17 @@ struct PosixSocket : public Socket { int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) override; int Listen(int backlog) override; + int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) override; +}; + +struct P2PSocket : public Socket { + explicit P2PSocket(int domain, int type, int protocol) : Socket(domain, type, protocol) {} + int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; + int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) override; + int Listen(int backlog) override; + int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) override; }; class NetInternal {