X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/11f73ad248fa22461ca040baa8dc94b864509efa..9f957a5883cb4c5c99cefa71b42fc9d2d27d73e1:/addrtoname.c diff --git a/addrtoname.c b/addrtoname.c index e49a78d4..b08253a3 100644 --- a/addrtoname.c +++ b/addrtoname.c @@ -26,8 +26,20 @@ #include "config.h" #endif +#ifdef HAVE_CASPER +#include +#include +#endif /* HAVE_CASPER */ + #include +#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 USE_ETHER_NTOHOST #ifdef HAVE_NETINET_IF_ETHER_H struct mbuf; /* Squelch compiler warnings on some platforms for */ @@ -52,6 +64,9 @@ extern int ether_ntohost(char *, const struct ether_addr *); #include #include +#ifndef HAVE_GETSERVENT +#include +#endif #include #include #include @@ -60,15 +75,11 @@ extern int ether_ntohost(char *, const struct ether_addr *); #include "netdissect.h" #include "addrtoname.h" #include "addrtostr.h" +#include "ethertype.h" #include "llc.h" -#include "setsignal.h" #include "extract.h" #include "oui.h" -#ifndef ETHER_ADDR_LEN -#define ETHER_ADDR_LEN 6 -#endif - /* * hash tables for whatever-to-name translations * @@ -144,13 +155,23 @@ struct enamemem { u_short e_addr2; const char *e_name; u_char *e_nsap; /* used only for nsaptable[] */ -#define e_bs e_nsap /* for bytestringtable */ struct enamemem *e_nxt; }; static struct enamemem enametable[HASHNAMESIZE]; static struct enamemem nsaptable[HASHNAMESIZE]; -static struct enamemem bytestringtable[HASHNAMESIZE]; + +struct bsnamemem { + u_short bs_addr0; + u_short bs_addr1; + u_short bs_addr2; + const char *bs_name; + u_char *bs_bytes; + unsigned int bs_nbytes; + struct bsnamemem *bs_nxt; +}; + +static struct bsnamemem bytestringtable[HASHNAMESIZE]; struct protoidmem { uint32_t p_oui; @@ -167,9 +188,9 @@ static struct protoidmem protoidtable[HASHNAMESIZE]; const char * intoa(uint32_t addr) { - register char *cp; - register u_int byte; - register int n; + char *cp; + u_int byte; + int n; static char buf[sizeof(".xxx.xxx.xxx.xxx")]; NTOHL(addr); @@ -196,6 +217,9 @@ intoa(uint32_t addr) static uint32_t f_netmask; static uint32_t f_localnet; +#ifdef HAVE_CASPER +extern cap_channel_t *capdns; +#endif /* * Return a name for the IP address pointed to by ap. This address @@ -219,7 +243,7 @@ static uint32_t f_localnet; const char * getname(netdissect_options *ndo, const u_char *ap) { - register struct hostent *hp; + struct hostent *hp; uint32_t addr; struct hnamemem *p; @@ -241,7 +265,13 @@ getname(netdissect_options *ndo, const u_char *ap) */ if (!ndo->ndo_nflag && (addr & f_netmask) == f_localnet) { - hp = gethostbyaddr((char *)&addr, 4, AF_INET); +#ifdef HAVE_CASPER + if (capdns != NULL) { + hp = cap_gethostbyaddr(capdns, (char *)&addr, 4, + AF_INET); + } else +#endif + hp = gethostbyaddr((char *)&addr, 4, AF_INET); if (hp) { char *dotp; @@ -271,7 +301,7 @@ getname(netdissect_options *ndo, const u_char *ap) const char * getname6(netdissect_options *ndo, const u_char *ap) { - register struct hostent *hp; + struct hostent *hp; union { struct in6_addr addr; struct for_hash_addr { @@ -280,7 +310,7 @@ getname6(netdissect_options *ndo, const u_char *ap) } addra; } addr; struct h6namemem *p; - register const char *cp; + const char *cp; char ntop_buf[INET6_ADDRSTRLEN]; memcpy(&addr, ap, sizeof(addr)); @@ -296,7 +326,14 @@ getname6(netdissect_options *ndo, const u_char *ap) * Do not print names if -n was given. */ if (!ndo->ndo_nflag) { - hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6); +#ifdef HAVE_CASPER + if (capdns != NULL) { + hp = cap_gethostbyaddr(capdns, (char *)&addr, + sizeof(addr), AF_INET6); + } else +#endif + hp = gethostbyaddr((char *)&addr, sizeof(addr), + AF_INET6); if (hp) { char *dotp; @@ -320,15 +357,17 @@ getname6(netdissect_options *ndo, const u_char *ap) return (p->name); } -static const char hex[] = "0123456789abcdef"; - +static const char hex[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' +}; /* Find the hash node that corresponds the ether address 'ep' */ static inline struct enamemem * lookup_emem(netdissect_options *ndo, const u_char *ep) { - register u_int i, j, k; + u_int i, j, k; struct enamemem *tp; k = (ep[0] << 8) | ep[1]; @@ -358,12 +397,12 @@ lookup_emem(netdissect_options *ndo, const u_char *ep) * with length 'nlen' */ -static inline struct enamemem * -lookup_bytestring(netdissect_options *ndo, register const u_char *bs, +static inline struct bsnamemem * +lookup_bytestring(netdissect_options *ndo, const u_char *bs, const unsigned int nlen) { - struct enamemem *tp; - register u_int i, j, k; + struct bsnamemem *tp; + u_int i, j, k; if (nlen >= 6) { k = (bs[0] << 8) | bs[1]; @@ -377,26 +416,28 @@ lookup_bytestring(netdissect_options *ndo, register const u_char *bs, i = j = k = 0; tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)]; - while (tp->e_nxt) - if (tp->e_addr0 == i && - tp->e_addr1 == j && - tp->e_addr2 == k && - memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0) + while (tp->bs_nxt) + if (nlen == tp->bs_nbytes && + tp->bs_addr0 == i && + tp->bs_addr1 == j && + tp->bs_addr2 == k && + memcmp((const char *)bs, (const char *)(tp->bs_bytes), nlen) == 0) return tp; else - tp = tp->e_nxt; + tp = tp->bs_nxt; - tp->e_addr0 = i; - tp->e_addr1 = j; - tp->e_addr2 = k; + tp->bs_addr0 = i; + tp->bs_addr1 = j; + tp->bs_addr2 = k; - tp->e_bs = (u_char *) calloc(1, nlen + 1); - if (tp->e_bs == NULL) + tp->bs_bytes = (u_char *) calloc(1, nlen); + if (tp->bs_bytes == NULL) (*ndo->ndo_error)(ndo, "lookup_bytestring: calloc"); - memcpy(tp->e_bs, bs, nlen); - tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); - if (tp->e_nxt == NULL) + 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, "lookup_bytestring: calloc"); return tp; @@ -405,14 +446,15 @@ lookup_bytestring(netdissect_options *ndo, register const u_char *bs, /* Find the hash node that corresponds the NSAP 'nsap' */ static inline struct enamemem * -lookup_nsap(netdissect_options *ndo, register const u_char *nsap) +lookup_nsap(netdissect_options *ndo, const u_char *nsap, + u_int nsap_length) { - register u_int i, j, k; - unsigned int nlen = *nsap; + u_int i, j, k; struct enamemem *tp; - const u_char *ensap = nsap + nlen - 6; + const u_char *ensap; - if (nlen > 6) { + if (nsap_length > 6) { + ensap = nsap + nsap_length - 6; k = (ensap[0] << 8) | ensap[1]; j = (ensap[2] << 8) | ensap[3]; i = (ensap[4] << 8) | ensap[5]; @@ -422,22 +464,23 @@ lookup_nsap(netdissect_options *ndo, register const u_char *nsap) tp = &nsaptable[(i ^ j) & (HASHNAMESIZE-1)]; while (tp->e_nxt) - if (tp->e_addr0 == i && + if (nsap_length == tp->e_nsap[0] && + tp->e_addr0 == i && tp->e_addr1 == j && tp->e_addr2 == k && - tp->e_nsap[0] == nlen && - memcmp((const char *)&(nsap[1]), - (char *)&(tp->e_nsap[1]), nlen) == 0) + memcmp((const char *)nsap, + (char *)&(tp->e_nsap[1]), nsap_length) == 0) return tp; else tp = tp->e_nxt; tp->e_addr0 = i; tp->e_addr1 = j; tp->e_addr2 = k; - tp->e_nsap = (u_char *)malloc(nlen + 1); + tp->e_nsap = (u_char *)malloc(nsap_length + 1); if (tp->e_nsap == NULL) (*ndo->ndo_error)(ndo, "lookup_nsap: malloc"); - memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1); + 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, "lookup_nsap: calloc"); @@ -450,7 +493,7 @@ lookup_nsap(netdissect_options *ndo, register const u_char *nsap) static inline struct protoidmem * lookup_protoid(netdissect_options *ndo, const u_char *pi) { - register u_int i, j; + u_int i, j; struct protoidmem *tp; /* 5 octets won't be aligned */ @@ -474,11 +517,11 @@ lookup_protoid(netdissect_options *ndo, const u_char *pi) } const char * -etheraddr_string(netdissect_options *ndo, register const u_char *ep) +etheraddr_string(netdissect_options *ndo, const u_char *ep) { - register int i; - register char *cp; - register struct enamemem *tp; + int i; + char *cp; + struct enamemem *tp; int oui; char buf[BUFSIZE]; @@ -499,7 +542,7 @@ etheraddr_string(netdissect_options *ndo, register const u_char *ep) } #endif cp = buf; - oui = EXTRACT_24BITS(ep); + oui = EXTRACT_BE_U_3(ep); *cp++ = hex[*ep >> 4 ]; *cp++ = hex[*ep++ & 0xf]; for (i = 5; --i >= 0;) { @@ -523,14 +566,14 @@ const char * le64addr_string(netdissect_options *ndo, const u_char *ep) { const unsigned int len = 8; - register u_int i; - register char *cp; - register struct enamemem *tp; + u_int i; + char *cp; + struct bsnamemem *tp; char buf[BUFSIZE]; tp = lookup_bytestring(ndo, ep, len); - if (tp->e_name) - return (tp->e_name); + if (tp->bs_name) + return (tp->bs_name); cp = buf; for (i = len; i > 0 ; --i) { @@ -542,36 +585,36 @@ le64addr_string(netdissect_options *ndo, const u_char *ep) *cp = '\0'; - tp->e_name = strdup(buf); - if (tp->e_name == NULL) + tp->bs_name = strdup(buf); + if (tp->bs_name == NULL) (*ndo->ndo_error)(ndo, "le64addr_string: strdup(buf)"); - return (tp->e_name); + return (tp->bs_name); } const char * linkaddr_string(netdissect_options *ndo, const u_char *ep, const unsigned int type, const unsigned int len) { - register u_int i; - register char *cp; - register struct enamemem *tp; + u_int i; + char *cp; + struct bsnamemem *tp; if (len == 0) return (""); - if (type == LINKADDR_ETHER && len == ETHER_ADDR_LEN) + if (type == LINKADDR_ETHER && len == MAC_ADDR_LEN) return (etheraddr_string(ndo, ep)); if (type == LINKADDR_FRELAY) return (q922_string(ndo, ep, len)); tp = lookup_bytestring(ndo, ep, len); - if (tp->e_name) - return (tp->e_name); + if (tp->bs_name) + return (tp->bs_name); - tp->e_name = cp = (char *)malloc(len*3); - if (tp->e_name == NULL) + tp->bs_name = cp = (char *)malloc(len*3); + if (tp->bs_name == NULL) (*ndo->ndo_error)(ndo, "linkaddr_string: malloc"); *cp++ = hex[*ep >> 4]; *cp++ = hex[*ep++ & 0xf]; @@ -581,15 +624,15 @@ linkaddr_string(netdissect_options *ndo, const u_char *ep, *cp++ = hex[*ep++ & 0xf]; } *cp = '\0'; - return (tp->e_name); + return (tp->bs_name); } const char * etherproto_string(netdissect_options *ndo, u_short port) { - register char *cp; - register struct hnamemem *tp; - register uint32_t i = port; + char *cp; + struct hnamemem *tp; + uint32_t i = port; char buf[sizeof("0000")]; for (tp = &eprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) @@ -612,48 +655,19 @@ etherproto_string(netdissect_options *ndo, u_short port) return (tp->name); } -const char * -protoid_string(netdissect_options *ndo, register const u_char *pi) -{ - register u_int i, j; - register char *cp; - register struct protoidmem *tp; - char buf[sizeof("00:00:00:00:00")]; - - tp = lookup_protoid(ndo, pi); - if (tp->p_name) - return tp->p_name; - - cp = buf; - if ((j = *pi >> 4) != 0) - *cp++ = hex[j]; - *cp++ = hex[*pi++ & 0xf]; - for (i = 4; (int)--i >= 0;) { - *cp++ = ':'; - if ((j = *pi >> 4) != 0) - *cp++ = hex[j]; - *cp++ = hex[*pi++ & 0xf]; - } - *cp = '\0'; - tp->p_name = strdup(buf); - if (tp->p_name == NULL) - (*ndo->ndo_error)(ndo, "protoid_string: strdup(buf)"); - return (tp->p_name); -} - #define ISONSAP_MAX_LENGTH 20 const char * isonsap_string(netdissect_options *ndo, const u_char *nsap, - register u_int nsap_length) + u_int nsap_length) { - register u_int nsap_idx; - register char *cp; - register struct enamemem *tp; + u_int nsap_idx; + char *cp; + struct enamemem *tp; if (nsap_length < 1 || nsap_length > ISONSAP_MAX_LENGTH) return ("isonsap_string: illegal length"); - tp = lookup_nsap(ndo, nsap); + tp = lookup_nsap(ndo, nsap, nsap_length); if (tp->e_name) return tp->e_name; @@ -676,8 +690,8 @@ isonsap_string(netdissect_options *ndo, const u_char *nsap, const char * tcpport_string(netdissect_options *ndo, u_short port) { - register struct hnamemem *tp; - register uint32_t i = port; + struct hnamemem *tp; + uint32_t i = port; char buf[sizeof("00000")]; for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) @@ -695,10 +709,10 @@ tcpport_string(netdissect_options *ndo, u_short port) } const char * -udpport_string(netdissect_options *ndo, register u_short port) +udpport_string(netdissect_options *ndo, u_short port) { - register struct hnamemem *tp; - register uint32_t i = port; + struct hnamemem *tp; + uint32_t i = port; char buf[sizeof("00000")]; for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) @@ -718,9 +732,9 @@ udpport_string(netdissect_options *ndo, register u_short port) const char * ipxsap_string(netdissect_options *ndo, u_short port) { - register char *cp; - register struct hnamemem *tp; - register uint32_t i = port; + char *cp; + struct hnamemem *tp; + uint32_t i = port; char buf[sizeof("0000")]; for (tp = &ipxsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) @@ -747,8 +761,8 @@ static void init_servarray(netdissect_options *ndo) { struct servent *sv; - register struct hnamemem *table; - register int i; + struct hnamemem *table; + int i; char buf[sizeof("0000000000")]; while ((sv = getservent()) != NULL) { @@ -777,22 +791,38 @@ init_servarray(netdissect_options *ndo) endservent(); } -/* in libpcap.a (nametoaddr.c) */ -#if defined(_WIN32) && !defined(USE_STATIC_LIBPCAP) -extern __declspec(dllimport) -#else -extern -#endif -const struct eproto { +static const struct eproto { const char *s; u_short p; -} eproto_db[]; +} eproto_db[] = { + { "pup", ETHERTYPE_PUP }, + { "xns", ETHERTYPE_NS }, + { "ip", ETHERTYPE_IP }, + { "ip6", ETHERTYPE_IPV6 }, + { "arp", ETHERTYPE_ARP }, + { "rarp", ETHERTYPE_REVARP }, + { "sprite", ETHERTYPE_SPRITE }, + { "mopdl", ETHERTYPE_MOPDL }, + { "moprc", ETHERTYPE_MOPRC }, + { "decnet", ETHERTYPE_DN }, + { "lat", ETHERTYPE_LAT }, + { "sca", ETHERTYPE_SCA }, + { "lanbridge", ETHERTYPE_LANBRIDGE }, + { "vexp", ETHERTYPE_VEXP }, + { "vprod", ETHERTYPE_VPROD }, + { "atalk", ETHERTYPE_ATALK }, + { "atalkarp", ETHERTYPE_AARP }, + { "loopback", ETHERTYPE_LOOPBACK }, + { "decdts", ETHERTYPE_DECDTS }, + { "decdns", ETHERTYPE_DECDNS }, + { (char *)0, 0 } +}; static void init_eprotoarray(netdissect_options *ndo) { - register int i; - register struct hnamemem *table; + int i; + struct hnamemem *table; for (i = 0; eproto_db[i].s; i++) { int j = htons(eproto_db[i].p) & (HASHNAMESIZE-1); @@ -824,8 +854,8 @@ static const struct protoidlist { static void init_protoidarray(netdissect_options *ndo) { - register int i; - register struct protoidmem *tp; + int i; + struct protoidmem *tp; const struct protoidlist *pl; u_char protoid[5]; @@ -878,13 +908,13 @@ static const struct etherlist { static void init_etherarray(netdissect_options *ndo) { - register const struct etherlist *el; - register struct enamemem *tp; + const struct etherlist *el; + struct enamemem *tp; #ifdef USE_ETHER_NTOHOST char name[256]; #else - register struct pcap_etherent *ep; - register FILE *fp; + struct pcap_etherent *ep; + FILE *fp; /* Suck in entire ethers file */ fp = fopen(PCAP_ETHERS_FILE, "r"); @@ -1143,8 +1173,8 @@ static const struct tok ipxsap_db[] = { static void init_ipxsaparray(netdissect_options *ndo) { - register int i; - register struct hnamemem *table; + int i; + struct hnamemem *table; for (i = 0; ipxsap_db[i].s != NULL; i++) { int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1); @@ -1186,9 +1216,9 @@ init_addrtoname(netdissect_options *ndo, uint32_t localnet, uint32_t mask) const char * dnaddr_string(netdissect_options *ndo, u_short dnaddr) { - register struct hnamemem *tp; + struct hnamemem *tp; - for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != 0; + for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != NULL; tp = tp->nxt) if (tp->addr == dnaddr) return (tp->name); @@ -1207,7 +1237,7 @@ dnaddr_string(netdissect_options *ndo, u_short dnaddr) struct hnamemem * newhnamemem(netdissect_options *ndo) { - register struct hnamemem *p; + struct hnamemem *p; static struct hnamemem *ptr = NULL; static u_int num = 0; @@ -1226,7 +1256,7 @@ newhnamemem(netdissect_options *ndo) struct h6namemem * newh6namemem(netdissect_options *ndo) { - register struct h6namemem *p; + struct h6namemem *p; static struct h6namemem *ptr = NULL; static u_int num = 0;