From 21ee5243226582911a454d4477db40e41e05851a Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 3 Jan 2025 11:47:45 +0200 Subject: [PATCH] sceNetGetMacAddress --- CMakeLists.txt | 1 + src/core/libraries/network/net.cpp | 33 ++++++++++++++++++++++---- src/core/libraries/network/net.h | 8 ++++++- src/core/libraries/network/net_error.h | 10 ++++++++ 4 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 src/core/libraries/network/net_error.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bb276192..1c0e3961c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,6 +262,7 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/net_ctl_obj.h src/core/libraries/network/net_ctl_codes.h src/core/libraries/network/net.h + src/core/libraries/network/net_error.h src/core/libraries/network/ssl.cpp src/core/libraries/network/ssl.h ) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 161fc5214..3d7c3ecfc 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -15,6 +15,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net.h" +#include "net_error.h" namespace Libraries::Net { @@ -640,11 +641,6 @@ int PS4_SYSV_ABI sceNetGetIfnameNumList() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetGetMacAddress() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNetGetMemoryPoolStats() { LOG_ERROR(Lib_Net, "(STUBBED) called"); return ORBIS_OK; @@ -1125,6 +1121,33 @@ int PS4_SYSV_ABI sceNetEmulationSet() { return ORBIS_OK; } +/* +** Utility functions +** +*/ +int PS4_SYSV_ABI sceNetGetMacAddress(OrbisNetEtherAddr* addr, int flags) { + if (addr == nullptr) { + net_errno = ORBIS_NET_EINVAL; + LOG_ERROR(Lib_Net, "address in null"); + return ORBIS_NET_ERROR_EINVAL; + } +#ifdef _WIN32 + IP_ADAPTER_INFO AdapterInfo[16]; + DWORD dwBufLen = sizeof(AdapterInfo); + if (GetAdaptersInfo(AdapterInfo, &dwBufLen) != ERROR_SUCCESS) { + net_errno = ORBIS_NET_EINVAL; + return ORBIS_NET_ERROR_EINVAL; + } else { + memcpy(addr->data, AdapterInfo[0].Address, 6); // get MAC Address from first adapter + } +#else + // TODO: Implement the function for non Windows OS + char fakeaddress[6] = {0x9A, 0x9D, 0xCA, 0xED, 0xA5, 0xCB}; + memcpy(addr->data, fakeaddress, 6); +#endif + return ORBIS_OK; +} + void RegisterlibSceNet(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("ZRAJo-A-ukc", "libSceNet", 1, "libSceNet", 1, 1, in6addr_any); LIB_FUNCTION("XCuA-GqjA-k", "libSceNet", 1, "libSceNet", 1, 1, in6addr_loopback); diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index 2f5a59b53..78162effe 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -36,6 +36,12 @@ struct OrbisNetSockaddrIn { char sin_zero[6]; }; +#define SCE_NET_ETHER_ADDR_LEN 6 + +struct OrbisNetEtherAddr { + u8 data[6]; +}; + int PS4_SYSV_ABI in6addr_any(); int PS4_SYSV_ABI in6addr_loopback(); int PS4_SYSV_ABI sce_net_dummy(); @@ -160,7 +166,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(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 new file mode 100644 index 000000000..fd8a25c7f --- /dev/null +++ b/src/core/libraries/network/net_error.h @@ -0,0 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// used by sce_net_errno +constexpr int ORBIS_NET_EINVAL = 22; + +// error codes +constexpr int ORBIS_NET_ERROR_EINVAL = 0x80410116;