tcpdump mailing list archives

[PATCH 1/3] Add getnameinfo support to getname and getname6.


From: Miroslav Lichvar <mlichvar () redhat com>
Date: Fri, 14 Aug 2009 12:19:10 +0200

---
 addrtoname.c |   44 ++++++++++++++++++++++++++++++++++++--------
 1 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/addrtoname.c b/addrtoname.c
index e67d114..593840c 100644
--- a/addrtoname.c
+++ b/addrtoname.c
@@ -224,7 +224,6 @@ static u_int32_t f_localnet;
 const char *
 getname(const u_char *ap)
 {
-       register struct hostent *hp;
        u_int32_t addr;
        static struct hnamemem *p;              /* static for longjmp() */
 
@@ -236,6 +235,7 @@ getname(const u_char *ap)
        }
        p->addr = addr;
        p->nxt = newhnamemem();
+       p->name = NULL;
 
        /*
         * Print names unless:
@@ -246,12 +246,26 @@ getname(const u_char *ap)
         */
        if (!nflag &&
            (addr & f_netmask) == f_localnet) {
+#ifdef HAVE_GETNAMEINFO
+               struct sockaddr_in sa;
+               char hbuf[NI_MAXHOST];
+
+               memset(&sa, 0, sizeof (sa));
+               sa.sin_family = AF_INET;
+               sa.sin_addr.s_addr = addr;
+               if (!getnameinfo((struct sockaddr *)&sa, sizeof (sa),
+                                       hbuf, sizeof (hbuf), NULL, 0, 0))
+                       p->name = strdup(hbuf);
+#else
+               register struct hostent *hp;
                hp = gethostbyaddr((char *)&addr, 4, AF_INET);
-               if (hp) {
-                       char *dotp;
-
+               if (hp)
                        p->name = strdup(hp->h_name);
+#endif
+               if (p->name != NULL) {
                        if (Nflag) {
+                               char *dotp;
+
                                /* Remove domain qualifications */
                                dotp = strchr(p->name, '.');
                                if (dotp)
@@ -272,7 +286,6 @@ getname(const u_char *ap)
 const char *
 getname6(const u_char *ap)
 {
-       register struct hostent *hp;
        struct in6_addr addr;
        static struct h6namemem *p;             /* static for longjmp() */
        register const char *cp;
@@ -286,17 +299,32 @@ getname6(const u_char *ap)
        }
        p->addr = addr;
        p->nxt = newh6namemem();
+       p->name = NULL;
 
        /*
         * Do not print names if -n was given.
         */
        if (!nflag) {
+#ifdef HAVE_GETNAMEINFO
+               struct sockaddr_in6 sa;
+               char hbuf[NI_MAXHOST];
+
+               memset(&sa, 0, sizeof (sa));
+               sa.sin6_family = AF_INET6;
+               sa.sin6_addr = addr;
+               if (!getnameinfo((struct sockaddr *)&sa, sizeof (sa),
+                                       hbuf, sizeof (hbuf), NULL, 0, 0))
+                       p->name = strdup(hbuf);
+#else
+               register struct hostent *hp;
                hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6);
-               if (hp) {
-                       char *dotp;
-
+               if (hp)
                        p->name = strdup(hp->h_name);
+#endif
+               if (p->name != NULL) {
                        if (Nflag) {
+                               char *dotp;
+
                                /* Remove domain qualifications */
                                dotp = strchr(p->name, '.');
                                if (dotp)
-- 
1.6.2.5

-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.


Current thread: