/* * dnsGetHostByName * * DESCRIPTION: Perform an DNS lookup of the name specified * * RETURNS: returns 0 for success or DNS_ERR_NOHOST * */ cc_int32_t dnsGetHostByName (const char *hname, cpr_ip_addr_t *ipaddr_ptr, cc_int32_t timeout, cc_int32_t retries) { uint32_t ip_address; struct hostent *dns_response; #ifdef IPV6_STACK_ENABLED uint32_t err; uint16_t ip_valid; char ip_addr[MAX_IPADDR_STR_LEN]; struct addrinfo hints, *result; struct sockaddr sa; #endif #ifdef IPV6_STACK_ENABLED /* Check if the IPv6 address */ ip_valid = cpr_inet_pton(AF_INET6, hname, ip_addr); if (ip_valid) { ipaddr_ptr->type = CPR_IP_ADDR_IPV6; cpr_memcopy(ipaddr_ptr->u.ip6.addr.base8, ip_addr, 16); return(0); } #endif ip_address = inet_addr(hname); if (ip_address != INADDR_NONE) { ipaddr_ptr->u.ip4 = ip_address; ipaddr_ptr->type = CPR_IP_ADDR_IPV4; return 0; } else { #ifdef IPV6_STACK_ENABLED memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_INET6; err = getaddrinfo(hname, NULL, &hints, &result); if (err) { return DNS_ERR_NOHOST; } while (result) { sa = result->ai_addr; if (sa->family == AF_INET) { ipaddr_ptr->type = CPR_IP_ADDR_IPV4; ip_addr->u.ip4 = ((cpr_sockaddr_in_t *)from)->sin_addr.s_addr; } else if (sa->family == AF_INET6) { //Todo IPv6: Add getaddrinfo() functioncall to get the IPv6 address. ipaddr_ptr->type = CPR_IP_ADDR_IPV6; ip_addr->u.ip6 = ((cpr_sockaddr_in6_t *)sa)->sin6_addr; } } freeaddrinfo(result); #endif dns_response = gethostbyname(hname); if (dns_response) { ipaddr_ptr->u.ip4 = *(uint32_t *) dns_response->h_addr_list[0]; ipaddr_ptr->type = CPR_IP_ADDR_IPV4; return 0; } } return DNS_ERR_NOHOST; }
uint32_t IPNameCk (char *name, char *addr_error) { char *namePtr = name; char string[4] = { 0, 0, 0, 0 }; int x = 0; int i = 0; uint32_t temp, ip_addr = 0; char ip_addr_out[MAX_IPADDR_STR_LEN]; unsigned long strtoul_result; char *strtoul_end; /* Check if valid IPv6 address */ if (cpr_inet_pton(AF_INET6, name, ip_addr_out)) { *addr_error = FALSE; return TRUE; } *addr_error = TRUE; while (*namePtr != 0) { if ((*namePtr >= 0x30) && (*namePtr <= 0x39)) { if (x > 2) return (0); string[x++] = *namePtr++; } else { if (*namePtr == 0x2e) { if (i > 3) return (0); namePtr++; x = 0; errno = 0; strtoul_result = strtoul(string, &strtoul_end, 10); if (errno || string == strtoul_end || strtoul_result > 255) { return 0; } temp = (uint32_t) strtoul_result; ip_addr |= temp << (24 - (i * 8)); string[0] = 0; string[1] = 0; string[2] = 0; i++; } else return (0); // not an IP address } } if (i == 3) { errno = 0; strtoul_result = strtoul(string, &strtoul_end, 10); if (errno || string == strtoul_end || strtoul_result > 255) { return 0; } temp = (uint32_t) strtoul_result; ip_addr |= temp; *addr_error = FALSE; return (ntohl(ip_addr)); } else { return 0; } }