diff --git a/src/core/libraries/kernel/posix_net.cpp b/src/core/libraries/kernel/posix_net.cpp index 4e73b0ecc..d2c24949b 100644 --- a/src/core/libraries/kernel/posix_net.cpp +++ b/src/core/libraries/kernel/posix_net.cpp @@ -16,8 +16,12 @@ int PS4_SYSV_ABI posix_socket(int domain, int type, int protocol) { return socket; } int PS4_SYSV_ABI posix_connect(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen) { - LOG_ERROR(Lib_Kernel, "(STUBBED) callled"); - return 0; + auto* netcall = Common::Singleton::Instance(); + int connect = netcall->net_connect(sockfd, addr, addrlen); + if (connect < 0) { + LOG_ERROR(Lib_Kernel, "error in connect = {}", connect); + } + return connect; } u32 PS4_SYSV_ABI posix_htonl(u32 hostlong) { return htonl(hostlong); @@ -97,4 +101,16 @@ int NetPosixInternal::net_listen(int sockfd, int backlog) { return 0; // TODO logging and error return } +int NetPosixInternal::net_connect(int sockfd, const OrbisNetSockaddr* addr, socklen_t addrlen) { + std::scoped_lock lock{m_mutex}; + const auto it = socks.find(sockfd); + if (it != socks.end()) { + s_socket sock = it->second; + sockaddr addr2; + convertOrbisNetSockaddrToPosix(addr, &addr2); + return ::connect(sock, &addr2, sizeof(sockaddr_in)); + } + return 0; // TODO logging and error return +} + } // namespace Libraries::Kernel \ No newline at end of file diff --git a/src/core/libraries/kernel/posix_net.h b/src/core/libraries/kernel/posix_net.h index 0c08da397..3f879f356 100644 --- a/src/core/libraries/kernel/posix_net.h +++ b/src/core/libraries/kernel/posix_net.h @@ -68,6 +68,7 @@ public: int net_socket(int domain, int type, int protocol); int net_bind(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen); int net_listen(int sockfd, int backlog); + int net_connect(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen); public: s_socket sock;