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>
|
2003-09-25 Jeffrey Stedfast <fejj@ximian.com>
|
||||||
|
|
||||||
* e-host-utils.c (e_gethostbyaddr_r): Make sure that
|
* 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)
|
char *buf, size_t buflen, int *herr)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_IPv6
|
#ifdef ENABLE_IPv6
|
||||||
struct addrinfo hints, *res;
|
|
||||||
const char *name;
|
|
||||||
int retval, len;
|
int retval, len;
|
||||||
|
|
||||||
if ((name = inet_ntop (type, addr, buf, buflen)) == NULL) {
|
if ((retval = getnameinfo (addr, addrlen, buf, buflen, NULL, 0, NI_NAMEREQD)) != 0) {
|
||||||
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) {
|
|
||||||
*herr = ai_to_herr (retval);
|
*herr = ai_to_herr (retval);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If nodename is not null, and if requested by the AI_CANONNAME flag, the ai_canonname
|
len = ALIGN (strlen (buf) + 1);
|
||||||
* field of the first returned addrinfo structure shall point to a null-terminated
|
if (buflen < IPv6_BUFLEN_MIN + len + addrlen + sizeof (char *))
|
||||||
* 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 *))
|
|
||||||
return ERANGE;
|
return ERANGE;
|
||||||
|
|
||||||
/* h_name */
|
/* h_name */
|
||||||
strcpy (buf, res->ai_canonname);
|
|
||||||
host->h_name = buf;
|
host->h_name = buf;
|
||||||
buf += len;
|
buf += len;
|
||||||
|
|
||||||
@ -341,16 +312,8 @@ e_gethostbyaddr_r (const char *addr, int addrlen, int type, struct hostent *host
|
|||||||
buf += sizeof (char *);
|
buf += sizeof (char *);
|
||||||
|
|
||||||
/* h_addrtype and h_length */
|
/* h_addrtype and h_length */
|
||||||
host->h_length = res->ai_addrlen;
|
host->h_length = addrlen;
|
||||||
if (res->ai_family == PF_INET6) {
|
host->h_addrtype = type;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy (buf, addr, host->h_length);
|
memcpy (buf, addr, host->h_length);
|
||||||
addr = buf;
|
addr = buf;
|
||||||
@ -361,8 +324,6 @@ e_gethostbyaddr_r (const char *addr, int addrlen, int type, struct hostent *host
|
|||||||
((char **) buf)[1] = NULL;
|
((char **) buf)[1] = NULL;
|
||||||
host->h_addr_list = (char **) buf;
|
host->h_addr_list = (char **) buf;
|
||||||
|
|
||||||
freeaddrinfo (res);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#else /* No support for IPv6 addresses */
|
#else /* No support for IPv6 addresses */
|
||||||
#ifdef HAVE_GETHOSTBYADDR_R
|
#ifdef HAVE_GETHOSTBYADDR_R
|
||||||
|
Reference in New Issue
Block a user