aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/ChangeLog6
-rw-r--r--e-util/e-host-utils.c49
2 files changed, 11 insertions, 44 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index 38ee4c5d26..1fc1f8d1d3 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -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
diff --git a/e-util/e-host-utils.c b/e-util/e-host-utils.c
index 1d685019cc..c4057113df 100644
--- a/e-util/e-host-utils.c
+++ b/e-util/e-host-utils.c
@@ -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