]> The Tcpdump Group git mirrors - tcpdump/blobdiff - addrtoname.c
Makefile.in: don't remove configure and config.h.in in make distclean.
[tcpdump] / addrtoname.c
index ce81207815ebef62d0432e74e3bc27a74fe85d77..914665c2315a2d8b8fed7bdf1b6c2a4edb8692ab 100644 (file)
 
 #include "netdissect-stdinc.h"
 
-#ifndef NTOHL
-#define NTOHL(x)       (x) = ntohl(x)
-#define NTOHS(x)       (x) = ntohs(x)
-#define HTONL(x)       (x) = htonl(x)
-#define HTONS(x)       (x) = htons(x)
-#endif
-
-#ifdef _WIN32
-  /*
-   * We have our own ether_ntohost(), reading from the system's
-   * Ethernet address file.
-   */
-  #include "missing/win_ether_ntohost.h"
-#else
-  #ifdef USE_ETHER_NTOHOST
-    #if defined(NET_ETHERNET_H_DECLARES_ETHER_NTOHOST)
-      /*
-       * OK, just include <net/ethernet.h>.
-       */
-      #include <net/ethernet.h>
-    #elif defined(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST)
-      /*
-       * OK, just include <netinet/ether.h>
-       */
-      #include <netinet/ether.h>
-    #elif defined(SYS_ETHERNET_H_DECLARES_ETHER_NTOHOST)
-      /*
-       * OK, just include <sys/ethernet.h>
-       */
-      #include <sys/ethernet.h>
-    #elif defined(ARPA_INET_H_DECLARES_ETHER_NTOHOST)
-      /*
-       * OK, just include <arpa/inet.h>
-       */
-      #include <arpa/inet.h>
-    #elif defined(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST)
-      /*
-       * OK, include <netinet/if_ether.h>, after all the other stuff we
-       * need to include or define for its benefit.
-       */
+#ifdef USE_ETHER_NTOHOST
+  #if defined(NET_ETHERNET_H_DECLARES_ETHER_NTOHOST)
+    /*
+     * OK, just include <net/ethernet.h>.
+     */
+    #include <net/ethernet.h>
+  #elif defined(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST)
+    /*
+     * OK, just include <netinet/ether.h>
+     */
+    #include <netinet/ether.h>
+  #elif defined(SYS_ETHERNET_H_DECLARES_ETHER_NTOHOST)
+    /*
+     * OK, just include <sys/ethernet.h>
+     */
+    #include <sys/ethernet.h>
+  #elif defined(ARPA_INET_H_DECLARES_ETHER_NTOHOST)
+    /*
+     * OK, just include <arpa/inet.h>
+     */
+    #include <arpa/inet.h>
+  #elif defined(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST)
+    /*
+     * OK, include <netinet/if_ether.h>, after all the other stuff we
+     * need to include or define for its benefit.
+     */
+    #define NEED_NETINET_IF_ETHER_H
+  #else
+    /*
+     * We'll have to declare it ourselves.
+     * If <netinet/if_ether.h> defines struct ether_addr, include
+     * it.  Otherwise, define it ourselves.
+     */
+    #ifdef HAVE_STRUCT_ETHER_ADDR
       #define NEED_NETINET_IF_ETHER_H
-    #else
-      /*
-       * We'll have to declare it ourselves.
-       * If <netinet/if_ether.h> defines struct ether_addr, include
-       * it.  Otherwise, define it ourselves.
-       */
-      #ifdef HAVE_STRUCT_ETHER_ADDR
-        #define NEED_NETINET_IF_ETHER_H
-      #else /* HAVE_STRUCT_ETHER_ADDR */
+    #else /* HAVE_STRUCT_ETHER_ADDR */
        struct ether_addr {
+               /* Beware FreeBSD calls this "octet". */
                unsigned char ether_addr_octet[MAC_ADDR_LEN];
        };
-      #endif /* HAVE_STRUCT_ETHER_ADDR */
-    #endif /* what declares ether_ntohost() */
-
-    #ifdef NEED_NETINET_IF_ETHER_H
-      #include <net/if.h>      /* Needed on some platforms */
-      #include <netinet/in.h>  /* Needed on some platforms */
-      #include <netinet/if_ether.h>
-    #endif /* NEED_NETINET_IF_ETHER_H */
-
-    #ifndef HAVE_DECL_ETHER_NTOHOST
-      /*
-       * No header declares it, so declare it ourselves.
-       */
-      extern int ether_ntohost(char *, const struct ether_addr *);
-    #endif /* !defined(HAVE_DECL_ETHER_NTOHOST) */
-  #endif /* USE_ETHER_NTOHOST */
-#endif /* _WIN32 */
+    #endif /* HAVE_STRUCT_ETHER_ADDR */
+  #endif /* what declares ether_ntohost() */
+
+  #ifdef NEED_NETINET_IF_ETHER_H
+    /*
+     * Include diag-control.h before <net/if.h>, which too defines a macro
+     * named ND_UNREACHABLE.
+     */
+    #include "diag-control.h"
+    #include <net/if.h>                /* Needed on some platforms */
+    #include <netinet/in.h>    /* Needed on some platforms */
+    #include <netinet/if_ether.h>
+  #endif /* NEED_NETINET_IF_ETHER_H */
+
+  #ifndef HAVE_DECL_ETHER_NTOHOST
+    /*
+     * No header declares it, so declare it ourselves.
+     */
+    extern int ether_ntohost(char *, const struct ether_addr *);
+  #endif /* !defined(HAVE_DECL_ETHER_NTOHOST) */
+#endif /* USE_ETHER_NTOHOST */
 
 #include <pcap.h>
 #include <pcap-namedb.h>
@@ -235,7 +226,7 @@ intoa(uint32_t addr)
        int n;
        static char buf[sizeof(".xxx.xxx.xxx.xxx")];
 
-       NTOHL(addr);
+       addr = ntohl(addr);
        cp = buf + sizeof(buf);
        *--cp = '\0';
 
@@ -260,7 +251,7 @@ intoa(uint32_t addr)
 static uint32_t f_netmask;
 static uint32_t f_localnet;
 #ifdef HAVE_CASPER
-extern cap_channel_t *capdns;
+cap_channel_t *capdns;
 #endif
 
 /*
@@ -319,7 +310,7 @@ ipaddr_string(netdissect_options *ndo, const u_char *ap)
                        p->name = strdup(hp->h_name);
                        if (p->name == NULL)
                                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                       "ipaddr_string: strdup(hp->h_name)");
+                                       "%s: strdup(hp->h_name)", __func__);
                        if (ndo->ndo_Nflag) {
                                /* Remove domain qualifications */
                                dotp = strchr(p->name, '.');
@@ -332,7 +323,7 @@ ipaddr_string(netdissect_options *ndo, const u_char *ap)
        p->name = strdup(intoa(addr));
        if (p->name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "ipaddr_string: strdup(intoa(addr))");
+                                 "%s: strdup(intoa(addr))", __func__);
        return (p->name);
 }
 
@@ -382,7 +373,7 @@ ip6addr_string(netdissect_options *ndo, const u_char *ap)
                        p->name = strdup(hp->h_name);
                        if (p->name == NULL)
                                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                       "ip6addr_string: strdup(hp->h_name)");
+                                       "%s: strdup(hp->h_name)", __func__);
                        if (ndo->ndo_Nflag) {
                                /* Remove domain qualifications */
                                dotp = strchr(p->name, '.');
@@ -396,7 +387,7 @@ ip6addr_string(netdissect_options *ndo, const u_char *ap)
        p->name = strdup(cp);
        if (p->name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "ip6addr_string: strdup(cp)");
+                                 "%s: strdup(cp)", __func__);
        return (p->name);
 }
 
@@ -462,7 +453,7 @@ lookup_emem(netdissect_options *ndo, const u_char *ep)
        tp->e_addr2 = (u_short)k;
        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        if (tp->e_nxt == NULL)
-               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_emem: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "%s: calloc", __func__);
 
        return tp;
 }
@@ -508,14 +499,14 @@ lookup_bytestring(netdissect_options *ndo, const u_char *bs,
        tp->bs_bytes = (u_char *) calloc(1, nlen);
        if (tp->bs_bytes == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "lookup_bytestring: calloc");
+                                 "%s: calloc", __func__);
 
        memcpy(tp->bs_bytes, bs, nlen);
        tp->bs_nbytes = nlen;
        tp->bs_nxt = (struct bsnamemem *)calloc(1, sizeof(*tp));
        if (tp->bs_nxt == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "lookup_bytestring: calloc");
+                                 "%s: calloc", __func__);
 
        return tp;
 }
@@ -555,12 +546,12 @@ lookup_nsap(netdissect_options *ndo, const u_char *nsap,
        tp->e_addr2 = (u_short)k;
        tp->e_nsap = (u_char *)malloc(nsap_length + 1);
        if (tp->e_nsap == NULL)
-               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_nsap: malloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "%s: malloc", __func__);
        tp->e_nsap[0] = (u_char)nsap_length;    /* guaranteed < ISONSAP_MAX_LENGTH */
        memcpy((char *)&tp->e_nsap[1], (const char *)nsap, nsap_length);
        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        if (tp->e_nxt == NULL)
-               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_nsap: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "%s: calloc", __func__);
 
        return tp;
 }
@@ -588,7 +579,7 @@ lookup_protoid(netdissect_options *ndo, const u_char *pi)
        tp->p_proto = (u_short)j;
        tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp));
        if (tp->p_nxt == NULL)
-               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_protoid: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "%s: calloc", __func__);
 
        return tp;
 }
@@ -608,12 +599,19 @@ etheraddr_string(netdissect_options *ndo, const uint8_t *ep)
 #ifdef USE_ETHER_NTOHOST
        if (!ndo->ndo_nflag) {
                char buf2[BUFSIZE];
+               /*
+                * This is a non-const copy of ep for ether_ntohost(), which
+                * has its second argument non-const in OpenBSD. Also saves a
+                * type cast.
+                */
+               struct ether_addr ea;
 
-               if (ether_ntohost(buf2, (const struct ether_addr *)ep) == 0) {
+               memcpy (&ea, ep, MAC_ADDR_LEN);
+               if (ether_ntohost(buf2, &ea) == 0) {
                        tp->e_name = strdup(buf2);
                        if (tp->e_name == NULL)
                                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                       "etheraddr_string: strdup(buf2)");
+                                       "%s: strdup(buf2)", __func__);
                        return (tp->e_name);
                }
        }
@@ -634,7 +632,7 @@ etheraddr_string(netdissect_options *ndo, const uint8_t *ep)
        tp->e_name = strdup(buf);
        if (tp->e_name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "etheraddr_string: strdup(buf)");
+                                 "%s: strdup(buf)", __func__);
        return (tp->e_name);
 }
 
@@ -663,7 +661,7 @@ le64addr_string(netdissect_options *ndo, const uint8_t *ep)
        tp->bs_name = strdup(buf);
        if (tp->bs_name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "le64addr_string: strdup(buf)");
+                                 "%s: strdup(buf)", __func__);
 
        return (tp->bs_name);
 }
@@ -692,7 +690,7 @@ linkaddr_string(netdissect_options *ndo, const uint8_t *ep,
        tp->bs_name = cp = (char *)malloc(len*3);
        if (tp->bs_name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "linkaddr_string: malloc");
+                                 "%s: malloc", __func__);
        cp = octet_to_hex(cp, *ep++);
        for (i = len-1; i > 0 ; --i) {
                *cp++ = ':';
@@ -721,7 +719,7 @@ isonsap_string(netdissect_options *ndo, const uint8_t *nsap,
        tp->e_name = cp = (char *)malloc(sizeof("xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xx"));
        if (cp == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "isonsap_string: malloc");
+                                 "%s: malloc", __func__);
 
        for (nsap_idx = 0; nsap_idx < nsap_length; nsap_idx++) {
                cp = octet_to_hex(cp, *nsap++);
@@ -752,7 +750,7 @@ tcpport_string(netdissect_options *ndo, u_short port)
        tp->name = strdup(buf);
        if (tp->name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "tcpport_string: strdup(buf)");
+                                 "%s: strdup(buf)", __func__);
        return (tp->name);
 }
 
@@ -774,7 +772,7 @@ udpport_string(netdissect_options *ndo, u_short port)
        tp->name = strdup(buf);
        if (tp->name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "udpport_string: strdup(buf)");
+                                 "%s: strdup(buf)", __func__);
        return (tp->name);
 }
 
@@ -794,7 +792,7 @@ ipxsap_string(netdissect_options *ndo, u_short port)
        tp->nxt = newhnamemem(ndo);
 
        cp = buf;
-       NTOHS(port);
+       port = ntohs(port);
        *cp++ = hex[port >> 12 & 0xf];
        *cp++ = hex[port >> 8 & 0xf];
        *cp++ = hex[port >> 4 & 0xf];
@@ -803,7 +801,7 @@ ipxsap_string(netdissect_options *ndo, u_short port)
        tp->name = strdup(buf);
        if (tp->name == NULL)
                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                 "ipxsap_string: strdup(buf)");
+                                 "%s: strdup(buf)", __func__);
        return (tp->name);
 }
 
@@ -834,7 +832,7 @@ init_servarray(netdissect_options *ndo)
                        table->name = strdup(sv->s_name);
                if (table->name == NULL)
                        (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                         "init_servarray: strdup");
+                                         "%s: strdup", __func__);
 
                table->addr = port;
                table->nxt = newhnamemem(ndo);
@@ -913,7 +911,7 @@ init_protoidarray(netdissect_options *ndo)
                tp->p_name = strdup(eproto_db[i].s);
                if (tp->p_name == NULL)
                        (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                               "init_protoidarray: strdup(eproto_db[i].s)");
+                               "%s: strdup(eproto_db[i].s)", __func__);
        }
        /* Hardwire some SNAP proto ID names */
        for (pl = protoidlist; pl->name != NULL; ++pl) {
@@ -927,7 +925,7 @@ init_protoidarray(netdissect_options *ndo)
 }
 
 static const struct etherlist {
-       const u_char addr[MAC_ADDR_LEN];
+       const nd_mac_addr addr;
        const char *name;
 } etherlist[] = {
        {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "Broadcast" },
@@ -967,7 +965,7 @@ init_etherarray(netdissect_options *ndo)
                        tp->e_name = strdup(ep->name);
                        if (tp->e_name == NULL)
                                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                       "init_etherarray: strdup(ep->addr)");
+                                       "%s: strdup(ep->addr)", __func__);
                }
                (void)fclose(fp);
        }
@@ -984,11 +982,14 @@ init_etherarray(netdissect_options *ndo)
                /*
                 * Use YP/NIS version of name if available.
                 */
-               if (ether_ntohost(name, (const struct ether_addr *)el->addr) == 0) {
+               /* Same workaround as in etheraddr_string(). */
+               struct ether_addr ea;
+               memcpy (&ea, el->addr, MAC_ADDR_LEN);
+               if (ether_ntohost(name, &ea) == 0) {
                        tp->e_name = strdup(name);
                        if (tp->e_name == NULL)
                                (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                       "init_etherarray: strdup(name)");
+                                       "%s: strdup(name)", __func__);
                        continue;
                }
 #endif
@@ -1284,12 +1285,12 @@ newhnamemem(netdissect_options *ndo)
        static struct hnamemem *ptr = NULL;
        static u_int num = 0;
 
-       if (num  <= 0) {
+       if (num  == 0) {
                num = 64;
                ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));
                if (ptr == NULL)
                        (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                         "newhnamemem: calloc");
+                                         "%s: calloc", __func__);
        }
        --num;
        p = ptr++;
@@ -1304,12 +1305,12 @@ newh6namemem(netdissect_options *ndo)
        static struct h6namemem *ptr = NULL;
        static u_int num = 0;
 
-       if (num  <= 0) {
+       if (num  == 0) {
                num = 64;
                ptr = (struct h6namemem *)calloc(num, sizeof (*ptr));
                if (ptr == NULL)
                        (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
-                                         "newh6namemem: calloc");
+                                         "%s: calloc", __func__);
        }
        --num;
        p = ptr++;