mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 07:52:31 +00:00
sys_getpeername (#3354)
This commit is contained in:
parent
6c34b86add
commit
78936f31fc
@ -63,6 +63,11 @@ int P2PSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int P2PSocket::GetPeerName(OrbisNetSockaddr* addr, u32* namelen) {
|
||||||
|
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int P2PSocket::fstat(Libraries::Kernel::OrbisKernelStat* stat) {
|
int P2PSocket::fstat(Libraries::Kernel::OrbisKernelStat* stat) {
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -226,6 +226,7 @@ SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) {
|
|||||||
}
|
}
|
||||||
return std::make_shared<PosixSocket>(new_socket);
|
return std::make_shared<PosixSocket>(new_socket);
|
||||||
}
|
}
|
||||||
|
ConvertReturnErrorCode(new_socket);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +255,7 @@ int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) {
|
|||||||
convertPosixSockaddrToOrbis(&addr, name);
|
convertPosixSockaddrToOrbis(&addr, name);
|
||||||
*namelen = sizeof(OrbisNetSockaddrIn);
|
*namelen = sizeof(OrbisNetSockaddrIn);
|
||||||
}
|
}
|
||||||
return res;
|
return ConvertReturnErrorCode(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CASE_SETSOCKOPT(opt) \
|
#define CASE_SETSOCKOPT(opt) \
|
||||||
@ -429,6 +430,23 @@ int PosixSocket::GetSocketOptions(int level, int optname, void* optval, u32* opt
|
|||||||
return 0;
|
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) {
|
int PosixSocket::fstat(Libraries::Kernel::OrbisKernelStat* sb) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
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_blocks = st.st_blocks;
|
||||||
sb->st_blksize = st.st_blksize;
|
sb->st_blksize = st.st_blksize;
|
||||||
// sb->st_flags = st.st_flags;
|
// sb->st_flags = st.st_flags;
|
||||||
return result;
|
return ConvertReturnErrorCode(result);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ struct Socket {
|
|||||||
u32* fromlen) = 0;
|
u32* fromlen) = 0;
|
||||||
virtual int Connect(const OrbisNetSockaddr* addr, u32 namelen) = 0;
|
virtual int Connect(const OrbisNetSockaddr* addr, u32 namelen) = 0;
|
||||||
virtual int GetSocketAddress(OrbisNetSockaddr* name, 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;
|
virtual int fstat(Libraries::Kernel::OrbisKernelStat* stat) = 0;
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
std::mutex receive_mutex;
|
std::mutex receive_mutex;
|
||||||
@ -90,6 +91,7 @@ struct PosixSocket : public Socket {
|
|||||||
SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override;
|
SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override;
|
||||||
int Connect(const OrbisNetSockaddr* addr, u32 namelen) override;
|
int Connect(const OrbisNetSockaddr* addr, u32 namelen) override;
|
||||||
int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) override;
|
int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) override;
|
||||||
|
int GetPeerName(OrbisNetSockaddr* addr, u32* namelen) override;
|
||||||
int fstat(Libraries::Kernel::OrbisKernelStat* stat) override;
|
int fstat(Libraries::Kernel::OrbisKernelStat* stat) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -109,6 +111,7 @@ struct P2PSocket : public Socket {
|
|||||||
SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override;
|
SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override;
|
||||||
int Connect(const OrbisNetSockaddr* addr, u32 namelen) override;
|
int Connect(const OrbisNetSockaddr* addr, u32 namelen) override;
|
||||||
int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) override;
|
int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) override;
|
||||||
|
int GetPeerName(OrbisNetSockaddr* addr, u32* namelen) override;
|
||||||
int fstat(Libraries::Kernel::OrbisKernelStat* stat) override;
|
int fstat(Libraries::Kernel::OrbisKernelStat* stat) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -54,9 +54,8 @@ int PS4_SYSV_ABI sys_accept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen)
|
|||||||
}
|
}
|
||||||
auto new_sock = file->socket->Accept(addr, paddrlen);
|
auto new_sock = file->socket->Accept(addr, paddrlen);
|
||||||
if (!new_sock) {
|
if (!new_sock) {
|
||||||
*Libraries::Kernel::__Error() = ORBIS_NET_EBADF;
|
LOG_ERROR(Lib_Net, "error creating new socket for accepting: {:#x}",
|
||||||
LOG_ERROR(Lib_Net, "error creating new socket for accepting: {}",
|
(u32)*Libraries::Kernel::__Error());
|
||||||
Common::GetLastErrorMsg());
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
auto fd = FDTable::Instance()->CreateHandle();
|
auto fd = FDTable::Instance()->CreateHandle();
|
||||||
@ -67,8 +66,20 @@ int PS4_SYSV_ABI sys_accept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen)
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_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_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_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_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_getsockopt(OrbisNetId s, int level, int optname, void* optval, u32* optlen);
|
||||||
int PS4_SYSV_ABI sys_listen(OrbisNetId s, int backlog);
|
int PS4_SYSV_ABI sys_listen(OrbisNetId s, int backlog);
|
||||||
|
Loading…
Reference in New Issue
Block a user