diff --git a/src/core/libraries/network/p2p_sockets.cpp b/src/core/libraries/network/p2p_sockets.cpp index a97a990d2..a9deacf2f 100644 --- a/src/core/libraries/network/p2p_sockets.cpp +++ b/src/core/libraries/network/p2p_sockets.cpp @@ -63,6 +63,11 @@ int P2PSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) { return 0; } +int P2PSocket::GetPeerName(OrbisNetSockaddr* addr, u32* namelen) { + LOG_ERROR(Lib_Net, "(STUBBED) called"); + return 0; +} + int P2PSocket::fstat(Libraries::Kernel::OrbisKernelStat* stat) { LOG_ERROR(Lib_Net, "(STUBBED) called"); return 0; diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 69164bea5..11cb3aade 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -226,6 +226,7 @@ SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) { } return std::make_shared(new_socket); } + ConvertReturnErrorCode(new_socket); return nullptr; } @@ -254,7 +255,7 @@ int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) { convertPosixSockaddrToOrbis(&addr, name); *namelen = sizeof(OrbisNetSockaddrIn); } - return res; + return ConvertReturnErrorCode(res); } #define CASE_SETSOCKOPT(opt) \ @@ -429,6 +430,23 @@ int PosixSocket::GetSocketOptions(int level, int optname, void* optval, u32* opt return 0; } +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 ConvertReturnErrorCode(res); +} + int PosixSocket::fstat(Libraries::Kernel::OrbisKernelStat* sb) { #ifdef _WIN32 LOG_ERROR(Lib_Net, "(STUBBED) called"); @@ -442,7 +460,7 @@ int PosixSocket::fstat(Libraries::Kernel::OrbisKernelStat* sb) { sb->st_blocks = st.st_blocks; sb->st_blksize = st.st_blksize; // sb->st_flags = st.st_flags; - return result; + return ConvertReturnErrorCode(result); #endif } diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index cd73ada2d..ff2cef556 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -56,6 +56,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 int fstat(Libraries::Kernel::OrbisKernelStat* stat) = 0; std::mutex m_mutex; std::mutex receive_mutex; @@ -90,6 +91,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; int fstat(Libraries::Kernel::OrbisKernelStat* stat) override; }; @@ -109,6 +111,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; int fstat(Libraries::Kernel::OrbisKernelStat* stat) override; }; diff --git a/src/core/libraries/network/sys_net.cpp b/src/core/libraries/network/sys_net.cpp index 3c6ed7b74..2ea2b4893 100644 --- a/src/core/libraries/network/sys_net.cpp +++ b/src/core/libraries/network/sys_net.cpp @@ -54,9 +54,8 @@ int PS4_SYSV_ABI sys_accept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) } auto new_sock = file->socket->Accept(addr, paddrlen); if (!new_sock) { - *Libraries::Kernel::__Error() = ORBIS_NET_EBADF; - LOG_ERROR(Lib_Net, "error creating new socket for accepting: {}", - Common::GetLastErrorMsg()); + LOG_ERROR(Lib_Net, "error creating new socket for accepting: {:#x}", + (u32)*Libraries::Kernel::__Error()); return -1; } auto fd = FDTable::Instance()->CreateHandle(); @@ -67,8 +66,20 @@ int PS4_SYSV_ABI sys_accept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) return fd; } -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_INFO(Lib_Net, "s = {}", s); + + auto file = FDTable::Instance()->GetSocket(s); + if (!file) { + *Libraries::Kernel::__Error() = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return -1; + } + int returncode = file->socket->GetPeerName(addr, paddrlen); + if (returncode >= 0) { + return returncode; + } + LOG_ERROR(Lib_Net, "error code returned : {:#x}", (u32)*Libraries::Kernel::__Error()); return -1; } diff --git a/src/core/libraries/network/sys_net.h b/src/core/libraries/network/sys_net.h index 10f57dfb6..7084105b5 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);