Merge pull request #783 from adriadam10/feat/net-resolver-get-error

feat(libSceNet): implement sceNetResolverGetError
This commit is contained in:
Dean 2026-10-06 14:14:10 +13:00 committed by GitHub
commit 901ddfd1f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 4 deletions

View File

@ -203,7 +203,7 @@ std::set<int> g_epolls;
std::map<int, std::map<int, NetEpollEvent>> g_epoll_socks;
std::set<int> g_epoll_aborted;
std::set<int> g_pools;
std::set<int> g_resolvers;
std::map<int, int> g_resolvers;
int g_next_sock = 32;
int g_next_epoll = 0x4000;
int g_next_pool = 1;
@ -220,6 +220,12 @@ int fail(int err) {
return NET_ERROR_BASE | err;
}
void set_resolver_error(int rid, int error) {
std::lock_guard<std::mutex> lk(g_mutex);
const auto resolver = g_resolvers.find(rid);
if (resolver != g_resolvers.end()) resolver->second = error;
}
void log_soft(const char* func, const char* what) {
static std::mutex mtx;
static std::map<std::string, int> hits;
@ -872,7 +878,7 @@ int APS5_VABI sceNetResolverCreate(const char* name, int memid, int flags) {
(void)flags;
std::lock_guard<std::mutex> lk(g_mutex);
const int id = g_next_resolver++;
g_resolvers.insert(id);
g_resolvers[id] = 0;
return id;
}
@ -898,11 +904,13 @@ int APS5_VABI sceNetResolverStartNtoa(int rid, const char* hostname, void* addr,
if (result != 0) {
*errno_slot() = result == EAI_AGAIN ? NET_ETIMEDOUT : NET_ENOENT;
log_soft(__func__, "host DNS lookup failed");
set_resolver_error(rid, NET_ERROR_RESOLVER_ENODNS);
return NET_ERROR_RESOLVER_ENODNS;
}
const auto* address = reinterpret_cast<const sockaddr_in*>(results->ai_addr);
std::memcpy(addr, &address->sin_addr, sizeof(address->sin_addr));
::freeaddrinfo(results);
set_resolver_error(rid, 0);
return 0;
}
@ -924,13 +932,19 @@ int APS5_VABI sceNetResolverStartAton(int rid, const void* addr, char* hostname,
if (result != 0) {
*errno_slot() = result == EAI_AGAIN ? NET_ETIMEDOUT : NET_ENOENT;
log_soft(__func__, "host reverse DNS lookup failed");
set_resolver_error(rid, NET_ERROR_RESOLVER_ENODNS);
return NET_ERROR_RESOLVER_ENODNS;
}
set_resolver_error(rid, 0);
return 0;
}
int APS5_VABI sceNetResolverGetError(void) {
NotImplemented_nid_no_patch(__func__);
int APS5_VABI sceNetResolverGetError(int rid, int* status) {
if (!status) return fail(NET_EINVAL);
std::lock_guard<std::mutex> lk(g_mutex);
const auto resolver = g_resolvers.find(rid);
if (resolver == g_resolvers.end()) return fail(NET_EBADF);
*status = resolver->second;
return 0;
}

View File

@ -29,6 +29,7 @@ int APS5_VABI sceNetEpollDestroy(int);
int APS5_VABI sceNetResolverCreate(const char*, int, int);
int APS5_VABI sceNetResolverStartNtoa(int, const char*, void*, int, int, int);
int APS5_VABI sceNetResolverDestroy(int);
int APS5_VABI sceNetResolverGetError(int, int*);
int APS5_VABI sceNetCtlGetState(int*);
int APS5_VABI sceNetInetPton(int, const char*, void*);
const char* APS5_VABI sceNetInetNtop(int, const void*, char*, std::uint32_t);
@ -134,10 +135,24 @@ int main() {
const int resolver = sceNetResolverCreate("guest-sce-net", 0, 0);
Require(resolver >= 0);
int resolver_error = -1;
Require(sceNetResolverGetError(resolver, &resolver_error) == 0 && resolver_error == 0);
std::array<std::uint8_t, 4> ipv4{};
Require(sceNetResolverStartNtoa(resolver, "guest-sce-net.invalid", ipv4.data(), 5000000, 1, 0) ==
static_cast<int>(0x804101E1));
Require(sceNetResolverGetError(resolver, &resolver_error) == 0 &&
resolver_error == static_cast<int>(0x804101E1));
Require(sceNetResolverStartNtoa(resolver, nullptr, ipv4.data(), 5000000, 1, 0) == static_cast<int>(0x80410116));
Require(sceNetResolverGetError(resolver, &resolver_error) == 0 &&
resolver_error == static_cast<int>(0x804101E1));
Require(sceNetResolverStartNtoa(resolver, "localhost", ipv4.data(), 5000000, 1, 0) == 0);
Require(ipv4[0] == 127);
Require(sceNetResolverGetError(resolver, &resolver_error) == 0 && resolver_error == 0);
Require(sceNetResolverGetError(resolver, nullptr) == static_cast<int>(0x80410116) && *sceNetErrnoLoc() == 22);
Require(sceNetResolverDestroy(resolver) == 0);
resolver_error = -1;
Require(sceNetResolverGetError(resolver, &resolver_error) == static_cast<int>(0x80410109) &&
*sceNetErrnoLoc() == 9 && resolver_error == -1);
std::array<std::uint8_t, 16> ipv6{};
Require(sceNetInetPton(28, "::1", ipv6.data()) == 1);