mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 16:32:39 +00:00
fake p2p sockets makes peggle2 works again
This commit is contained in:
parent
4a1a0e6a38
commit
4c625c75cc
@ -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
|
||||
|
@ -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<NetInternal>::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<P2PSocket>(family, type, protocol);
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE_MSG("Unknown type {}", type);
|
||||
|
@ -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();
|
||||
|
27
src/core/libraries/network/p2p_sockets.cpp
Normal file
27
src/core/libraries/network/p2p_sockets.cpp
Normal file
@ -0,0 +1,27 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <common/assert.h>
|
||||
#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
|
@ -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
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user