Skip to content

Commit

Permalink
[NET] NetDll_accept improvements
Browse files Browse the repository at this point in the history
- Removed incorrect logic
- Removed unnecessary check
- Simplified checks
  • Loading branch information
Gliniak authored and AdrianCassar committed Mar 8, 2024
1 parent 9f460b2 commit cfb01f8
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 22 deletions.
19 changes: 7 additions & 12 deletions src/xenia/kernel/xam/xam_net.cc
Expand Up @@ -1320,28 +1320,23 @@ DECLARE_XAM_EXPORT1(NetDll_listen, kNetworking, kImplemented);
dword_result_t NetDll_accept_entry(dword_t caller, dword_t socket_handle,
pointer_t<XSOCKADDR_IN> addr_ptr,
lpdword_t addrlen_ptr) {
if (!addr_ptr) {
XThread::SetLastError(uint32_t(X_WSAError::X_WSAEFAULT));
return -1;
}

auto socket =
kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);
if (!socket) {
XThread::SetLastError(uint32_t(X_WSAError::X_WSAENOTSOCK));
return -1;
}

int native_len = *addrlen_ptr;
auto new_socket = socket->Accept(addr_ptr, &native_len);
if (new_socket) {
*addrlen_ptr = native_len;

return new_socket->handle();
} else {
int* name_len_host_ptr = nullptr;
if (addrlen_ptr) {
name_len_host_ptr = reinterpret_cast<int*>(addrlen_ptr.host_address());
}
auto new_socket = socket->Accept(addr_ptr, name_len_host_ptr);
if (!new_socket) {
XThread::SetLastError(socket->GetLastWSAError());
return -1;
}
return new_socket->handle();
}
DECLARE_XAM_EXPORT1(NetDll_accept, kNetworking, kImplemented);

Expand Down
20 changes: 10 additions & 10 deletions src/xenia/kernel/xsocket.cc
Expand Up @@ -162,23 +162,23 @@ X_STATUS XSocket::Listen(int backlog) {
}

object_ref<XSocket> XSocket::Accept(XSOCKADDR_IN* name, int* name_len) {
sockaddr* sa = nullptr;
sockaddr sa = {};
int addrlen = 0;
const bool is_name_and_name_len_available = name && name_len;

if (name) {
sa = const_cast<sockaddr*>(&name->to_host());
if (is_name_and_name_len_available) {
addrlen = byte_swap(*name_len);
}

uintptr_t ret = accept(native_handle_, sa, name_len);
const uint64_t ret = accept(native_handle_, name ? &sa : nullptr,
name_len ? &addrlen : nullptr);
if (ret == -1) {
if (name && name_len) {
std::memset((sockaddr*)name, 0, *name_len);
*name_len = 0;
}
return nullptr;
}

if (name) {
name->to_guest(sa);
if (is_name_and_name_len_available) {
name->to_guest(&sa);
*name_len = byte_swap(addrlen);
}
// Create a kernel object to represent the new socket, and copy parameters
// over.
Expand Down

0 comments on commit cfb01f8

Please sign in to comment.