コード例 #1
0
ファイル: dns_utils.c プロジェクト: AsherBond/ikran
/*
 *  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;
}
コード例 #2
0
ファイル: misc.c プロジェクト: AshishNamdev/mozilla-central
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;
    }
}