Loading ares/CHANGES +5 −0 Original line number Diff line number Diff line Changelog for the c-ares project * Nov 25 2008 (Yang Tse) - In preparation for the upcomming IPv6 nameservers patch, the internal ares_addr union is now changed into an internal struct which also holds the address family. * Nov 19 2008 (Daniel Stenberg) - Brad Spencer brought the new function ares_gethostbyname_file() which simply resolves a host name from the given file, using the regular hosts syntax. Loading ares/ares_gethostbyaddr.c +22 −23 Original line number Diff line number Diff line Loading @@ -52,8 +52,7 @@ struct addr_query { /* Arguments passed to ares_gethostbyaddr() */ ares_channel channel; union ares_addr addr; int family; struct ares_addr addr; ares_host_callback callback; void *arg; Loading @@ -66,8 +65,8 @@ static void addr_callback(void *arg, int status, int timeouts, unsigned char *abuf, int alen); static void end_aquery(struct addr_query *aquery, int status, struct hostent *host); static int file_lookup(union ares_addr *addr, int family, struct hostent **host); static void ptr_rr_name(char *name, int family, union ares_addr *addr); static int file_lookup(struct ares_addr *addr, struct hostent **host); static void ptr_rr_name(char *name, struct ares_addr *addr); void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, int family, ares_host_callback callback, void *arg) Loading Loading @@ -95,10 +94,10 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, } aquery->channel = channel; if (family == AF_INET) memcpy(&aquery->addr.addr4, addr, sizeof(struct in_addr)); memcpy(&aquery->addr.addrV4, addr, sizeof(struct in_addr)); else memcpy(&aquery->addr.addr6, addr, sizeof(struct in6_addr)); aquery->family = family; memcpy(&aquery->addr.addrV6, addr, sizeof(struct in6_addr)); aquery->addr.family = family; aquery->callback = callback; aquery->arg = arg; aquery->remaining_lookups = channel->lookups; Loading @@ -119,13 +118,13 @@ static void next_lookup(struct addr_query *aquery) switch (*p) { case 'b': ptr_rr_name(name, aquery->family, &aquery->addr); ptr_rr_name(name, &aquery->addr); aquery->remaining_lookups = p + 1; ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, aquery); return; case 'f': status = file_lookup(&aquery->addr, aquery->family, &host); status = file_lookup(&aquery->addr, &host); /* this status check below previously checked for !ARES_ENOTFOUND, but we should not assume that this single error code is the one Loading @@ -150,11 +149,11 @@ static void addr_callback(void *arg, int status, int timeouts, aquery->timeouts += timeouts; if (status == ARES_SUCCESS) { if (aquery->family == AF_INET) status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr4, if (aquery->addr.family == AF_INET) status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV4, sizeof(struct in_addr), AF_INET, &host); else status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr6, status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV6, sizeof(struct in6_addr), AF_INET6, &host); end_aquery(aquery, status, host); } Loading @@ -173,7 +172,7 @@ static void end_aquery(struct addr_query *aquery, int status, free(aquery); } static int file_lookup(union ares_addr *addr, int family, struct hostent **host) static int file_lookup(struct ares_addr *addr, struct hostent **host) { FILE *fp; int status; Loading Loading @@ -226,21 +225,21 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) return ARES_EFILE; } } while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) while ((status = ares__get_hostent(fp, addr->family, host)) == ARES_SUCCESS) { if (family != (*host)->h_addrtype) if (addr->family != (*host)->h_addrtype) { ares_free_hostent(*host); continue; } if (family == AF_INET) if (addr->family == AF_INET) { if (memcmp((*host)->h_addr, &addr->addr4, sizeof(struct in_addr)) == 0) if (memcmp((*host)->h_addr, &addr->addrV4, sizeof(struct in_addr)) == 0) break; } else if (family == AF_INET6) else if (addr->family == AF_INET6) { if (memcmp((*host)->h_addr, &addr->addr6, sizeof(struct in6_addr)) == 0) if (memcmp((*host)->h_addr, &addr->addrV6, sizeof(struct in6_addr)) == 0) break; } ares_free_hostent(*host); Loading @@ -253,11 +252,11 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) return status; } static void ptr_rr_name(char *name, int family, union ares_addr *addr) static void ptr_rr_name(char *name, struct ares_addr *addr) { if (family == AF_INET) if (addr->family == AF_INET) { unsigned long laddr = ntohl(addr->addr4.s_addr); unsigned long laddr = ntohl(addr->addrV4.s_addr); int a1 = (int)((laddr >> 24) & 0xff); int a2 = (int)((laddr >> 16) & 0xff); int a3 = (int)((laddr >> 8) & 0xff); Loading @@ -266,7 +265,7 @@ static void ptr_rr_name(char *name, int family, union ares_addr *addr) } else { unsigned char *bytes = (unsigned char *)&addr->addr6.s6_addr; unsigned char *bytes = (unsigned char *)&addr->addrV6.s6_addr; sprintf(name, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x." "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", Loading ares/ares_gethostbyname.c +4 −4 Original line number Diff line number Diff line Loading @@ -432,13 +432,13 @@ static int get_address_index(struct in_addr *addr, struct apattern *sortlist, continue; if (sortlist[i].type == PATTERN_MASK) { if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr) == sortlist[i].addr.addr4.s_addr) if ((addr->s_addr & sortlist[i].mask.addr4.s_addr) == sortlist[i].addrV4.s_addr) break; } else { if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr, if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr, sortlist[i].mask.bits)) break; } Loading Loading @@ -485,7 +485,7 @@ static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist, { if (sortlist[i].family != AF_INET6) continue; if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addr.addr6.s6_addr, sortlist[i].mask.bits)) if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addrV6.s6_addr, sortlist[i].mask.bits)) break; } return i; Loading ares/ares_init.c +10 −10 Original line number Diff line number Diff line Loading @@ -1179,8 +1179,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, /* Lets see if it is CIDR */ /* First we'll try IPv6 */ if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf, &pat.addr.addr6, sizeof(pat.addr.addr6))) > 0) &pat.addrV6, sizeof(pat.addrV6))) > 0) { pat.type = PATTERN_CIDR; pat.mask.bits = (unsigned short)bits; Loading @@ -1189,8 +1189,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, return ARES_ENOMEM; } if (ipbufpfx[0] && (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4, sizeof(pat.addr.addr4))) > 0) (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4, sizeof(pat.addrV4))) > 0) { pat.type = PATTERN_CIDR; pat.mask.bits = (unsigned short)bits; Loading @@ -1199,13 +1199,13 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, return ARES_ENOMEM; } /* See if it is just a regular IP */ else if (ip_addr(ipbuf, (int)(q-str), &pat.addr.addr4) == 0) else if (ip_addr(ipbuf, (int)(q-str), &pat.addrV4) == 0) { if (ipbufpfx[0]) { memcpy(ipbuf, str, (int)(q-str)); ipbuf[(int)(q-str)] = '\0'; if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0) if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr4) != 0) natural_mask(&pat); } else Loading Loading @@ -1420,17 +1420,17 @@ static void natural_mask(struct apattern *pat) /* Store a host-byte-order copy of pat in a struct in_addr. Icky, * but portable. */ addr.s_addr = ntohl(pat->addr.addr4.s_addr); addr.s_addr = ntohl(pat->addrV4.s_addr); /* This is out of date in the CIDR world, but some people might * still rely on it. */ if (IN_CLASSA(addr.s_addr)) pat->mask.addr.addr4.s_addr = htonl(IN_CLASSA_NET); pat->mask.addr4.s_addr = htonl(IN_CLASSA_NET); else if (IN_CLASSB(addr.s_addr)) pat->mask.addr.addr4.s_addr = htonl(IN_CLASSB_NET); pat->mask.addr4.s_addr = htonl(IN_CLASSB_NET); else pat->mask.addr.addr4.s_addr = htonl(IN_CLASSC_NET); pat->mask.addr4.s_addr = htonl(IN_CLASSC_NET); } #endif /* initialize an rc4 key. If possible a cryptographically secure random key Loading ares/ares_private.h +18 −8 Original line number Diff line number Diff line Loading @@ -115,6 +115,16 @@ # define writev(s,ptr,cnt) ares_writev(s,ptr,cnt) #endif struct ares_addr { int family; union { struct in_addr addr4; struct in6_addr addr6; } addr; }; #define addrV4 addr.addr4 #define addrV6 addr.addr6 struct query; struct send_request { Loading Loading @@ -213,16 +223,16 @@ struct query_server_info { #define PATTERN_MASK 0x1 #define PATTERN_CIDR 0x2 union ares_addr { struct apattern { union { struct in_addr addr4; struct in6_addr addr6; }; struct apattern { union ares_addr addr; } addr; union { union ares_addr addr; struct in_addr addr4; struct in6_addr addr6; unsigned short bits; } mask; int family; Loading Loading
ares/CHANGES +5 −0 Original line number Diff line number Diff line Changelog for the c-ares project * Nov 25 2008 (Yang Tse) - In preparation for the upcomming IPv6 nameservers patch, the internal ares_addr union is now changed into an internal struct which also holds the address family. * Nov 19 2008 (Daniel Stenberg) - Brad Spencer brought the new function ares_gethostbyname_file() which simply resolves a host name from the given file, using the regular hosts syntax. Loading
ares/ares_gethostbyaddr.c +22 −23 Original line number Diff line number Diff line Loading @@ -52,8 +52,7 @@ struct addr_query { /* Arguments passed to ares_gethostbyaddr() */ ares_channel channel; union ares_addr addr; int family; struct ares_addr addr; ares_host_callback callback; void *arg; Loading @@ -66,8 +65,8 @@ static void addr_callback(void *arg, int status, int timeouts, unsigned char *abuf, int alen); static void end_aquery(struct addr_query *aquery, int status, struct hostent *host); static int file_lookup(union ares_addr *addr, int family, struct hostent **host); static void ptr_rr_name(char *name, int family, union ares_addr *addr); static int file_lookup(struct ares_addr *addr, struct hostent **host); static void ptr_rr_name(char *name, struct ares_addr *addr); void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, int family, ares_host_callback callback, void *arg) Loading Loading @@ -95,10 +94,10 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, } aquery->channel = channel; if (family == AF_INET) memcpy(&aquery->addr.addr4, addr, sizeof(struct in_addr)); memcpy(&aquery->addr.addrV4, addr, sizeof(struct in_addr)); else memcpy(&aquery->addr.addr6, addr, sizeof(struct in6_addr)); aquery->family = family; memcpy(&aquery->addr.addrV6, addr, sizeof(struct in6_addr)); aquery->addr.family = family; aquery->callback = callback; aquery->arg = arg; aquery->remaining_lookups = channel->lookups; Loading @@ -119,13 +118,13 @@ static void next_lookup(struct addr_query *aquery) switch (*p) { case 'b': ptr_rr_name(name, aquery->family, &aquery->addr); ptr_rr_name(name, &aquery->addr); aquery->remaining_lookups = p + 1; ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, aquery); return; case 'f': status = file_lookup(&aquery->addr, aquery->family, &host); status = file_lookup(&aquery->addr, &host); /* this status check below previously checked for !ARES_ENOTFOUND, but we should not assume that this single error code is the one Loading @@ -150,11 +149,11 @@ static void addr_callback(void *arg, int status, int timeouts, aquery->timeouts += timeouts; if (status == ARES_SUCCESS) { if (aquery->family == AF_INET) status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr4, if (aquery->addr.family == AF_INET) status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV4, sizeof(struct in_addr), AF_INET, &host); else status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr6, status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV6, sizeof(struct in6_addr), AF_INET6, &host); end_aquery(aquery, status, host); } Loading @@ -173,7 +172,7 @@ static void end_aquery(struct addr_query *aquery, int status, free(aquery); } static int file_lookup(union ares_addr *addr, int family, struct hostent **host) static int file_lookup(struct ares_addr *addr, struct hostent **host) { FILE *fp; int status; Loading Loading @@ -226,21 +225,21 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) return ARES_EFILE; } } while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) while ((status = ares__get_hostent(fp, addr->family, host)) == ARES_SUCCESS) { if (family != (*host)->h_addrtype) if (addr->family != (*host)->h_addrtype) { ares_free_hostent(*host); continue; } if (family == AF_INET) if (addr->family == AF_INET) { if (memcmp((*host)->h_addr, &addr->addr4, sizeof(struct in_addr)) == 0) if (memcmp((*host)->h_addr, &addr->addrV4, sizeof(struct in_addr)) == 0) break; } else if (family == AF_INET6) else if (addr->family == AF_INET6) { if (memcmp((*host)->h_addr, &addr->addr6, sizeof(struct in6_addr)) == 0) if (memcmp((*host)->h_addr, &addr->addrV6, sizeof(struct in6_addr)) == 0) break; } ares_free_hostent(*host); Loading @@ -253,11 +252,11 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) return status; } static void ptr_rr_name(char *name, int family, union ares_addr *addr) static void ptr_rr_name(char *name, struct ares_addr *addr) { if (family == AF_INET) if (addr->family == AF_INET) { unsigned long laddr = ntohl(addr->addr4.s_addr); unsigned long laddr = ntohl(addr->addrV4.s_addr); int a1 = (int)((laddr >> 24) & 0xff); int a2 = (int)((laddr >> 16) & 0xff); int a3 = (int)((laddr >> 8) & 0xff); Loading @@ -266,7 +265,7 @@ static void ptr_rr_name(char *name, int family, union ares_addr *addr) } else { unsigned char *bytes = (unsigned char *)&addr->addr6.s6_addr; unsigned char *bytes = (unsigned char *)&addr->addrV6.s6_addr; sprintf(name, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x." "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", Loading
ares/ares_gethostbyname.c +4 −4 Original line number Diff line number Diff line Loading @@ -432,13 +432,13 @@ static int get_address_index(struct in_addr *addr, struct apattern *sortlist, continue; if (sortlist[i].type == PATTERN_MASK) { if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr) == sortlist[i].addr.addr4.s_addr) if ((addr->s_addr & sortlist[i].mask.addr4.s_addr) == sortlist[i].addrV4.s_addr) break; } else { if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr, if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr, sortlist[i].mask.bits)) break; } Loading Loading @@ -485,7 +485,7 @@ static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist, { if (sortlist[i].family != AF_INET6) continue; if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addr.addr6.s6_addr, sortlist[i].mask.bits)) if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addrV6.s6_addr, sortlist[i].mask.bits)) break; } return i; Loading
ares/ares_init.c +10 −10 Original line number Diff line number Diff line Loading @@ -1179,8 +1179,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, /* Lets see if it is CIDR */ /* First we'll try IPv6 */ if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf, &pat.addr.addr6, sizeof(pat.addr.addr6))) > 0) &pat.addrV6, sizeof(pat.addrV6))) > 0) { pat.type = PATTERN_CIDR; pat.mask.bits = (unsigned short)bits; Loading @@ -1189,8 +1189,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, return ARES_ENOMEM; } if (ipbufpfx[0] && (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4, sizeof(pat.addr.addr4))) > 0) (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4, sizeof(pat.addrV4))) > 0) { pat.type = PATTERN_CIDR; pat.mask.bits = (unsigned short)bits; Loading @@ -1199,13 +1199,13 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, return ARES_ENOMEM; } /* See if it is just a regular IP */ else if (ip_addr(ipbuf, (int)(q-str), &pat.addr.addr4) == 0) else if (ip_addr(ipbuf, (int)(q-str), &pat.addrV4) == 0) { if (ipbufpfx[0]) { memcpy(ipbuf, str, (int)(q-str)); ipbuf[(int)(q-str)] = '\0'; if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0) if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr4) != 0) natural_mask(&pat); } else Loading Loading @@ -1420,17 +1420,17 @@ static void natural_mask(struct apattern *pat) /* Store a host-byte-order copy of pat in a struct in_addr. Icky, * but portable. */ addr.s_addr = ntohl(pat->addr.addr4.s_addr); addr.s_addr = ntohl(pat->addrV4.s_addr); /* This is out of date in the CIDR world, but some people might * still rely on it. */ if (IN_CLASSA(addr.s_addr)) pat->mask.addr.addr4.s_addr = htonl(IN_CLASSA_NET); pat->mask.addr4.s_addr = htonl(IN_CLASSA_NET); else if (IN_CLASSB(addr.s_addr)) pat->mask.addr.addr4.s_addr = htonl(IN_CLASSB_NET); pat->mask.addr4.s_addr = htonl(IN_CLASSB_NET); else pat->mask.addr.addr4.s_addr = htonl(IN_CLASSC_NET); pat->mask.addr4.s_addr = htonl(IN_CLASSC_NET); } #endif /* initialize an rc4 key. If possible a cryptographically secure random key Loading
ares/ares_private.h +18 −8 Original line number Diff line number Diff line Loading @@ -115,6 +115,16 @@ # define writev(s,ptr,cnt) ares_writev(s,ptr,cnt) #endif struct ares_addr { int family; union { struct in_addr addr4; struct in6_addr addr6; } addr; }; #define addrV4 addr.addr4 #define addrV6 addr.addr6 struct query; struct send_request { Loading Loading @@ -213,16 +223,16 @@ struct query_server_info { #define PATTERN_MASK 0x1 #define PATTERN_CIDR 0x2 union ares_addr { struct apattern { union { struct in_addr addr4; struct in6_addr addr6; }; struct apattern { union ares_addr addr; } addr; union { union ares_addr addr; struct in_addr addr4; struct in6_addr addr6; unsigned short bits; } mask; int family; Loading