mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-22 10:04:39 +00:00
Handle DNS resolution through NetResolver
This commit is contained in:
parent
4baa6c4b0b
commit
8590a4cdfd
@ -1388,12 +1388,12 @@ int PS4_SYSV_ABI sceNetResolverConnectDestroy() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNetResolverCreate() {
|
int PS4_SYSV_ABI sceNetResolverCreate(const char* name, int poolid, int flags) {
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
LOG_ERROR(Lib_Net, "(STUBBED) called, name = {}, poolid = {}, flags = {}", name, poolid, flags);
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNetResolverDestroy() {
|
int PS4_SYSV_ABI sceNetResolverDestroy(OrbisNetId resolverid) {
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
@ -1413,9 +1413,41 @@ int PS4_SYSV_ABI sceNetResolverStartAton6() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNetResolverStartNtoa() {
|
int PS4_SYSV_ABI sceNetResolverStartNtoa(OrbisNetId resolverid, const char* hostname,
|
||||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
OrbisNetInAddr* addr, int timeout, int retry, int flags) {
|
||||||
return ORBIS_OK;
|
LOG_INFO(Lib_Net,
|
||||||
|
"called, resolverid = {}, hostname = {}, timeout = {}, retry = {}, flags = {}",
|
||||||
|
resolverid, hostname, timeout, retry, flags);
|
||||||
|
|
||||||
|
if ((flags & ORBIS_NET_RESOLVER_ASYNC) != 0) {
|
||||||
|
// moves processing to EpollWait
|
||||||
|
UNREACHABLE_MSG("unimplemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
const addrinfo hints = {
|
||||||
|
.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG,
|
||||||
|
.ai_family = AF_INET,
|
||||||
|
};
|
||||||
|
|
||||||
|
addrinfo* info = nullptr;
|
||||||
|
auto gai_result = getaddrinfo(hostname, nullptr, &hints, &info);
|
||||||
|
|
||||||
|
auto ret = ORBIS_OK;
|
||||||
|
if (gai_result != 0) {
|
||||||
|
// handle more errors
|
||||||
|
LOG_ERROR(Lib_Net, "address resolution for {} failed: {}", hostname,
|
||||||
|
gai_strerror(gai_result));
|
||||||
|
*sceNetErrnoLoc() = ORBIS_NET_ERETURN;
|
||||||
|
ret = -ORBIS_NET_ERETURN | ORBIS_NET_ERROR_BASE;
|
||||||
|
} else {
|
||||||
|
ASSERT(info && info->ai_addr);
|
||||||
|
in_addr resolved_addr = ((sockaddr_in*)info->ai_addr)->sin_addr;
|
||||||
|
LOG_DEBUG(Lib_Net, "resolved address for {}: {}", hostname, inet_ntoa(resolved_addr));
|
||||||
|
addr->s_addr = resolved_addr.s_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
freeaddrinfo(info);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNetResolverStartNtoa6() {
|
int PS4_SYSV_ABI sceNetResolverStartNtoa6() {
|
||||||
|
@ -95,6 +95,11 @@ enum OrbisNetEpollEvents : u32 {
|
|||||||
ORBIS_NET_EPOLLDESCID = 0x10000,
|
ORBIS_NET_EPOLLDESCID = 0x10000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum OrbisNetResolverFlag : u32 {
|
||||||
|
ORBIS_NET_RESOLVER_ASYNC = 0x1,
|
||||||
|
ORBIS_NET_RESOLVER_START_NTOA_DISABLE_IPADDRESS = 0x10000,
|
||||||
|
};
|
||||||
|
|
||||||
using OrbisNetId = s32;
|
using OrbisNetId = s32;
|
||||||
|
|
||||||
struct OrbisNetSockaddr {
|
struct OrbisNetSockaddr {
|
||||||
@ -112,6 +117,12 @@ struct OrbisNetSockaddrIn {
|
|||||||
char sin_zero[6];
|
char sin_zero[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using OrbisNetInAddr_t = u32;
|
||||||
|
|
||||||
|
struct OrbisNetInAddr {
|
||||||
|
OrbisNetInAddr_t s_addr;
|
||||||
|
};
|
||||||
|
|
||||||
struct OrbisNetIovec {
|
struct OrbisNetIovec {
|
||||||
void* iov_base;
|
void* iov_base;
|
||||||
u64 iov_len;
|
u64 iov_len;
|
||||||
@ -310,12 +321,13 @@ int PS4_SYSV_ABI sceNetResolverConnect();
|
|||||||
int PS4_SYSV_ABI sceNetResolverConnectAbort();
|
int PS4_SYSV_ABI sceNetResolverConnectAbort();
|
||||||
int PS4_SYSV_ABI sceNetResolverConnectCreate();
|
int PS4_SYSV_ABI sceNetResolverConnectCreate();
|
||||||
int PS4_SYSV_ABI sceNetResolverConnectDestroy();
|
int PS4_SYSV_ABI sceNetResolverConnectDestroy();
|
||||||
int PS4_SYSV_ABI sceNetResolverCreate();
|
int PS4_SYSV_ABI sceNetResolverCreate(const char* name, int poolid, int flags);
|
||||||
int PS4_SYSV_ABI sceNetResolverDestroy();
|
int PS4_SYSV_ABI sceNetResolverDestroy(OrbisNetId resolverid);
|
||||||
int PS4_SYSV_ABI sceNetResolverGetError();
|
int PS4_SYSV_ABI sceNetResolverGetError();
|
||||||
int PS4_SYSV_ABI sceNetResolverStartAton();
|
int PS4_SYSV_ABI sceNetResolverStartAton();
|
||||||
int PS4_SYSV_ABI sceNetResolverStartAton6();
|
int PS4_SYSV_ABI sceNetResolverStartAton6();
|
||||||
int PS4_SYSV_ABI sceNetResolverStartNtoa();
|
int PS4_SYSV_ABI sceNetResolverStartNtoa(OrbisNetId resolverid, const char* hostname,
|
||||||
|
OrbisNetInAddr* addr, int timeout, int retry, int flags);
|
||||||
int PS4_SYSV_ABI sceNetResolverStartNtoa6();
|
int PS4_SYSV_ABI sceNetResolverStartNtoa6();
|
||||||
int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecords();
|
int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecords();
|
||||||
int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecordsEx();
|
int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecordsEx();
|
||||||
|
Loading…
Reference in New Issue
Block a user