|
|
75b7d9 |
diff -up tcpdump-4.5.0/addrtoname.c.gethostby tcpdump-4.5.0/addrtoname.c
|
|
|
75b7d9 |
--- tcpdump-4.5.0/addrtoname.c.gethostby 2013-11-08 09:03:52.166752012 +0100
|
|
|
75b7d9 |
+++ tcpdump-4.5.0/addrtoname.c 2013-11-08 09:04:57.792747210 +0100
|
|
|
75b7d9 |
@@ -224,7 +224,6 @@ static u_int32_t f_localnet;
|
|
|
75b7d9 |
const char *
|
|
|
75b7d9 |
getname(const u_char *ap)
|
|
|
75b7d9 |
{
|
|
|
75b7d9 |
- register struct hostent *hp;
|
|
|
75b7d9 |
u_int32_t addr;
|
|
|
75b7d9 |
static struct hnamemem *p; /* static for longjmp() */
|
|
|
75b7d9 |
|
|
|
75b7d9 |
@@ -246,6 +245,28 @@ getname(const u_char *ap)
|
|
|
75b7d9 |
*/
|
|
|
75b7d9 |
if (!nflag &&
|
|
|
75b7d9 |
(addr & f_netmask) == f_localnet) {
|
|
|
75b7d9 |
+#ifdef HAVE_GETNAMEINFO
|
|
|
75b7d9 |
+ struct sockaddr_in sa;
|
|
|
75b7d9 |
+ char hbuf[NI_MAXHOST];
|
|
|
75b7d9 |
+
|
|
|
75b7d9 |
+ memset(&sa, 0, sizeof (sa));
|
|
|
75b7d9 |
+ sa.sin_family = AF_INET;
|
|
|
75b7d9 |
+ sa.sin_addr.s_addr = addr;
|
|
|
75b7d9 |
+ if (!getnameinfo((struct sockaddr *)&sa, sizeof (sa),
|
|
|
75b7d9 |
+ hbuf, sizeof (hbuf), NULL, 0, 0)) {
|
|
|
75b7d9 |
+ if (Nflag) {
|
|
|
75b7d9 |
+ char *dotp;
|
|
|
75b7d9 |
+
|
|
|
75b7d9 |
+ /* Remove domain qualifications */
|
|
|
75b7d9 |
+ dotp = strchr(hbuf, '.');
|
|
|
75b7d9 |
+ if (dotp)
|
|
|
75b7d9 |
+ *dotp = '\0';
|
|
|
75b7d9 |
+ }
|
|
|
75b7d9 |
+ p->name = strdup(hbuf);
|
|
|
75b7d9 |
+ return p->name;
|
|
|
75b7d9 |
+ }
|
|
|
75b7d9 |
+#else
|
|
|
75b7d9 |
+ register struct hostent *hp;
|
|
|
75b7d9 |
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
|
|
|
75b7d9 |
if (hp) {
|
|
|
75b7d9 |
char *dotp;
|
|
|
75b7d9 |
@@ -259,6 +280,7 @@ getname(const u_char *ap)
|
|
|
75b7d9 |
}
|
|
|
75b7d9 |
return (p->name);
|
|
|
75b7d9 |
}
|
|
|
75b7d9 |
+#endif
|
|
|
75b7d9 |
}
|
|
|
75b7d9 |
p->name = strdup(intoa(addr));
|
|
|
75b7d9 |
return (p->name);
|
|
|
75b7d9 |
@@ -272,7 +294,6 @@ getname(const u_char *ap)
|
|
|
75b7d9 |
const char *
|
|
|
75b7d9 |
getname6(const u_char *ap)
|
|
|
75b7d9 |
{
|
|
|
75b7d9 |
- register struct hostent *hp;
|
|
|
75b7d9 |
union {
|
|
|
75b7d9 |
struct in6_addr addr;
|
|
|
75b7d9 |
struct for_hash_addr {
|
|
|
75b7d9 |
@@ -297,6 +318,28 @@ getname6(const u_char *ap)
|
|
|
75b7d9 |
* Do not print names if -n was given.
|
|
|
75b7d9 |
*/
|
|
|
75b7d9 |
if (!nflag) {
|
|
|
75b7d9 |
+#ifdef HAVE_GETNAMEINFO
|
|
|
75b7d9 |
+ struct sockaddr_in6 sa;
|
|
|
75b7d9 |
+ char hbuf[NI_MAXHOST];
|
|
|
75b7d9 |
+
|
|
|
75b7d9 |
+ memset(&sa, 0, sizeof (sa));
|
|
|
75b7d9 |
+ sa.sin6_family = AF_INET6;
|
|
|
75b7d9 |
+ sa.sin6_addr = addr.addr;
|
|
|
75b7d9 |
+ if (!getnameinfo((struct sockaddr *)&sa, sizeof (sa),
|
|
|
75b7d9 |
+ hbuf, sizeof (hbuf), NULL, 0, 0)) {
|
|
|
75b7d9 |
+ if (Nflag) {
|
|
|
75b7d9 |
+ char *dotp;
|
|
|
75b7d9 |
+
|
|
|
75b7d9 |
+ /* Remove domain qualifications */
|
|
|
75b7d9 |
+ dotp = strchr(hbuf, '.');
|
|
|
75b7d9 |
+ if (dotp)
|
|
|
75b7d9 |
+ *dotp = '\0';
|
|
|
75b7d9 |
+ }
|
|
|
75b7d9 |
+ p->name = strdup(hbuf);
|
|
|
75b7d9 |
+ return p->name;
|
|
|
75b7d9 |
+ }
|
|
|
75b7d9 |
+#else
|
|
|
75b7d9 |
+ register struct hostent *hp;
|
|
|
75b7d9 |
hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6);
|
|
|
75b7d9 |
if (hp) {
|
|
|
75b7d9 |
char *dotp;
|
|
|
75b7d9 |
@@ -310,6 +353,7 @@ getname6(const u_char *ap)
|
|
|
75b7d9 |
}
|
|
|
75b7d9 |
return (p->name);
|
|
|
75b7d9 |
}
|
|
|
75b7d9 |
+#endif
|
|
|
75b7d9 |
}
|
|
|
75b7d9 |
cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
|
|
|
75b7d9 |
p->name = strdup(cp);
|