Merge pull request #783 from adriadam10/feat/net-resolver-get-error
feat(libSceNet): implement sceNetResolverGetError
This commit is contained in:
commit
901ddfd1f8
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue