diff options
author | Hajimu UMEMOTO <ume@FreeBSD.org> | 2000-03-23 17:25:00 +0000 |
---|---|---|
committer | Hajimu UMEMOTO <ume@FreeBSD.org> | 2000-03-23 17:25:00 +0000 |
commit | 9ed4e87cad6ce8f1e8faf39636d7580bbc769fbd (patch) | |
tree | 22270721152f63d2fb344e3e5664386c9f97ea9d /lib/libutil/realhostname.c | |
parent | 604f4516eff82a3fb033e1e276819b7cbf7d1fa1 (diff) | |
download | src-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.c | 31 |
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); |