Blame SOURCES/tcpdump-4.5.0-gethostby.patch

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);