diff options
author | hrs <hrs@FreeBSD.org> | 2013-08-17 17:23:42 +0000 |
---|---|---|
committer | hrs <hrs@FreeBSD.org> | 2013-08-17 17:23:42 +0000 |
commit | 17f8b7cb0b8421fd2269fa021669c9b6b07c7e0a (patch) | |
tree | 60b1e878b1b1f18ee5716144a812deca3b3c0789 /usr.bin/netstat | |
parent | 1b4affdd250f5e8bf3c007e7cc9a8b5b620a3c1f (diff) | |
download | FreeBSD-src-17f8b7cb0b8421fd2269fa021669c9b6b07c7e0a.zip FreeBSD-src-17f8b7cb0b8421fd2269fa021669c9b6b07c7e0a.tar.gz |
- 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.
Diffstat (limited to 'usr.bin/netstat')
-rw-r--r-- | usr.bin/netstat/inet6.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/usr.bin/netstat/inet6.c b/usr.bin/netstat/inet6.c index a3bbc31..78383ac 100644 --- a/usr.bin/netstat/inet6.c +++ b/usr.bin/netstat/inet6.c @@ -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, '.')) && - !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 + 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; + 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*/ |