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:
Jeffrey Stedfast
2003-09-26 16:04:12 +00:00
committed by Jeffrey Stedfast
parent 99c61843f0
commit 2e42040bad
2 changed files with 11 additions and 44 deletions

View File

@ -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

View File

@ -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