diff --git a/src/core/libraries/network/p2p_sockets.cpp b/src/core/libraries/network/p2p_sockets.cpp index 4f678dace..796a4c562 100644 --- a/src/core/libraries/network/p2p_sockets.cpp +++ b/src/core/libraries/network/p2p_sockets.cpp @@ -57,4 +57,9 @@ int P2PSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) { return 0; } +int P2PSocket::GetPeerName(OrbisNetSockaddr* addr, u32* namelen) { + LOG_ERROR(Lib_Net, "(STUBBED) called"); + return 0; +} + } // 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 1266ca86b..2142adc3c 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -273,6 +273,23 @@ int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) { return res; } +int PosixSocket::GetPeerName(OrbisNetSockaddr* name, u32* namelen) { + std::scoped_lock lock{m_mutex}; + LOG_DEBUG(Lib_Net, "called"); + + sockaddr addr; + convertOrbisNetSockaddrToPosix(name, &addr); + if (name != nullptr) { + *namelen = sizeof(sockaddr_in); + } + int res = ::getpeername(sock, &addr, (socklen_t*)namelen); + if (res >= 0) { + convertPosixSockaddrToOrbis(&addr, name); + *namelen = sizeof(OrbisNetSockaddrIn); + } + return res; +} + #define CASE_SETSOCKOPT(opt) \ case ORBIS_NET_##opt: \ return ConvertReturnErrorCode(setsockopt(sock, level, opt, (const char*)optval, optlen)) diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 1d5485ef3..ce54ee765 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -51,6 +51,7 @@ struct Socket { u32* fromlen) = 0; virtual int Connect(const OrbisNetSockaddr* addr, u32 namelen) = 0; virtual int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) = 0; + virtual int GetPeerName(OrbisNetSockaddr* addr, u32* namelen) = 0; virtual bool IsValid() const = 0; virtual net_socket Native() const = 0; std::mutex m_mutex; @@ -80,6 +81,7 @@ struct PosixSocket : public Socket { SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override; int Connect(const OrbisNetSockaddr* addr, u32 namelen) override; int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) override; + int GetPeerName(OrbisNetSockaddr* addr, u32* namelen) override; bool IsValid() const override { return sock != -1; } @@ -101,6 +103,7 @@ struct P2PSocket : public Socket { SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override; int Connect(const OrbisNetSockaddr* addr, u32 namelen) override; int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) override; + int GetPeerName(OrbisNetSockaddr* addr, u32* namelen) override; bool IsValid() const override { return true; } diff --git a/src/core/libraries/network/sys_net.cpp b/src/core/libraries/network/sys_net.cpp index 749f0efde..f6db325ed 100644 --- a/src/core/libraries/network/sys_net.cpp +++ b/src/core/libraries/network/sys_net.cpp @@ -77,10 +77,27 @@ int PS4_SYSV_ABI sys_accept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) new_file->socket = new_sock; return handle; } -int PS4_SYSV_ABI sys_getpeername(OrbisNetId s, const OrbisNetSockaddr* addr, u32* paddrlen) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); + +int PS4_SYSV_ABI sys_getpeername(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) { + LOG_WARNING(Lib_Net, "(DUMMY) called"); + + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(s); + if (!file || file->type != Core::FileSys::FileType::Socket) { + *Libraries::Kernel::__Error() = ORBIS_NET_ERROR_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return -1; + } + auto sock = file->socket; + int returncode = sock->GetPeerName(addr, paddrlen); + if (returncode >= 0) { + return returncode; + } + *Libraries::Kernel::__Error() = returncode; + LOG_ERROR(Lib_Net, "error code returned : {:#x}", (u32)returncode); return -1; } + int PS4_SYSV_ABI sys_getsockname(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) { LOG_WARNING(Lib_Net, "(DUMMY) called"); diff --git a/src/core/libraries/network/sys_net.h b/src/core/libraries/network/sys_net.h index 4366ea0f8..c23152de1 100644 --- a/src/core/libraries/network/sys_net.h +++ b/src/core/libraries/network/sys_net.h @@ -11,7 +11,7 @@ namespace Libraries::Net { int PS4_SYSV_ABI sys_connect(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen); int PS4_SYSV_ABI sys_bind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen); int PS4_SYSV_ABI sys_accept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen); -int PS4_SYSV_ABI sys_getpeername(OrbisNetId s, const OrbisNetSockaddr* addr, u32* paddrlen); +int PS4_SYSV_ABI sys_getpeername(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen); int PS4_SYSV_ABI sys_getsockname(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen); int PS4_SYSV_ABI sys_getsockopt(OrbisNetId s, int level, int optname, void* optval, u32* optlen); int PS4_SYSV_ABI sys_listen(OrbisNetId s, int backlog);