2
0
mirror of https://github.com/curl/curl.git synced 2025-03-25 15:50:32 +08:00

- Sebastian made c-ares able to return all PTR-records when doing reverse

lookups. It is not common practice to have multiple PTR-Records for a single
  IP, but its perfectly legal and some sites have those.
This commit is contained in:
Daniel Stenberg 2008-05-07 21:20:45 +00:00
parent 9026dc2da4
commit 836fa69e2e
2 changed files with 31 additions and 2 deletions

@ -2,6 +2,10 @@
* May 7 2008 (Daniel Stenberg) * May 7 2008 (Daniel Stenberg)
- Sebastian made c-ares able to return all PTR-records when doing reverse
lookups. It is not common practice to have multiple PTR-Records for a single
IP, but its perfectly legal and some sites have those.
- Doug Goldstein provided a configure patch: updates autoconf 2.13 usage to - Doug Goldstein provided a configure patch: updates autoconf 2.13 usage to
autoconf 2.57 usage (which is the version you have specified as the minimum autoconf 2.57 usage (which is the version you have specified as the minimum
version). It's a minor change but it does clean up some warnings with newer version). It's a minor change but it does clean up some warnings with newer

@ -44,6 +44,8 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
const unsigned char *aptr; const unsigned char *aptr;
char *ptrname, *hostname, *rr_name, *rr_data; char *ptrname, *hostname, *rr_name, *rr_data;
struct hostent *hostent; struct hostent *hostent;
int aliascnt = 0;
char ** aliases;
/* Set *host to NULL for all failure cases. */ /* Set *host to NULL for all failure cases. */
*host = NULL; *host = NULL;
@ -72,6 +74,12 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
/* Examine each answer resource record (RR) in turn. */ /* Examine each answer resource record (RR) in turn. */
hostname = NULL; hostname = NULL;
aliases = (char **) malloc(8 * sizeof(char *));
if (!aliases)
{
free(ptrname);
return ARES_ENOMEM;
}
for (i = 0; i < (int)ancount; i++) for (i = 0; i < (int)ancount; i++)
{ {
/* Decode the RR up to the data field. */ /* Decode the RR up to the data field. */
@ -99,6 +107,16 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
if (hostname) if (hostname)
free(hostname); free(hostname);
hostname = rr_data; hostname = rr_data;
aliases[aliascnt] = malloc((strlen(rr_data)+1) * sizeof(char *));
if (!aliases[aliascnt])
{
status = ARES_ENOMEM;
break;
}
strncpy(aliases[aliascnt], rr_data, strlen(rr_data)+1);
aliascnt++;
if ((aliascnt%8)==0)
aliases = (char **) realloc(aliases, (aliascnt/16+1) * sizeof(char *));
} }
if (rr_class == C_IN && rr_type == T_CNAME) if (rr_class == C_IN && rr_type == T_CNAME)
@ -134,17 +152,20 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
hostent->h_addr_list[0] = malloc(addrlen); hostent->h_addr_list[0] = malloc(addrlen);
if (hostent->h_addr_list[0]) if (hostent->h_addr_list[0])
{ {
hostent->h_aliases = malloc(sizeof (char *)); hostent->h_aliases = malloc((aliascnt+1) * sizeof (char *));
if (hostent->h_aliases) if (hostent->h_aliases)
{ {
/* Fill in the hostent and return successfully. */ /* Fill in the hostent and return successfully. */
hostent->h_name = hostname; hostent->h_name = hostname;
hostent->h_aliases[0] = NULL; for (i=0 ; i<aliascnt ; i++)
hostent->h_aliases[i] = aliases[i];
hostent->h_aliases[aliascnt] = NULL;
hostent->h_addrtype = family; hostent->h_addrtype = family;
hostent->h_length = addrlen; hostent->h_length = addrlen;
memcpy(hostent->h_addr_list[0], addr, addrlen); memcpy(hostent->h_addr_list[0], addr, addrlen);
hostent->h_addr_list[1] = NULL; hostent->h_addr_list[1] = NULL;
*host = hostent; *host = hostent;
free(aliases);
free(ptrname); free(ptrname);
return ARES_SUCCESS; return ARES_SUCCESS;
} }
@ -156,6 +177,10 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
} }
status = ARES_ENOMEM; status = ARES_ENOMEM;
} }
for (i=0 ; i<aliascnt ; i++)
if (aliases[i])
free(aliases[i]);
free(aliases);
if (hostname) if (hostname)
free(hostname); free(hostname);
free(ptrname); free(ptrname);