- Use getnameinfo(3) instead of gethostbyaddr(3) or inet_ntop(3).

- Fill sin6_scope_id from in6p.sin6_addr.s6_addr[2].  struct inpcb has
  struct in6_addr for the endpoint addresses, so sin6_scope_id must be filled.
This commit is contained in:
Hiroki Sato 2013-08-17 17:23:42 +00:00
parent e5bbc81be8
commit 84dde578a9
1 changed files with 25 additions and 18 deletions

View File

@ -1120,12 +1120,17 @@ inet6print(struct in6_addr *in6, int port, const char *proto, int numeric)
char *
inet6name(struct in6_addr *in6p)
{
char *cp;
struct sockaddr_in6 sin6;
char hbuf[NI_MAXHOST], *cp;
static char line[50];
struct hostent *hp;
static char domain[MAXHOSTNAMELEN];
static int first = 1;
int flags, error;
if (IN6_IS_ADDR_UNSPECIFIED(in6p)) {
strcpy(line, "*");
return (line);
}
if (first && !numeric_addr) {
first = 0;
if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
@ -1134,24 +1139,26 @@ inet6name(struct in6_addr *in6p)
else
domain[0] = 0;
}
cp = 0;
if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
if (hp) {
if ((cp = strchr(hp->h_name, '.')) &&
memset(&sin6, 0, sizeof(sin6));
memcpy(&sin6.sin6_addr, in6p, sizeof(*in6p));
sin6.sin6_family = AF_INET6;
/* XXX: in6p.s6_addr[2] can contain scopeid. */
in6_fillscopeid(&sin6);
flags = (numeric_addr) ? NI_NUMERICHOST : 0;
error = getnameinfo((struct sockaddr *)&sin6, sizeof(sin6), hbuf,
sizeof(hbuf), NULL, 0, flags);
if (error == 0) {
if ((flags & NI_NUMERICHOST) == 0 &&
(cp = strchr(hbuf, '.')) &&
!strcmp(cp + 1, domain))
*cp = 0;
cp = hp->h_name;
}
}
if (IN6_IS_ADDR_UNSPECIFIED(in6p))
strcpy(line, "*");
else if (cp)
strcpy(line, cp);
else
strcpy(line, hbuf);
} else {
/* XXX: this should not happen. */
sprintf(line, "%s",
inet_ntop(AF_INET6, (void *)in6p, ntop_buf,
inet_ntop(AF_INET6, (void *)&sin6.sin6_addr, ntop_buf,
sizeof(ntop_buf)));
}
return (line);
}
#endif /*INET6*/