#define _GNU_SOURCE #include #include #include #include #include #include #include #include void doit(const char *name, const char *family_name, int family) { printf("--- looking up '%s' for family %s (%i)\n", name, family_name, family); struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_NUMERICHOST; hints.ai_family = family; struct addrinfo *hostaddr = 0; int res = getaddrinfo(name, "telnet", &hints, &hostaddr); if (res == EAI_NONAME) { printf("getaddrinfo(...) = EAI_NONAME, trying again with AI_CANONNAME\n"); hints.ai_flags = AI_CANONNAME; res = getaddrinfo(name, "telnet", &hints, &hostaddr); } if (res == EAI_NONAME) { printf("getaddrinfo(...) = EAI_NONAME ... FAIL\n"); } else if (res) { printf("getaddrinfo(...) = %i ... FAIL\n", res); } else { printf("getaddrinfo(...) = %i\n", res); while (hostaddr) { char name[1024], service[1024]; res = getnameinfo(hostaddr->ai_addr, hostaddr->ai_addrlen, name, sizeof(name), service, sizeof(service), NI_NUMERICHOST | NI_NUMERICSERV); printf("getnameinfo(...) = %i\n", res); printf("\tname = %s\n", name); printf("\tservice = %s\n", service); hostaddr = hostaddr->ai_next; } } freeaddrinfo(hostaddr); } int main(int argc, char *argv[]) { const char *name = (argc > 1 ? argv[1] : "localhost"); #define doit(name, family) doit(name, #family, family) doit(name, 0); doit(name, AF_INET); doit(name, AF_INET6); puts(""); return 0; }