void test_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints) { int family = 0; int type = 0; int proto = 0; int flags = 0; static const char * errMap[] = { [EAI_NONAME] = "EAI_NONAME", [EAI_SERVICE] = "EAI_SERVICE", [EAI_FAIL] = "EAI_FAIL", [EAI_MEMORY] = "EAI_MEMORY", [EAI_FAMILY] = "EAI_FAMILY", [EAI_SOCKTYPE] = "EAI_SOCKTYPE", [EAI_BADFLAGS] = "EAI_BADFLAGS", [EAI_ADDRFAMILY] = "EAI_ADDRFAMILY", [EAI_NODATA] = "EAI_NODATA" }; if (hints != NULL) { family = hints->ai_family; type = hints->ai_socktype; proto = hints->ai_protocol; flags = hints->ai_flags; } printf("getaddrinfo(%s, %s, family=%d, type=%d, proto=%d, flags=%d)\n", nodename, servname, family, type, proto, flags); struct addrinfo * res; int err = lwip_getaddrinfo(nodename, servname, hints, &res); if (err != 0) { printf("-> Error %s\n", errMap[err]); } else { struct addrinfo * info = res; while (info) { printf(" family: %d, socktype: %d, proto: %d, name: %s, addr: ", info->ai_family, info->ai_socktype, info->ai_protocol, info->ai_canonname); if (info->ai_addr->sa_family == AF_INET) { struct sockaddr_in * sa = (struct sockaddr_in *)info->ai_addr; printf("(%s, %d)\n", ip4addr_ntoa((const ip4_addr_t *) &(sa->sin_addr)), lwip_ntohs(sa->sin_port)); } else { struct sockaddr_in6 * sa = (struct sockaddr_in6 *)info->ai_addr; printf("(%s, %d)\n", ip6addr_ntoa((const ip6_addr_t *) &(sa->sin6_addr)), lwip_ntohs(sa->sin6_port)); } info = info->ai_next; } } lwip_freeaddrinfo(res); } static void testAddrinfo(void) { struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_NUMERICHOST; test_getaddrinfo("1.2.3.4", "42", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; test_getaddrinfo(NULL, "1234", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET6; hints.ai_flags = AI_PASSIVE; test_getaddrinfo(NULL, "1235", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_socktype = SOCK_STREAM; test_getaddrinfo(NULL, "1236", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_protocol = IPPROTO_UDP; hints.ai_flags = AI_PASSIVE; test_getaddrinfo(NULL, "1237", &hints); memset(&hints, 0, sizeof(struct addrinfo)); test_getaddrinfo("dual.tlund.se", "55", &hints); memset(&hints, 0, sizeof(struct addrinfo)); test_getaddrinfo("ipv4.tlund.se", "55", &hints); memset(&hints, 0, sizeof(struct addrinfo)); test_getaddrinfo("ipv6.tlund.se", "55", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_protocol = IPPROTO_TCP; hints.ai_family = AF_INET; test_getaddrinfo("dual.tlund.se", "80", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_socktype = SOCK_DGRAM; hints.ai_family = AF_INET6; test_getaddrinfo("dual.tlund.se", "80", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET6; hints.ai_flags = AI_CANONNAME; test_getaddrinfo("dual.tlund.se", "80", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_family = AF_INET; test_getaddrinfo("dual.tlund.se", "80", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_protocol = 42; hints.ai_family = AF_INET6; test_getaddrinfo("dual.tlund.se", "80", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_CANONNAME; test_getaddrinfo(NULL, "1111", &hints); memset(&hints, 0, sizeof(struct addrinfo)); test_getaddrinfo(NULL, NULL, &hints); memset(&hints, 0, sizeof(struct addrinfo)); test_getaddrinfo("invalid.domain", "9999", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET6; test_getaddrinfo("ipv4.tlund.se", "80", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET; hints.ai_flags = AI_NUMERICHOST; test_getaddrinfo("2a00:801:f::195", "123", &hints); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET; hints.ai_flags = AI_NUMERICHOST; test_getaddrinfo("invalid.ip.addr", "879", &hints); }