- 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:
parent
e5bbc81be8
commit
84dde578a9
|
@ -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*/
|
||||
|
|
Loading…
Reference in New Issue