IPv6 implementation rewritten to use getnameinfo() which is the proper
2003-09-26 Jeffrey Stedfast <fejj@ximian.com> * e-host-utils.c (e_gethostbyaddr_r): IPv6 implementation rewritten to use getnameinfo() which is the proper function to use in this case. Fixes bug #46006 the Right Way (tm). svn path=/trunk/; revision=22720
This commit is contained in:

committed by
Jeffrey Stedfast

parent
99c61843f0
commit
2e42040bad
@ -1,3 +1,9 @@
|
||||
2003-09-26 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* e-host-utils.c (e_gethostbyaddr_r): IPv6 implementation
|
||||
rewritten to use getnameinfo() which is the proper function to use
|
||||
in this case. Fixes bug #46006 the Right Way (tm).
|
||||
|
||||
2003-09-25 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* e-host-utils.c (e_gethostbyaddr_r): Make sure that
|
||||
|
@ -291,47 +291,18 @@ e_gethostbyaddr_r (const char *addr, int addrlen, int type, struct hostent *host
|
||||
char *buf, size_t buflen, int *herr)
|
||||
{
|
||||
#ifdef ENABLE_IPv6
|
||||
struct addrinfo hints, *res;
|
||||
const char *name;
|
||||
int retval, len;
|
||||
|
||||
if ((name = inet_ntop (type, addr, buf, buflen)) == NULL) {
|
||||
if (errno == ENOSPC)
|
||||
return ERANGE;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&hints, 0, sizeof (struct addrinfo));
|
||||
hints.ai_flags = AI_CANONNAME;
|
||||
hints.ai_family = type == AF_INET6 ? PF_INET6 : PF_INET;
|
||||
hints.ai_socktype = 0;
|
||||
hints.ai_protocol = 0;
|
||||
|
||||
if ((retval = getaddrinfo (name, NULL, &hints, &res)) != 0) {
|
||||
if ((retval = getnameinfo (addr, addrlen, buf, buflen, NULL, 0, NI_NAMEREQD)) != 0) {
|
||||
*herr = ai_to_herr (retval);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* If nodename is not null, and if requested by the AI_CANONNAME flag, the ai_canonname
|
||||
* field of the first returned addrinfo structure shall point to a null-terminated
|
||||
* string containing the canonical name corresponding to the input nodename; if the
|
||||
* canonical name is not available, then ai_canonname shall refer to the nodename
|
||||
* argument or a string with the same contents.
|
||||
*
|
||||
* Note: NetBSD seems to set res->ai_canonname to NULL in this case instead.
|
||||
*/
|
||||
if (!res->ai_canonname || !strcmp (res->ai_canonname, name)) {
|
||||
*herr = HOST_NOT_FOUND;
|
||||
return -1;
|
||||
}
|
||||
|
||||
len = ALIGN (strlen (res->ai_canonname) + 1);
|
||||
if (buflen < IPv6_BUFLEN_MIN + len + res->ai_addrlen + sizeof (char *))
|
||||
len = ALIGN (strlen (buf) + 1);
|
||||
if (buflen < IPv6_BUFLEN_MIN + len + addrlen + sizeof (char *))
|
||||
return ERANGE;
|
||||
|
||||
/* h_name */
|
||||
strcpy (buf, res->ai_canonname);
|
||||
host->h_name = buf;
|
||||
buf += len;
|
||||
|
||||
@ -341,16 +312,8 @@ e_gethostbyaddr_r (const char *addr, int addrlen, int type, struct hostent *host
|
||||
buf += sizeof (char *);
|
||||
|
||||
/* h_addrtype and h_length */
|
||||
host->h_length = res->ai_addrlen;
|
||||
if (res->ai_family == PF_INET6) {
|
||||
host->h_addrtype = AF_INET6;
|
||||
|
||||
addr = (char *) &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
|
||||
} else {
|
||||
host->h_addrtype = AF_INET;
|
||||
|
||||
addr = (char *) &((struct sockaddr_in *) res->ai_addr)->sin_addr;
|
||||
}
|
||||
host->h_length = addrlen;
|
||||
host->h_addrtype = type;
|
||||
|
||||
memcpy (buf, addr, host->h_length);
|
||||
addr = buf;
|
||||
@ -361,8 +324,6 @@ e_gethostbyaddr_r (const char *addr, int addrlen, int type, struct hostent *host
|
||||
((char **) buf)[1] = NULL;
|
||||
host->h_addr_list = (char **) buf;
|
||||
|
||||
freeaddrinfo (res);
|
||||
|
||||
return 0;
|
||||
#else /* No support for IPv6 addresses */
|
||||
#ifdef HAVE_GETHOSTBYADDR_R
|
||||
|
Reference in New Issue
Block a user