From 92d5999f7b8cf3d258b9fc1bac968bef3ea92ab7 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 20 Jan 2025 20:25:43 +0200 Subject: [PATCH] added more setsocket options and some error returns --- src/core/libraries/network/net.cpp | 20 ++++++++++-- src/core/libraries/network/net.h | 3 +- src/core/libraries/network/net_error.h | 1 + src/core/libraries/network/posix_sockets.cpp | 33 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index e335930a5..008a1b921 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -18,6 +18,7 @@ #include "core/libraries/network/net.h" #include "net_error.h" +#include "netctl.h" #include "sockets.h" namespace Libraries::Net { @@ -728,8 +729,23 @@ int PS4_SYSV_ABI sceNetGetIfnameNumList() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetGetMacAddress() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetGetMacAddress(Libraries::NetCtl::OrbisNetEtherAddr* addr, int flags) { + if (addr == nullptr) { + LOG_ERROR(Lib_Net, "addr is null!"); + return ORBIS_NET_EINVAL; + } +#ifdef _WIN32 + IP_ADAPTER_INFO AdapterInfo[16]; + DWORD dwBufLen = sizeof(AdapterInfo); + if (GetAdaptersInfo(AdapterInfo, &dwBufLen) != ERROR_SUCCESS) { + LOG_ERROR(Lib_Net, "Can't retrieve adapter info"); + return ORBIS_NET_EINVAL; + } else { + memcpy(addr->data, AdapterInfo[0].Address, 6); + } +#else + LOG_ERROR(Lib_Net, "FixMe no support for MacOS,linux"); +#endif return ORBIS_OK; } diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index cfceff0ce..0d58dbebe 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -5,6 +5,7 @@ #include "common/types.h" #include "epoll.h" +#include "netctl.h" namespace Core::Loader { class SymbolsResolver; @@ -219,7 +220,7 @@ int PS4_SYSV_ABI sceNetGetIfList(); int PS4_SYSV_ABI sceNetGetIfListOnce(); int PS4_SYSV_ABI sceNetGetIfName(); int PS4_SYSV_ABI sceNetGetIfnameNumList(); -int PS4_SYSV_ABI sceNetGetMacAddress(); +int PS4_SYSV_ABI sceNetGetMacAddress(Libraries::NetCtl::OrbisNetEtherAddr* addr, int flags); int PS4_SYSV_ABI sceNetGetMemoryPoolStats(); int PS4_SYSV_ABI sceNetGetNameToIndex(); int PS4_SYSV_ABI sceNetGetpeername(); diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h index 88e3cac55..f85443fc4 100644 --- a/src/core/libraries/network/net_error.h +++ b/src/core/libraries/network/net_error.h @@ -16,3 +16,4 @@ constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; constexpr int ORBIS_NET_ERROR_EFAULT = 0x8041010e; constexpr int ORBIS_NET_ERROR_EEXIST = 0x80410111; constexpr int ORBIS_NET_ERROR_EINVAL = 0x80410116; +constexpr int ORBIS_NET_ERROR_ENOPROTOOPT = 0x8041012a; diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 4dc5a70ad..d73fbffe8 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -22,6 +22,23 @@ static int ConvertLevels(int level) { static int ConvertReturnErrorCode(int retval) { if (retval < 0) { +#ifdef _WIN32 + int err = WSAGetLastError(); + LOG_ERROR(Lib_Net, "Error occured {}", err); + switch (err) { + case WSAENOPROTOOPT: + return ORBIS_NET_ERROR_ENOPROTOOPT; + case WSAEINVAL: + return ORBIS_NET_ERROR_EINVAL; +#else + LOG_ERROR(Lib_Net, "Error occured {}", errno); + switch (errno) { + case ENOPROTOOPT: + return ORBIS_NET_ERROR_ENOPROTOOPT; + case EINVAL: + return ORBIS_NET_ERROR_EINVAL; +#endif + } UNREACHABLE_MSG("Function returned an errorCode = {}", retval); } // if it is 0 or positive return it as it is @@ -63,6 +80,15 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_SNDTIMEO: return ConvertReturnErrorCode( setsockopt(sock, level, SO_SNDTIMEO, (const char*)optval, optlen)); + case ORBIS_NET_SO_SNDBUF: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_SNDBUF, (const char*)optval, optlen)); + case ORBIS_NET_SO_RCVBUF: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_RCVBUF, (const char*)optval, optlen)); + case ORBIS_NET_SO_LINGER: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_LINGER, (const char*)optval, optlen)); case ORBIS_NET_SO_ONESBCAST: { if (optlen != sizeof(sockopt_so_onesbcast)) { return ORBIS_NET_ERROR_EFAULT; @@ -90,6 +116,13 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un setsockopt(sock, level, TCP_NODELAY, (const char*)optval, optlen)); } } + if (level == IPPROTO_IP) { + switch (optname) { + case ORBIS_NET_IP_HDRINCL: + return ConvertReturnErrorCode( + setsockopt(sock, level, IP_HDRINCL, (const char*)optval, optlen)); + } + } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); return 0; }