diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index c3f56ef3b4..de46c3338e 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -18,7 +18,6 @@ #include "Common/Data/Encoding/Compression.h" #include "Common/Net/NetBuffer.h" #include "Common/Log.h" -#include "Core/HLE/sceNet.h" namespace net { diff --git a/Common/Net/Resolve.cpp b/Common/Net/Resolve.cpp index 241c607c57..75f7b9afc0 100644 --- a/Common/Net/Resolve.cpp +++ b/Common/Net/Resolve.cpp @@ -1,3 +1,5 @@ +#include "Core/Config.h" +#include "Core/HLE/sceNet.h" #include "ppsspp_config.h" #include "Common/Net/Resolve.h" @@ -502,4 +504,53 @@ bool DirectDNSLookupIPV4(const char *dns_server_ip, const char *domain, uint32_t return true; } +std::string ProcessHostnameWithInfraDNS(const std::string& hostname) { + std::string resolvedHostname = hostname; + + // Resolve any aliases. First check the ini file, then check the hardcoded DNS config. + auto aliasIter = g_Config.mHostToAlias.find(hostname); + if (aliasIter != g_Config.mHostToAlias.end()) { + const std::string& alias = aliasIter->second; + INFO_LOG(Log::sceNet, "%s - Resolved alias %s from hostname %s", __FUNCTION__, alias.c_str(), hostname.c_str()); + resolvedHostname = alias; + } + + if (g_Config.bInfrastructureAutoDNS) { + // Also look up into the preconfigured fixed DNS JSON. + auto fixedDNSIter = GetInfraDNSConfig().fixedDNS.find(resolvedHostname); + if (fixedDNSIter != GetInfraDNSConfig().fixedDNS.end()) { + const std::string& domainIP = fixedDNSIter->second; + INFO_LOG(Log::sceNet, "%s - Resolved IP %s from fixed DNS lookup with '%s'", __FUNCTION__, domainIP.c_str(), resolvedHostname.c_str()); + resolvedHostname = domainIP; + } + } + + // Check if hostname is already an IPv4 address, if so we do not need further lookup. This usually happens + // after the mHostToAlias or fixedDNSIter lookups, which effectively both are hardcoded DNS. + uint32_t resolvedAddr; + if (inet_pton(AF_INET, resolvedHostname.c_str(), &resolvedAddr)) { + INFO_LOG(Log::sceNet, "Not looking up '%s', already an IP address.", resolvedHostname.c_str()); + return resolvedHostname; + } + + // Now use the configured primary DNS server to do a lookup. + // If auto DNS, use the server from that config. + std::string dnsServer; + if (g_Config.bInfrastructureAutoDNS && !GetInfraDNSConfig().dns.empty()) { + dnsServer = GetInfraDNSConfig().dns; + } else { + dnsServer = g_Config.sInfrastructureDNSServer; + } + + if (net::DirectDNSLookupIPV4(dnsServer.c_str(), resolvedHostname.c_str(), &resolvedAddr)) { + char temp[32]; + inet_ntop(AF_INET, &resolvedAddr, temp, sizeof(temp)); + INFO_LOG(Log::sceNet, "Direct lookup of '%s' from '%s' succeeded: %s", resolvedHostname.c_str(), dnsServer.c_str(), temp); + return std::string(temp); + } + + WARN_LOG(Log::sceNet, "Direct DNS lookup of '%s' at DNS server '%s' failed. Will try OS DNS...", resolvedHostname.c_str(), dnsServer.c_str()); + return resolvedHostname; +} + } // namespace net diff --git a/Common/Net/Resolve.h b/Common/Net/Resolve.h index 5c7958d654..bc978bcb9e 100644 --- a/Common/Net/Resolve.h +++ b/Common/Net/Resolve.h @@ -26,5 +26,6 @@ int inet_pton(int af, const char* src, void* dst); // Does a DNS lookup without involving the OS, so you can hit any DNS server. bool DirectDNSLookupIPV4(const char *dnsServer, const char *host, uint32_t *ipv4_addr); +std::string ProcessHostnameWithInfraDNS(const std::string& hostname); } // namespace net diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index 3801b7a86f..4f0e5b73f7 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -464,55 +464,6 @@ bool PollInfraJsonDownload(std::string *jsonOutput) { return true; } -std::string ProcessHostnameWithInfraDNS(const std::string& hostname) { - std::string resolvedHostname = hostname; - - // Resolve any aliases. First check the ini file, then check the hardcoded DNS config. - auto aliasIter = g_Config.mHostToAlias.find(hostname); - if (aliasIter != g_Config.mHostToAlias.end()) { - const std::string& alias = aliasIter->second; - INFO_LOG(Log::sceNet, "%s - Resolved alias %s from hostname %s", __FUNCTION__, alias.c_str(), hostname.c_str()); - resolvedHostname = alias; - } - - if (g_Config.bInfrastructureAutoDNS) { - // Also look up into the preconfigured fixed DNS JSON. - auto fixedDNSIter = GetInfraDNSConfig().fixedDNS.find(resolvedHostname); - if (fixedDNSIter != GetInfraDNSConfig().fixedDNS.end()) { - const std::string& domainIP = fixedDNSIter->second; - INFO_LOG(Log::sceNet, "%s - Resolved IP %s from fixed DNS lookup with '%s'", __FUNCTION__, domainIP.c_str(), resolvedHostname.c_str()); - resolvedHostname = domainIP; - } - } - - // Check if hostname is already an IPv4 address, if so we do not need further lookup. This usually happens - // after the mHostToAlias or fixedDNSIter lookups, which effectively both are hardcoded DNS. - uint32_t resolvedAddr; - if (inet_pton(AF_INET, resolvedHostname.c_str(), &resolvedAddr)) { - INFO_LOG(Log::sceNet, "Not looking up '%s', already an IP address.", resolvedHostname.c_str()); - return resolvedHostname; - } - - // Now use the configured primary DNS server to do a lookup. - // If auto DNS, use the server from that config. - std::string dnsServer; - if (g_Config.bInfrastructureAutoDNS && !GetInfraDNSConfig().dns.empty()) { - dnsServer = GetInfraDNSConfig().dns; - } else { - dnsServer = g_Config.sInfrastructureDNSServer; - } - - if (net::DirectDNSLookupIPV4(dnsServer.c_str(), resolvedHostname.c_str(), &resolvedAddr)) { - char temp[32]; - inet_ntop(AF_INET, &resolvedAddr, temp, sizeof(temp)); - INFO_LOG(Log::sceNet, "Direct lookup of '%s' from '%s' succeeded: %s", resolvedHostname.c_str(), dnsServer.c_str(), temp); - return std::string(temp); - } - - WARN_LOG(Log::sceNet, "Direct DNS lookup of '%s' at DNS server '%s' failed. Will try OS DNS...", resolvedHostname.c_str(), dnsServer.c_str()); - return resolvedHostname; -} - void InitLocalhostIP() { // The entire 127.*.*.* is reserved for loopback. uint32_t localIP = 0x7F000001 + PPSSPP_ID - 1; diff --git a/Core/HLE/sceNet.h b/Core/HLE/sceNet.h index 832ec75d82..e53782f609 100644 --- a/Core/HLE/sceNet.h +++ b/Core/HLE/sceNet.h @@ -125,7 +125,6 @@ bool IsNetworkConnected(); void StartInfraJsonDownload(); // Polls the fetch, if returns true, jsonOutput should be looked at. If it's empty, something went very wrong as we fallback on the asset file. bool PollInfraJsonDownload(std::string *jsonOutput); -std::string ProcessHostnameWithInfraDNS(const std::string& hostname); bool LoadAutoDNS(std::string_view json); void DeleteAutoDNSCacheFile(); diff --git a/Core/HLE/sceNetResolver.cpp b/Core/HLE/sceNetResolver.cpp index b4547b9289..e0f4a27b43 100644 --- a/Core/HLE/sceNetResolver.cpp +++ b/Core/HLE/sceNetResolver.cpp @@ -89,7 +89,7 @@ static int NetResolver_StartNtoA(NetResolver *resolver, u32 hostnamePtr, u32 inA std::string hostname = std::string(safe_string(Memory::GetCharPointer(hostnamePtr))); // Process hostname with infra-DNS - std::string processedHostname = ProcessHostnameWithInfraDNS(hostname); + std::string processedHostname = net::ProcessHostnameWithInfraDNS(hostname); // Flag resolver as in-progress - not relevant for sync functions but potentially relevant for async resolver->isRunning = true;