aboutsummaryrefslogtreecommitdiff
path: root/lib/libutil/realhostname.c
diff options
context:
space:
mode:
authorHajimu UMEMOTO <ume@FreeBSD.org>2000-03-23 17:25:00 +0000
committerHajimu UMEMOTO <ume@FreeBSD.org>2000-03-23 17:25:00 +0000
commit9ed4e87cad6ce8f1e8faf39636d7580bbc769fbd (patch)
tree22270721152f63d2fb344e3e5664386c9f97ea9d /lib/libutil/realhostname.c
parent604f4516eff82a3fb033e1e276819b7cbf7d1fa1 (diff)
downloadsrc-9ed4e87cad6ce8f1e8faf39636d7580bbc769fbd.tar.gz
src-9ed4e87cad6ce8f1e8faf39636d7580bbc769fbd.zip
Return IPv4 native address for IPv4 mapped IPv6 address, even if
A RR is not found. Reviewed by: shin
Notes
Notes: svn path=/head/; revision=58495
Diffstat (limited to 'lib/libutil/realhostname.c')
-rw-r--r--lib/libutil/realhostname.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/lib/libutil/realhostname.c b/lib/libutil/realhostname.c
index 20d453874a6a..a1cd72d20b36 100644
--- a/lib/libutil/realhostname.c
+++ b/lib/libutil/realhostname.c
@@ -158,17 +158,13 @@ realhostname_sa(char *host, size_t hsize, struct sockaddr *addr, int addrlen)
!memcmp(&in6->s6_addr[12], in,
sizeof(*in))) {
result = HOSTNAME_FOUND;
- if (res->ai_canonname == 0) {
+ if (res->ai_canonname == 0 ||
+ strlen(res->ai_canonname) > hsize) {
freeaddrinfo(ores);
goto numeric;
}
- if (strlen(res->ai_canonname) > hsize)
- strncpy(host, inet_ntoa(*in),
- hsize);
- else
- strncpy(host,
- res->ai_canonname,
- hsize);
+ strncpy(host, res->ai_canonname,
+ hsize);
break;
}
}
@@ -176,7 +172,26 @@ realhostname_sa(char *host, size_t hsize, struct sockaddr *addr, int addrlen)
}
freeaddrinfo(ores);
} else {
+ struct sockaddr_in sin;
numeric:
+#ifdef INET6
+ if (addr->sa_family == AF_INET6) {
+ struct sockaddr_in6 *sin6;
+
+ sin6 = (struct sockaddr_in6 *)addr;
+ if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_len = sizeof(struct sockaddr_in);
+ sin.sin_family = AF_INET;
+ sin.sin_port = sin6->sin6_port;
+ memcpy(&sin.sin_addr,
+ &sin6->sin6_addr.s6_addr[12],
+ sizeof(struct in_addr));
+ addr = (struct sockaddr *)&sin;
+ addrlen = sin.sin_len;
+ }
+ }
+#endif
if (getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
NI_NUMERICHOST|NI_WITHSCOPEID) == 0)
strncpy(host, buf, hsize);