mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-02 15:32:52 +00:00
implemented sceNetGetMacAddress
This commit is contained in:
parent
3f33d218b3
commit
0dbbea7600
@ -355,6 +355,9 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp
|
|||||||
src/core/libraries/network/net_ctl_obj.cpp
|
src/core/libraries/network/net_ctl_obj.cpp
|
||||||
src/core/libraries/network/net_ctl_obj.h
|
src/core/libraries/network/net_ctl_obj.h
|
||||||
src/core/libraries/network/net_ctl_codes.h
|
src/core/libraries/network/net_ctl_codes.h
|
||||||
|
src/core/libraries/network/net_util.cpp
|
||||||
|
src/core/libraries/network/net_util.h
|
||||||
|
src/core/libraries/network/net_error.h
|
||||||
src/core/libraries/network/net.h
|
src/core/libraries/network/net.h
|
||||||
src/core/libraries/network/ssl.cpp
|
src/core/libraries/network/ssl.cpp
|
||||||
src/core/libraries/network/ssl.h
|
src/core/libraries/network/ssl.h
|
||||||
|
@ -12,9 +12,13 @@
|
|||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
#include "common/singleton.h"
|
||||||
#include "core/libraries/error_codes.h"
|
#include "core/libraries/error_codes.h"
|
||||||
#include "core/libraries/libs.h"
|
#include "core/libraries/libs.h"
|
||||||
#include "core/libraries/network/net.h"
|
#include "core/libraries/network/net.h"
|
||||||
|
#include "net_error.h"
|
||||||
|
#include "net_util.h"
|
||||||
|
#include "netctl.h"
|
||||||
|
|
||||||
namespace Libraries::Net {
|
namespace Libraries::Net {
|
||||||
|
|
||||||
@ -640,8 +644,15 @@ int PS4_SYSV_ABI sceNetGetIfnameNumList() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNetGetMacAddress() {
|
int PS4_SYSV_ABI sceNetGetMacAddress(Libraries::NetCtl::OrbisNetEtherAddr* addr, int flags) {
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
if (addr == nullptr) {
|
||||||
|
LOG_ERROR(Lib_Net, "addr is null!");
|
||||||
|
return ORBIS_NET_EINVAL;
|
||||||
|
}
|
||||||
|
auto* netinfo = Common::Singleton<NetUtil::NetUtilInternal>::Instance();
|
||||||
|
netinfo->RetrieveEthernetAddr();
|
||||||
|
memcpy(addr->data, netinfo->GetEthernetAddr().data(), 6);
|
||||||
|
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/types.h"
|
#include "common/types.h"
|
||||||
|
#include "netctl.h"
|
||||||
|
|
||||||
namespace Core::Loader {
|
namespace Core::Loader {
|
||||||
class SymbolsResolver;
|
class SymbolsResolver;
|
||||||
@ -151,7 +152,7 @@ int PS4_SYSV_ABI sceNetGetIfList();
|
|||||||
int PS4_SYSV_ABI sceNetGetIfListOnce();
|
int PS4_SYSV_ABI sceNetGetIfListOnce();
|
||||||
int PS4_SYSV_ABI sceNetGetIfName();
|
int PS4_SYSV_ABI sceNetGetIfName();
|
||||||
int PS4_SYSV_ABI sceNetGetIfnameNumList();
|
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 sceNetGetMemoryPoolStats();
|
||||||
int PS4_SYSV_ABI sceNetGetNameToIndex();
|
int PS4_SYSV_ABI sceNetGetNameToIndex();
|
||||||
int PS4_SYSV_ABI sceNetGetpeername();
|
int PS4_SYSV_ABI sceNetGetpeername();
|
||||||
|
20
src/core/libraries/network/net_error.h
Normal file
20
src/core/libraries/network/net_error.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// net errno codes
|
||||||
|
constexpr int ORBIS_NET_ENOENT = 2;
|
||||||
|
constexpr int ORBIS_NET_EBADF = 9;
|
||||||
|
constexpr int ORBIS_NET_EFAULT = 14;
|
||||||
|
constexpr int ORBIS_NET_EEXIST = 17;
|
||||||
|
constexpr int ORBIS_NET_EINVAL = 22;
|
||||||
|
|
||||||
|
// error codes
|
||||||
|
constexpr int ORBIS_NET_ERROR_EPERM = 0x80410101;
|
||||||
|
constexpr int ORBIS_NET_ERROR_ENOENT = 0x80410102;
|
||||||
|
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;
|
110
src/core/libraries/network/net_util.cpp
Normal file
110
src/core/libraries/network/net_util.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||||
|
#include <Ws2tcpip.h>
|
||||||
|
#include <iphlpapi.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
typedef SOCKET net_socket;
|
||||||
|
typedef int socklen_t;
|
||||||
|
#else
|
||||||
|
#include <cerrno>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
typedef int net_socket;
|
||||||
|
#endif
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#include <net/if_dl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <vector>
|
||||||
|
#include <string.h>
|
||||||
|
#include "net_util.h"
|
||||||
|
|
||||||
|
namespace NetUtil {
|
||||||
|
|
||||||
|
const std::array<u8, 6>& NetUtilInternal::GetEthernetAddr() const {
|
||||||
|
return ether_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NetUtilInternal::RetrieveEthernetAddr() {
|
||||||
|
std::scoped_lock lock{m_mutex};
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::vector<u8> adapter_infos(sizeof(IP_ADAPTER_INFO));
|
||||||
|
ULONG size_infos = sizeof(IP_ADAPTER_INFO);
|
||||||
|
|
||||||
|
if (GetAdaptersInfo(reinterpret_cast<PIP_ADAPTER_INFO>(adapter_infos.data()), &size_infos) ==
|
||||||
|
ERROR_BUFFER_OVERFLOW)
|
||||||
|
adapter_infos.resize(size_infos);
|
||||||
|
|
||||||
|
if (GetAdaptersInfo(reinterpret_cast<PIP_ADAPTER_INFO>(adapter_infos.data()), &size_infos) ==
|
||||||
|
NO_ERROR &&
|
||||||
|
size_infos) {
|
||||||
|
PIP_ADAPTER_INFO info = reinterpret_cast<PIP_ADAPTER_INFO>(adapter_infos.data());
|
||||||
|
memcpy(ether_address.data(), info[0].Address, 6);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
ifaddrs* ifap;
|
||||||
|
|
||||||
|
if (getifaddrs(&ifap) == 0) {
|
||||||
|
ifaddrs* p;
|
||||||
|
for (p = ifap; p; p = p->ifa_next) {
|
||||||
|
if (p->ifa_addr->sa_family == AF_LINK) {
|
||||||
|
sockaddr_dl* sdp = reinterpret_cast<sockaddr_dl*>(p->ifa_addr);
|
||||||
|
memcpy(ether_address.data(), sdp->sdl_data + sdp->sdl_nlen, 6);
|
||||||
|
freeifaddrs(ifap);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
freeifaddrs(ifap);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
ifreq ifr;
|
||||||
|
ifconf ifc;
|
||||||
|
char buf[1024];
|
||||||
|
int success = 0;
|
||||||
|
|
||||||
|
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
|
||||||
|
if (sock == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ifc.ifc_len = sizeof(buf);
|
||||||
|
ifc.ifc_buf = buf;
|
||||||
|
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ifreq* it = ifc.ifc_req;
|
||||||
|
const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));
|
||||||
|
|
||||||
|
for (; it != end; ++it) {
|
||||||
|
strcpy(ifr.ifr_name, it->ifr_name);
|
||||||
|
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
|
||||||
|
if (!(ifr.ifr_flags & IFF_LOOPBACK)) {
|
||||||
|
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
|
||||||
|
success = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
memcpy(ether_address.data(), ifr.ifr_hwaddr.sa_data, 6);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} // namespace NetUtil
|
24
src/core/libraries/network/net_util.h
Normal file
24
src/core/libraries/network/net_util.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include "common/types.h"
|
||||||
|
|
||||||
|
namespace NetUtil {
|
||||||
|
|
||||||
|
class NetUtilInternal {
|
||||||
|
public:
|
||||||
|
explicit NetUtilInternal() = default;
|
||||||
|
~NetUtilInternal() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::array<u8, 6> ether_address{};
|
||||||
|
std::mutex m_mutex;
|
||||||
|
|
||||||
|
public:
|
||||||
|
const std::array<u8, 6>& GetEthernetAddr() const;
|
||||||
|
bool RetrieveEthernetAddr();
|
||||||
|
};
|
||||||
|
} // namespace NetUtil
|
Loading…
Reference in New Issue
Block a user