1
0
mirror of https://github.com/anope/anope.git synced 2026-06-12 19:14:47 +02:00

Allow Anope to look up multiple DNS results.

For fixing bug 1756.
This commit is contained in:
Sadie Powell
2023-04-28 00:28:16 +01:00
parent cc23f6dc01
commit 7f8a0c9d33
2 changed files with 23 additions and 6 deletions
+7
View File
@@ -548,6 +548,13 @@ namespace Anope
*/
extern Anope::string Resolve(const Anope::string &host, int type);
/** Does a blocking dns query and returns all IPs.
* @param host host to look up
* @param type inet addr type
* @return A list of all IPs that the host resolves to
*/
extern std::vector<Anope::string> ResolveMultiple(const Anope::string &host, int type);
/** Generate a string of random letters and numbers
* @param len The length of the string returned
*/
+16 -6
View File
@@ -727,7 +727,13 @@ Anope::string Anope::NormalizeBuffer(const Anope::string &buf)
Anope::string Anope::Resolve(const Anope::string &host, int type)
{
Anope::string result = host;
std::vector<Anope::string> results = Anope::ResolveMultiple(host, type);
return results.empty() ? host : results[0];
}
std::vector<Anope::string> Anope::ResolveMultiple(const Anope::string &host, int type)
{
std::vector<Anope::string> results;
addrinfo hints;
memset(&hints, 0, sizeof(hints));
@@ -738,15 +744,19 @@ Anope::string Anope::Resolve(const Anope::string &host, int type)
addrinfo *addrresult = NULL;
if (getaddrinfo(host.c_str(), NULL, &hints, &addrresult) == 0)
{
sockaddrs addr;
memcpy(static_cast<void*>(&addr), addrresult->ai_addr, addrresult->ai_addrlen);
result = addr.addr();
Log(LOG_DEBUG_2) << "Resolver: " << host << " -> " << result;
for (addrinfo *thisresult = addrresult; thisresult; thisresult = thisresult->ai_next)
{
sockaddrs addr;
memcpy(static_cast<void*>(&addr), thisresult->ai_addr, thisresult->ai_addrlen);
results.push_back(addr.addr());
Log(LOG_DEBUG_2) << "Resolver: " << host << " -> " << addr.addr();
}
freeaddrinfo(addrresult);
}
return result;
return results;
}
Anope::string Anope::Random(size_t len)