diff --git a/src/xenia/kernel/xam/xam_net.cc b/src/xenia/kernel/xam/xam_net.cc index a331f139d..5feb4a5a3 100644 --- a/src/xenia/kernel/xam/xam_net.cc +++ b/src/xenia/kernel/xam/xam_net.cc @@ -1031,6 +1031,29 @@ void NetDll_WSASetLastError_entry(dword_t error_code) { } DECLARE_XAM_EXPORT1(NetDll_WSASetLastError, kNetworking, kImplemented); +dword_result_t NetDll_getsockname_entry(dword_t caller, dword_t socket_handle, + lpvoid_t buf_ptr, lpdword_t len_ptr) { + auto socket = + kernel_state()->object_table()->LookupObject(socket_handle); + if (!socket) { + // WSAENOTSOCK + XThread::SetLastError(0x2736); + return -1; + } + + int buffer_len = *len_ptr; + + X_STATUS status = socket->GetSockName(buf_ptr, &buffer_len); + if (XFAILED(status)) { + XThread::SetLastError(xboxkrnl::xeRtlNtStatusToDosError(status)); + return -1; + } + + *len_ptr = buffer_len; + return 0; +} +DECLARE_XAM_EXPORT1(NetDll_getsockname, kNetworking, kImplemented); + } // namespace xam } // namespace kernel } // namespace xe diff --git a/src/xenia/kernel/xsocket.cc b/src/xenia/kernel/xsocket.cc index 8bbc0375e..5c4649a87 100644 --- a/src/xenia/kernel/xsocket.cc +++ b/src/xenia/kernel/xsocket.cc @@ -257,5 +257,17 @@ bool XSocket::QueuePacket(uint32_t src_ip, uint16_t src_port, return true; } +X_STATUS XSocket::GetSockName(uint8_t* buf, int* buf_len) { + struct sockaddr sa = {}; + + int ret = getsockname(native_handle_, &sa, (socklen_t*)buf_len); + if (ret < 0) { + return X_STATUS_UNSUCCESSFUL; + } + + std::memcpy(buf, &sa, *buf_len); + return X_STATUS_SUCCESS; +} + } // namespace kernel } // namespace xe \ No newline at end of file diff --git a/src/xenia/kernel/xsocket.h b/src/xenia/kernel/xsocket.h index f77e2d8eb..984f0a6e5 100644 --- a/src/xenia/kernel/xsocket.h +++ b/src/xenia/kernel/xsocket.h @@ -106,6 +106,7 @@ class XSocket : public XObject { X_STATUS Connect(N_XSOCKADDR* name, int name_len); X_STATUS Bind(N_XSOCKADDR_IN* name, int name_len); X_STATUS Listen(int backlog); + X_STATUS GetSockName(uint8_t* buf, int* buf_len); object_ref Accept(N_XSOCKADDR* name, int* name_len); int Shutdown(int how);