diff --git a/src/core/libraries/kernel/net.cpp b/src/core/libraries/kernel/net.cpp index 05cceceac..12244ff02 100644 --- a/src/core/libraries/kernel/net.cpp +++ b/src/core/libraries/kernel/net.cpp @@ -1,17 +1,33 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include "net.h" namespace Libraries::Kernel { -int PS4_SYSV_ABI posix_socket(int domain, int type, int protocol) {} -int PS4_SYSV_ABI posix_connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen) {} -u32 PS4_SYSV_ABI posix_htonl(u32 hostlong) {} -u16 PS4_SYSV_ABI posix_htons(u16 hostshort) {} -int PS4_SYSV_ABI posix_bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen) {} -int PS4_SYSV_ABI posix_listen(int sockfd, int backlog) {} -int PS4_SYSV_ABI posix_accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen) {} +int PS4_SYSV_ABI posix_socket(int domain, int type, int protocol) { + auto* socket = Common::Singleton::Instance(); + return socket->create_socket(domain, type, protocol); +} +int PS4_SYSV_ABI posix_connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen) { + return 0; +} +u32 PS4_SYSV_ABI posix_htonl(u32 hostlong) { + return htonl(hostlong); +} +u16 PS4_SYSV_ABI posix_htons(u16 hostshort) { + return htons(hostshort); +} +int PS4_SYSV_ABI posix_bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen) { + return 0; +} +int PS4_SYSV_ABI posix_listen(int sockfd, int backlog) { + return 0; +} +int PS4_SYSV_ABI posix_accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen) { + return 0; +} void RegisterNet(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("XVL8So3QJUk", "libkernel", 1, "libkernel", 1, 1, posix_connect); @@ -22,4 +38,12 @@ void RegisterNet(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("pxnCmagrtao", "libkernel", 1, "libkernel", 1, 1, posix_listen); LIB_FUNCTION("3e+4Iv7IJ8U", "libkernel", 1, "libkernel", 1, 1, posix_accept); } + +int NetPosixInternal::create_socket(int domain, int type, int protocol) { + s_socket sock = socket(domain, type, protocol); + auto id = ++next_id; + socks.emplace(id, sock); + return id; +} + } // namespace Libraries::Kernel \ No newline at end of file diff --git a/src/core/libraries/kernel/net.h b/src/core/libraries/kernel/net.h index 9a54f2509..db07c1cde 100644 --- a/src/core/libraries/kernel/net.h +++ b/src/core/libraries/kernel/net.h @@ -8,10 +8,18 @@ #include "common/types.h" #ifdef WIN32 -#include +#define WIN32_LEAN_AND_MEAN +#define _WINSOCK_DEPRECATED_NO_WARNINGS +#include +#include +#include +typedef SOCKET s_socket; #else #include +typedef int s_socket; #endif +#include +#include namespace Common { class NativeClock; @@ -32,4 +40,18 @@ int PS4_SYSV_ABI posix_accept(int sockfd, struct sockaddr* addr, socklen_t* addr void RegisterNet(Core::Loader::SymbolsResolver* sym); +class NetPosixInternal { +public: + explicit NetPosixInternal() = default; + ~NetPosixInternal() = default; + int create_socket(int domain, int type, int protocol); + +public: + s_socket sock; + std::mutex m_mutex; + typedef std::map NetSockets; + NetSockets socks; + int next_id = 0; +}; + } // namespace Libraries::Kernel diff --git a/src/emulator.cpp b/src/emulator.cpp index 4f0c61236..3478b003e 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -16,6 +16,9 @@ #ifdef ENABLE_DISCORD_RPC #include "common/discord_rpc_handler.h" #endif +#ifdef _WIN32 +#include +#endif #include "common/elf_info.h" #include "common/ntapi.h" #include "common/path_util.h" @@ -49,6 +52,10 @@ Emulator::Emulator() { #ifdef _WIN32 Common::NtApi::Initialize(); SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); + // need to init this in order for winsock2 to work + WORD versionWanted = MAKEWORD(2, 2); + WSADATA wsaData; + WSAStartup(versionWanted, &wsaData); #endif // Start logger.