| 59 | } |
| 60 | |
| 61 | bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup) |
| 62 | { |
| 63 | vIP.clear(); |
| 64 | |
| 65 | { |
| 66 | CNetAddr addr; |
| 67 | if (addr.SetSpecial(std::string(pszName))) { |
| 68 | vIP.push_back(addr); |
| 69 | return true; |
| 70 | } |
| 71 | } |
| 72 | |
| 73 | struct addrinfo aiHint; |
| 74 | memset(&aiHint, 0, sizeof(struct addrinfo)); |
| 75 | |
| 76 | aiHint.ai_socktype = SOCK_STREAM; |
| 77 | aiHint.ai_protocol = IPPROTO_TCP; |
| 78 | aiHint.ai_family = AF_UNSPEC; |
| 79 | #ifdef WIN32 |
| 80 | aiHint.ai_flags = fAllowLookup ? 0 : AI_NUMERICHOST; |
| 81 | #else |
| 82 | aiHint.ai_flags = fAllowLookup ? AI_ADDRCONFIG : AI_NUMERICHOST; |
| 83 | #endif |
| 84 | struct addrinfo *aiRes = nullptr; |
| 85 | int nErr = getaddrinfo(pszName, nullptr, &aiHint, &aiRes); |
| 86 | if (nErr) |
| 87 | return false; |
| 88 | |
| 89 | struct addrinfo *aiTrav = aiRes; |
| 90 | while (aiTrav != nullptr && (nMaxSolutions == 0 || vIP.size() < nMaxSolutions)) |
| 91 | { |
| 92 | CNetAddr resolved; |
| 93 | if (aiTrav->ai_family == AF_INET) |
| 94 | { |
| 95 | assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in)); |
| 96 | resolved = CNetAddr(((struct sockaddr_in*)(aiTrav->ai_addr))->sin_addr); |
| 97 | } |
| 98 | |
| 99 | if (aiTrav->ai_family == AF_INET6) |
| 100 | { |
| 101 | assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in6)); |
| 102 | struct sockaddr_in6* s6 = (struct sockaddr_in6*) aiTrav->ai_addr; |
| 103 | resolved = CNetAddr(s6->sin6_addr, s6->sin6_scope_id); |
| 104 | } |
| 105 | /* Never allow resolving to an internal address. Consider any such result invalid */ |
| 106 | if (!resolved.IsInternal()) { |
| 107 | vIP.push_back(resolved); |
| 108 | } |
| 109 | |
| 110 | aiTrav = aiTrav->ai_next; |
| 111 | } |
| 112 | |
| 113 | freeaddrinfo(aiRes); |
| 114 | |
| 115 | return (vIP.size() > 0); |
| 116 | } |
| 117 | |
| 118 | bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup) |
no test coverage detected