static void free_lookup(rktio_addrinfo_lookup_t *lookup) { #if defined(RKTIO_SYSTEM_WINDOWS) || defined(RKTIO_USE_PTHREADS) if (lookup->result) do_freeaddrinfo(RKTIO_AS_ADDRINFO(lookup->result)); #endif if (lookup->name) free(lookup->name); if (lookup->svc) free(lookup->svc); free(lookup->hints); free(lookup); }
void rktio_addrinfo_free(rktio_t *rktio, rktio_addrinfo_t *a) { do_freeaddrinfo(RKTIO_AS_ADDRINFO(a)); }
int zmq::ip_resolver_t::resolve_getaddrinfo (ip_addr_t *ip_addr_, const char *addr_) { #if defined ZMQ_HAVE_OPENVMS && defined __ia64 __addrinfo64 *res = NULL; __addrinfo64 req; #else addrinfo *res = NULL; addrinfo req; #endif memset (&req, 0, sizeof (req)); // Choose IPv4 or IPv6 protocol family. Note that IPv6 allows for // IPv4-in-IPv6 addresses. req.ai_family = options.ipv6 () ? AF_INET6 : AF_INET; // Arbitrary, not used in the output, but avoids duplicate results. req.ai_socktype = SOCK_STREAM; req.ai_flags = 0; if (options.bindable ()) { req.ai_flags |= AI_PASSIVE; } if (!options.allow_dns ()) { req.ai_flags |= AI_NUMERICHOST; } #if defined AI_V4MAPPED // In this API we only require IPv4-mapped addresses when // no native IPv6 interfaces are available (~AI_ALL). // This saves an additional DNS roundtrip for IPv4 addresses. if (req.ai_family == AF_INET6) { req.ai_flags |= AI_V4MAPPED; } #endif // Resolve the literal address. Some of the error info is lost in case // of error, however, there's no way to report EAI errors via errno. int rc = do_getaddrinfo (addr_, NULL, &req, &res); #if defined AI_V4MAPPED // Some OS do have AI_V4MAPPED defined but it is not supported in getaddrinfo() // returning EAI_BADFLAGS. Detect this and retry if (rc == EAI_BADFLAGS && (req.ai_flags & AI_V4MAPPED)) { req.ai_flags &= ~AI_V4MAPPED; rc = do_getaddrinfo (addr_, NULL, &req, &res); } #endif #if defined ZMQ_HAVE_WINDOWS // Resolve specific case on Windows platform when using IPv4 address // with ZMQ_IPv6 socket option. if ((req.ai_family == AF_INET6) && (rc == WSAHOST_NOT_FOUND)) { req.ai_family = AF_INET; rc = do_getaddrinfo (addr_, NULL, &req, &res); } #endif if (rc) { switch (rc) { case EAI_MEMORY: errno = ENOMEM; break; default: if (options.bindable ()) { errno = ENODEV; } else { errno = EINVAL; } break; } return -1; } // Use the first result. zmq_assert (res != NULL); zmq_assert ((size_t) res->ai_addrlen <= sizeof (*ip_addr_)); memcpy (ip_addr_, res->ai_addr, res->ai_addrlen); // Cleanup getaddrinfo after copying the possibly referenced result. do_freeaddrinfo (res); return 0; }