Annotation of embedaddon/trafshow/addrtoname.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
        !             3:  *     The Regents of the University of California.  All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms, with or without
        !             6:  * modification, are permitted provided that: (1) source code distributions
        !             7:  * retain the above copyright notice and this paragraph in its entirety, (2)
        !             8:  * distributions including binary code include the above copyright notice and
        !             9:  * this paragraph in its entirety in the documentation or other materials
        !            10:  * provided with the distribution, and (3) all advertising materials mentioning
        !            11:  * features or use of this software display the following acknowledgement:
        !            12:  * ``This product includes software developed by the University of California,
        !            13:  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
        !            14:  * the University nor the names of its contributors may be used to endorse
        !            15:  * or promote products derived from this software without specific prior
        !            16:  * written permission.
        !            17:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            18:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            19:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            20:  *
        !            21:  *  Internet, ethernet, port, and protocol string to address
        !            22:  *  and address to string conversion routines
        !            23: 
        !            24: #ifndef lint
        !            25: static const char rcsid[] _U_ =
        !            26:     "@(#) $Header: /tcpdump/master/tcpdump/addrtoname.c,v 1.96.2.3 2003/12/15 04:02:53 guy Exp $ (LBL)";
        !            27: #endif
        !            28:  */
        !            29: 
        !            30: #ifdef HAVE_CONFIG_H
        !            31: #include "config.h"
        !            32: #endif
        !            33: 
        !            34: #include <ctype.h>
        !            35: #include <unistd.h>
        !            36: #include <netdb.h>
        !            37: #include <sys/param.h>
        !            38: #include <sys/types.h>                  /* concession to AIX */
        !            39: #include <sys/time.h>
        !            40: #include <sys/socket.h>
        !            41: #ifdef linux
        !            42: #include <linux/if.h>
        !            43: #else
        !            44: #include <net/if.h>
        !            45: #endif
        !            46: #include <netinet/in.h>
        !            47: #include <netinet/if_ether.h>
        !            48: #ifdef HAVE_NET_IF_DL_H
        !            49: #include <net/if_dl.h>
        !            50: #endif
        !            51: #ifdef TIME_WITH_SYS_TIME
        !            52: #include <time.h>
        !            53: #endif
        !            54: 
        !            55: #include <arpa/inet.h>
        !            56: 
        !            57: #include <pcap.h>
        !            58: #include <pcap-namedb.h>
        !            59: #include <signal.h>
        !            60: #include <stdio.h>
        !            61: #include <string.h>
        !            62: #include <stdlib.h>
        !            63: 
        !            64: #include "addrtoname.h"
        !            65: #include "ethertype.h"
        !            66: #include "domain_resolver.h"
        !            67: 
        !            68: #ifndef NTOHL
        !            69: #define NTOHL(x)       (x) = ntohl(x)
        !            70: #define NTOHS(x)       (x) = ntohs(x)
        !            71: #define HTONL(x)       (x) = htonl(x)
        !            72: #define HTONS(x)       (x) = htons(x)
        !            73: #endif
        !            74: 
        !            75: /* dirty fake */
        !            76: #define        error(s)        { perror(s); exit(1); }
        !            77: 
        !            78: struct tok {
        !            79:        int v;                  /* value */
        !            80:        const char *s;          /* string */
        !            81: };
        !            82: 
        !            83: /*
        !            84:  * hash tables for whatever-to-name translations
        !            85:  *
        !            86:  * XXX there has to be error checks against strdup(3) failure
        !            87:  */
        !            88: 
        !            89: #define HASHNAMESIZE 4096
        !            90: 
        !            91: struct hnamemem {
        !            92:        int resolving;
        !            93:        u_int32_t addr;
        !            94:        const char *name;
        !            95:        struct hnamemem *nxt;
        !            96: };
        !            97: 
        !            98: struct hnamemem hnametable[HASHNAMESIZE];
        !            99: struct hnamemem tporttable[HASHNAMESIZE];
        !           100: struct hnamemem uporttable[HASHNAMESIZE];
        !           101: struct hnamemem servtable[HASHNAMESIZE];
        !           102: struct hnamemem iprototable[HASHNAMESIZE];
        !           103: struct hnamemem etypetable[HASHNAMESIZE];
        !           104: struct hnamemem dnaddrtable[HASHNAMESIZE];
        !           105: struct hnamemem llcsaptable[HASHNAMESIZE];
        !           106: struct hnamemem ipxsaptable[HASHNAMESIZE];
        !           107: struct hnamemem icmptable[HASHNAMESIZE];
        !           108: #ifdef INET6
        !           109: struct hnamemem icmpv6table[HASHNAMESIZE];
        !           110: #endif
        !           111: 
        !           112: #ifdef INET6
        !           113: struct h6namemem {
        !           114:        struct in6_addr addr;
        !           115:        char *name;
        !           116:        struct h6namemem *nxt;
        !           117: };
        !           118: 
        !           119: struct h6namemem h6nametable[HASHNAMESIZE];
        !           120: #endif /* INET6 */
        !           121: 
        !           122: struct enamemem {
        !           123:        u_short e_addr0;
        !           124:        u_short e_addr1;
        !           125:        u_short e_addr2;
        !           126:        const char *e_name;
        !           127:        u_char *e_nsap;                 /* used only for nsaptable[] */
        !           128: #define e_bs e_nsap                    /* for bytestringtable */
        !           129:        struct enamemem *e_nxt;
        !           130: };
        !           131: 
        !           132: struct enamemem enametable[HASHNAMESIZE];
        !           133: struct enamemem nsaptable[HASHNAMESIZE];
        !           134: struct enamemem bytestringtable[HASHNAMESIZE];
        !           135: 
        !           136: struct protoidmem {
        !           137:        u_int32_t p_oui;
        !           138:        u_short p_proto;
        !           139:        const char *p_name;
        !           140:        struct protoidmem *p_nxt;
        !           141: };
        !           142: 
        !           143: struct protoidmem protoidtable[HASHNAMESIZE];
        !           144: 
        !           145: char *
        !           146: satoa(sa, dst, size)
        !           147:        const struct sockaddr *sa;
        !           148:        char *dst;
        !           149:        int size;
        !           150: {
        !           151:        const char *cp = 0;
        !           152: #ifdef INET6
        !           153:        char buf[100];
        !           154: #endif
        !           155:        if (!sa || !dst || size < 1)
        !           156:                return 0;
        !           157:        if (sa->sa_family == AF_INET) {
        !           158:                cp = intoa(((struct sockaddr_in *)sa)->sin_addr.s_addr);
        !           159:        }
        !           160: #ifdef INET6
        !           161:        else if (sa->sa_family == AF_INET6) {
        !           162:                cp = inet_ntop(AF_INET6,
        !           163:                               &((struct sockaddr_in6 *)sa)->sin6_addr,
        !           164:                               buf, sizeof(buf));
        !           165:        }
        !           166: #endif
        !           167: #if defined(AF_LINK) && defined(LLADDR)
        !           168:        else if (sa->sa_family == AF_LINK) {
        !           169:                struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
        !           170:                if (sdl->sdl_alen > 0)
        !           171:                        cp = linkaddr_string((u_char *)LLADDR(sdl), sdl->sdl_alen);
        !           172:        }
        !           173: #endif
        !           174:        if (!cp) return 0;
        !           175:        (void)strncpy(dst, cp, size);
        !           176:        dst[size-1] = '\0';
        !           177:        return dst;
        !           178: }
        !           179: 
        !           180: /*
        !           181:  * A faster replacement for inet_ntoa().
        !           182:  */
        !           183: const char *
        !           184: intoa(u_int32_t addr)
        !           185: {
        !           186:        register char *cp;
        !           187:        register u_int byte;
        !           188:        register int n;
        !           189:        static char buf[sizeof(".xxx.xxx.xxx.xxx")];
        !           190: 
        !           191:        NTOHL(addr);
        !           192:        cp = &buf[sizeof buf];
        !           193:        *--cp = '\0';
        !           194: 
        !           195:        n = 4;
        !           196:        do {
        !           197:                byte = addr & 0xff;
        !           198:                *--cp = byte % 10 + '0';
        !           199:                byte /= 10;
        !           200:                if (byte > 0) {
        !           201:                        *--cp = byte % 10 + '0';
        !           202:                        byte /= 10;
        !           203:                        if (byte > 0)
        !           204:                                *--cp = byte + '0';
        !           205:                }
        !           206:                *--cp = '.';
        !           207:                addr >>= 8;
        !           208:        } while (--n > 0);
        !           209: 
        !           210:        return cp + 1;
        !           211: }
        !           212: 
        !           213: extern int nflag;
        !           214: 
        !           215: static void
        !           216: name_resolved(unused, dd)
        !           217:        void *unused;
        !           218:        DOMAIN_DATA *dd;
        !           219: {
        !           220:        register struct hnamemem *p;
        !           221: 
        !           222:        /* sanity check */
        !           223:        if (unused || !dd) return;
        !           224: 
        !           225:        p = &hnametable[dd->addr & (HASHNAMESIZE-1)];
        !           226:        for (; p->nxt; p = p->nxt) {
        !           227:                if (p->addr == dd->addr) {
        !           228:                        if (p->name) free((char *)p->name);
        !           229:                        p->name = strdup(dd->name);
        !           230:                        p->resolving = 2;
        !           231:                        break;
        !           232:                }
        !           233:        }
        !           234:        domain_data_free(&dd, 0);
        !           235: }
        !           236: 
        !           237: /*
        !           238:  * Return a name for the IP address pointed to by ap.  This address
        !           239:  * is assumed to be in network byte order.
        !           240:  */
        !           241: const char *
        !           242: getname(const u_char *ap)
        !           243: {
        !           244:        u_int32_t addr;
        !           245:        register struct hnamemem *p;
        !           246:        int found;
        !           247: 
        !           248:        memcpy(&addr, ap, sizeof(addr));
        !           249: 
        !           250:        /*
        !           251:         * Do not print names if -n was given.
        !           252:         */
        !           253:        if (nflag)
        !           254:                return intoa(addr);
        !           255: 
        !           256:        found = 0;
        !           257:        p = &hnametable[addr & (HASHNAMESIZE-1)];
        !           258:        for (; p->nxt; p = p->nxt) {
        !           259:                if (p->addr == addr) {
        !           260:                        found++;
        !           261:                        break;
        !           262:                }
        !           263:        }
        !           264:        if (!found) {
        !           265:                p->addr = addr;
        !           266:                p->nxt = newhnamemem();
        !           267:                p->name = strdup(intoa(addr));
        !           268:        }
        !           269:        if (!p->resolving) {
        !           270:                if (domain_resolve_name(addr, 0, name_resolved) < 0)
        !           271:                        p->resolving = -1;
        !           272:                else    p->resolving = 1;
        !           273:        }
        !           274:        return (p->name);
        !           275: }
        !           276: 
        !           277: #ifdef INET6
        !           278: /*
        !           279:  * Return a name for the IP6 address pointed to by ap.  This address
        !           280:  * is assumed to be in network byte order.
        !           281:  */
        !           282: const char *
        !           283: getname6(const u_char *ap)
        !           284: {
        !           285:        struct hostent *hp;
        !           286:        struct in6_addr addr;
        !           287:        static struct h6namemem *p;             /* static for longjmp() */
        !           288:        const char *cp;
        !           289:        char ntop_buf[INET6_ADDRSTRLEN];
        !           290: 
        !           291:        memcpy(&addr, ap, sizeof(addr));
        !           292: 
        !           293:        /*
        !           294:         * Do not print names if -n was given.
        !           295:         */
        !           296:        if (nflag)
        !           297:                return inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
        !           298: 
        !           299:        p = &h6nametable[*(u_int16_t *)&addr.s6_addr[14] & (HASHNAMESIZE-1)];
        !           300:        for (; p->nxt; p = p->nxt) {
        !           301:                if (memcmp(&p->addr, &addr, sizeof(addr)) == 0)
        !           302:                        return (p->name);
        !           303:        }
        !           304:        p->addr = addr;
        !           305:        p->nxt = newh6namemem();
        !           306: 
        !           307:        hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6);
        !           308:        if (hp) {
        !           309:                p->name = strdup(hp->h_name);
        !           310:                return (p->name);
        !           311:        }
        !           312:        cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
        !           313:        if (!cp) return 0;
        !           314:        p->name = strdup(cp);
        !           315:        return (p->name);
        !           316: }
        !           317: #endif /* INET6 */
        !           318: 
        !           319: static char hex[] = "0123456789abcdef";
        !           320: 
        !           321: 
        !           322: /* Find the hash node that corresponds the ether address 'ep' */
        !           323: 
        !           324: static inline struct enamemem *
        !           325: lookup_emem(const u_char *ep)
        !           326: {
        !           327:        register u_int i, j, k;
        !           328:        struct enamemem *tp;
        !           329: 
        !           330:        k = (ep[0] << 8) | ep[1];
        !           331:        j = (ep[2] << 8) | ep[3];
        !           332:        i = (ep[4] << 8) | ep[5];
        !           333: 
        !           334:        tp = &enametable[(i ^ j) & (HASHNAMESIZE-1)];
        !           335:        while (tp->e_nxt)
        !           336:                if (tp->e_addr0 == i &&
        !           337:                    tp->e_addr1 == j &&
        !           338:                    tp->e_addr2 == k)
        !           339:                        return tp;
        !           340:                else
        !           341:                        tp = tp->e_nxt;
        !           342:        tp->e_addr0 = i;
        !           343:        tp->e_addr1 = j;
        !           344:        tp->e_addr2 = k;
        !           345:        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        !           346:        if (tp->e_nxt == NULL)
        !           347:                error("lookup_emem: calloc");
        !           348: 
        !           349:        return tp;
        !           350: }
        !           351: 
        !           352: /*
        !           353:  * Find the hash node that corresponds to the bytestring 'bs'
        !           354:  * with length 'nlen'
        !           355:  */
        !           356: 
        !           357: static inline struct enamemem *
        !           358: lookup_bytestring(register const u_char *bs, const unsigned int nlen)
        !           359: {
        !           360:        struct enamemem *tp;
        !           361:        register u_int i, j, k;
        !           362: 
        !           363:        if (nlen >= 6) {
        !           364:                k = (bs[0] << 8) | bs[1];
        !           365:                j = (bs[2] << 8) | bs[3];
        !           366:                i = (bs[4] << 8) | bs[5];
        !           367:        } else if (nlen >= 4) {
        !           368:                k = (bs[0] << 8) | bs[1];
        !           369:                j = (bs[2] << 8) | bs[3];
        !           370:                i = 0;
        !           371:        } else
        !           372:                i = j = k = 0;
        !           373: 
        !           374:        tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)];
        !           375:        while (tp->e_nxt)
        !           376:                if (tp->e_addr0 == i &&
        !           377:                    tp->e_addr1 == j &&
        !           378:                    tp->e_addr2 == k &&
        !           379:                    memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0)
        !           380:                        return tp;
        !           381:                else
        !           382:                        tp = tp->e_nxt;
        !           383: 
        !           384:        tp->e_addr0 = i;
        !           385:        tp->e_addr1 = j;
        !           386:        tp->e_addr2 = k;
        !           387: 
        !           388:        tp->e_bs = (u_char *) calloc(1, nlen + 1);
        !           389:        memcpy(tp->e_bs, bs, nlen);
        !           390:        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        !           391:        if (tp->e_nxt == NULL)
        !           392:                error("lookup_bytestring: calloc");
        !           393: 
        !           394:        return tp;
        !           395: }
        !           396: 
        !           397: /* Find the hash node that corresponds the NSAP 'nsap' */
        !           398: 
        !           399: static inline struct enamemem *
        !           400: lookup_nsap(register const u_char *nsap)
        !           401: {
        !           402:        register u_int i, j, k;
        !           403:        unsigned int nlen = *nsap;
        !           404:        struct enamemem *tp;
        !           405:        const u_char *ensap = nsap + nlen - 6;
        !           406: 
        !           407:        if (nlen > 6) {
        !           408:                k = (ensap[0] << 8) | ensap[1];
        !           409:                j = (ensap[2] << 8) | ensap[3];
        !           410:                i = (ensap[4] << 8) | ensap[5];
        !           411:        }
        !           412:        else
        !           413:                i = j = k = 0;
        !           414: 
        !           415:        tp = &nsaptable[(i ^ j) & (HASHNAMESIZE-1)];
        !           416:        while (tp->e_nxt)
        !           417:                if (tp->e_addr0 == i &&
        !           418:                    tp->e_addr1 == j &&
        !           419:                    tp->e_addr2 == k &&
        !           420:                    tp->e_nsap[0] == nlen &&
        !           421:                    memcmp((const char *)&(nsap[1]),
        !           422:                        (char *)&(tp->e_nsap[1]), nlen) == 0)
        !           423:                        return tp;
        !           424:                else
        !           425:                        tp = tp->e_nxt;
        !           426:        tp->e_addr0 = i;
        !           427:        tp->e_addr1 = j;
        !           428:        tp->e_addr2 = k;
        !           429:        tp->e_nsap = (u_char *)malloc(nlen + 1);
        !           430:        if (tp->e_nsap == NULL)
        !           431:                error("lookup_nsap: malloc");
        !           432:        memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1);
        !           433:        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        !           434:        if (tp->e_nxt == NULL)
        !           435:                error("lookup_nsap: calloc");
        !           436: 
        !           437:        return tp;
        !           438: }
        !           439: 
        !           440: /* Find the hash node that corresponds the protoid 'pi'. */
        !           441: 
        !           442: static inline struct protoidmem *
        !           443: lookup_protoid(const u_char *pi)
        !           444: {
        !           445:        register u_int i, j;
        !           446:        struct protoidmem *tp;
        !           447: 
        !           448:        /* 5 octets won't be aligned */
        !           449:        i = (((pi[0] << 8) + pi[1]) << 8) + pi[2];
        !           450:        j =   (pi[3] << 8) + pi[4];
        !           451:        /* XXX should be endian-insensitive, but do big-endian testing  XXX */
        !           452: 
        !           453:        tp = &protoidtable[(i ^ j) & (HASHNAMESIZE-1)];
        !           454:        while (tp->p_nxt)
        !           455:                if (tp->p_oui == i && tp->p_proto == j)
        !           456:                        return tp;
        !           457:                else
        !           458:                        tp = tp->p_nxt;
        !           459:        tp->p_oui = i;
        !           460:        tp->p_proto = j;
        !           461:        tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp));
        !           462:        if (tp->p_nxt == NULL)
        !           463:                error("lookup_protoid: calloc");
        !           464: 
        !           465:        return tp;
        !           466: }
        !           467: 
        !           468: const char *
        !           469: etheraddr_string(register const u_char *ep)
        !           470: {
        !           471:        register u_int i;
        !           472:        register char *cp;
        !           473:        register struct enamemem *tp;
        !           474:        char buf[sizeof("00:00:00:00:00:00")];
        !           475: 
        !           476:        tp = lookup_emem(ep);
        !           477:        if (tp->e_name)
        !           478:                return (tp->e_name);
        !           479: #ifdef USE_ETHER_NTOHOST
        !           480:        if (!nflag) {
        !           481:                char buf2[128];
        !           482:                if (ether_ntohost(buf2, (const struct ether_addr *)ep) == 0) {
        !           483:                        tp->e_name = strdup(buf2);
        !           484:                        return (tp->e_name);
        !           485:                }
        !           486:        }
        !           487: #endif
        !           488:        cp = buf;
        !           489:         *cp++ = hex[*ep >> 4 ];
        !           490:        *cp++ = hex[*ep++ & 0xf];
        !           491:        for (i = 5; (int)--i >= 0;) {
        !           492:                *cp++ = ':';
        !           493:                 *cp++ = hex[*ep >> 4 ];
        !           494:                *cp++ = hex[*ep++ & 0xf];
        !           495:        }
        !           496:        *cp = '\0';
        !           497:        tp->e_name = strdup(buf);
        !           498:        return (tp->e_name);
        !           499: }
        !           500: 
        !           501: const char *
        !           502: linkaddr_string(const u_char *ep, const unsigned int len)
        !           503: {
        !           504:        register u_int i, j;
        !           505:        register char *cp;
        !           506:        register struct enamemem *tp;
        !           507: 
        !           508:        if (!ep || len < 1) return "";
        !           509: 
        !           510: #ifdef notdef
        !           511:        if (len == 6)   /* XXX not totally correct... */
        !           512:                return etheraddr_string(ep);
        !           513: #endif
        !           514: 
        !           515:        tp = lookup_bytestring(ep, len);
        !           516:        if (tp->e_name)
        !           517:                return (tp->e_name);
        !           518: 
        !           519:        tp->e_name = cp = (char *)malloc(len*3);
        !           520:        if (tp->e_name == NULL)
        !           521:                error("linkaddr_string: malloc");
        !           522:        if ((j = *ep >> 4) != 0)
        !           523:                *cp++ = hex[j];
        !           524:        *cp++ = hex[*ep++ & 0xf];
        !           525:        for (i = len-1; i > 0 ; --i) {
        !           526:                *cp++ = ':';
        !           527:                if ((j = *ep >> 4) != 0)
        !           528:                        *cp++ = hex[j];
        !           529:                *cp++ = hex[*ep++ & 0xf];
        !           530:        }
        !           531:        *cp = '\0';
        !           532:        return (tp->e_name);
        !           533: }
        !           534: 
        !           535: const char *
        !           536: ethertype_string(u_short type)
        !           537: {
        !           538:        register char *cp;
        !           539:        register struct hnamemem *tp;
        !           540:        register u_int32_t i = type;
        !           541:        char buf[sizeof("0000")];
        !           542: 
        !           543:        for (tp = &etypetable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
        !           544:                if (tp->addr == i)
        !           545:                        return (tp->name);
        !           546: 
        !           547:        tp->addr = i;
        !           548:        tp->nxt = newhnamemem();
        !           549: 
        !           550:        cp = buf;
        !           551:        NTOHS(type);
        !           552:        *cp++ = toupper(hex[type >> 12 & 0xf]);
        !           553:        *cp++ = toupper(hex[type >> 8 & 0xf]);
        !           554:        *cp++ = toupper(hex[type >> 4 & 0xf]);
        !           555:        *cp++ = toupper(hex[type & 0xf]);
        !           556:        *cp++ = '\0';
        !           557:        tp->name = strdup(buf);
        !           558:        return (tp->name);
        !           559: }
        !           560: 
        !           561: const char *
        !           562: protoid_string(register const u_char *pi)
        !           563: {
        !           564:        register u_int i, j;
        !           565:        register char *cp;
        !           566:        register struct protoidmem *tp;
        !           567:        char buf[sizeof("00:00:00:00:00")];
        !           568: 
        !           569:        tp = lookup_protoid(pi);
        !           570:        if (tp->p_name)
        !           571:                return tp->p_name;
        !           572: 
        !           573:        cp = buf;
        !           574:        if ((j = *pi >> 4) != 0)
        !           575:                *cp++ = hex[j];
        !           576:        *cp++ = hex[*pi++ & 0xf];
        !           577:        for (i = 4; (int)--i >= 0;) {
        !           578:                *cp++ = ':';
        !           579:                if ((j = *pi >> 4) != 0)
        !           580:                        *cp++ = hex[j];
        !           581:                *cp++ = hex[*pi++ & 0xf];
        !           582:        }
        !           583:        *cp = '\0';
        !           584:        tp->p_name = strdup(buf);
        !           585:        return (tp->p_name);
        !           586: }
        !           587: 
        !           588: const char *
        !           589: llcsap_string(u_char sap)
        !           590: {
        !           591:        register struct hnamemem *tp;
        !           592:        register u_int32_t i = sap;
        !           593:        char buf[sizeof("sap-00")];
        !           594: 
        !           595:        for (tp = &llcsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
        !           596:                if (tp->addr == i)
        !           597:                        return (tp->name);
        !           598: 
        !           599:        tp->addr = i;
        !           600:        tp->nxt = newhnamemem();
        !           601: 
        !           602:        snprintf(buf, sizeof(buf), "sap-%02x", sap & 0xff);
        !           603:        tp->name = strdup(buf);
        !           604:        return (tp->name);
        !           605: }
        !           606: 
        !           607: const char *
        !           608: isonsap_string(const u_char *nsap)
        !           609: {
        !           610:        register u_int i, nlen = nsap[0];
        !           611:        register char *cp;
        !           612:        register struct enamemem *tp;
        !           613: 
        !           614:        tp = lookup_nsap(nsap);
        !           615:        if (tp->e_name)
        !           616:                return tp->e_name;
        !           617: 
        !           618:        tp->e_name = cp = (char *)malloc(nlen * 2 + 2);
        !           619:        if (cp == NULL)
        !           620:                error("isonsap_string: malloc");
        !           621: 
        !           622:        nsap++;
        !           623:        *cp++ = '/';
        !           624:        for (i = nlen; (int)--i >= 0;) {
        !           625:                *cp++ = hex[*nsap >> 4];
        !           626:                *cp++ = hex[*nsap++ & 0xf];
        !           627:        }
        !           628:        *cp = '\0';
        !           629:        return (tp->e_name);
        !           630: }
        !           631: 
        !           632: const char *
        !           633: tcpport_string(u_short port)
        !           634: {
        !           635:        register struct hnamemem *tp;
        !           636:        register u_int32_t i = port;
        !           637:        char buf[sizeof("00000")];
        !           638: 
        !           639:        for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) {
        !           640:                if (tp->addr == i)
        !           641:                        return (tp->name);
        !           642:        }
        !           643:        tp->addr = i;
        !           644:        tp->nxt = newhnamemem();
        !           645: 
        !           646:        (void)snprintf(buf, sizeof(buf), "%u", i);
        !           647:        tp->name = strdup(buf);
        !           648:        return (tp->name);
        !           649: }
        !           650: 
        !           651: const char *
        !           652: udpport_string(u_short port)
        !           653: {
        !           654:        register struct hnamemem *tp;
        !           655:        register u_int32_t i = port;
        !           656:        char buf[sizeof("00000")];
        !           657: 
        !           658:        for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) {
        !           659:                if (tp->addr == i)
        !           660:                        return (tp->name);
        !           661:        }
        !           662:        tp->addr = i;
        !           663:        tp->nxt = newhnamemem();
        !           664: 
        !           665:        (void)snprintf(buf, sizeof(buf), "%u", i);
        !           666:        tp->name = strdup(buf);
        !           667:        return (tp->name);
        !           668: }
        !           669: 
        !           670: int
        !           671: isservport(u_short port)
        !           672: {
        !           673:        register struct hnamemem *tp;
        !           674:         register u_int32_t i = port;
        !           675: 
        !           676:        for (tp = &servtable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) {
        !           677:                if (tp->addr == i)
        !           678:                        return 1;
        !           679:        }
        !           680:        return 0;
        !           681: }
        !           682: 
        !           683: const char *
        !           684: ipxsap_string(u_short port)
        !           685: {
        !           686:        register char *cp;
        !           687:        register struct hnamemem *tp;
        !           688:        register u_int32_t i = port;
        !           689:        char buf[sizeof("0000")];
        !           690: 
        !           691:        for (tp = &ipxsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
        !           692:                if (tp->addr == i)
        !           693:                        return (tp->name);
        !           694: 
        !           695:        tp->addr = i;
        !           696:        tp->nxt = newhnamemem();
        !           697: 
        !           698:        cp = buf;
        !           699:        NTOHS(port);
        !           700:        *cp++ = toupper(hex[port >> 12 & 0xf]);
        !           701:        *cp++ = toupper(hex[port >> 8 & 0xf]);
        !           702:        *cp++ = toupper(hex[port >> 4 & 0xf]);
        !           703:        *cp++ = toupper(hex[port & 0xf]);
        !           704:        *cp++ = '\0';
        !           705:        tp->name = strdup(buf);
        !           706:        return (tp->name);
        !           707: }
        !           708: 
        !           709: static void
        !           710: init_servarray(void)
        !           711: {
        !           712:        struct servent *sv;
        !           713:        register struct hnamemem *table;
        !           714:        register int i;
        !           715: 
        !           716:        while ((sv = getservent()) != NULL) {
        !           717:                int port = ntohs(sv->s_port);
        !           718:                i = port & (HASHNAMESIZE-1);
        !           719: 
        !           720:                table = &servtable[i];
        !           721:                if (table->addr != port) {
        !           722:                        while (table->addr)
        !           723:                                table = table->nxt;
        !           724:                        table->addr = port;
        !           725:                        table->nxt = newhnamemem();
        !           726:                }
        !           727: 
        !           728:                if (strcmp(sv->s_proto, "tcp") == 0)
        !           729:                        table = &tporttable[i];
        !           730:                else if (strcmp(sv->s_proto, "udp") == 0)
        !           731:                        table = &uporttable[i];
        !           732:                else    continue;
        !           733: 
        !           734:                while (table->name)
        !           735:                        table = table->nxt;
        !           736:                table->name = strdup(sv->s_name);
        !           737:                table->addr = port;
        !           738:                table->nxt = newhnamemem();
        !           739:        }
        !           740:        endservent();
        !           741: }
        !           742: 
        !           743: static struct tok ethertype_db[] = {
        !           744:        { ETHERTYPE_IP,             "ip"        },
        !           745:        { ETHERTYPE_MPLS,           "mpls"      },
        !           746:        { ETHERTYPE_MPLS_MULTI,     "mpls-mc"   },
        !           747:        { ETHERTYPE_IPV6,           "ipv6"      },
        !           748:        { ETHERTYPE_8021Q,          "dot1q"     },
        !           749:        { ETHERTYPE_VMAN,           "vman"      },
        !           750:        { ETHERTYPE_PUP,            "pup"       },
        !           751:        { ETHERTYPE_ARP,            "arp"       },
        !           752:        { ETHERTYPE_REVARP ,        "rarp"      },
        !           753:        { ETHERTYPE_NS,             "ns"        },
        !           754:        { ETHERTYPE_SPRITE,         "sprite"    },
        !           755:        { ETHERTYPE_TRAIL,          "trail"     },
        !           756:        { ETHERTYPE_CDP,            "cdp"       },
        !           757:        { ETHERTYPE_MOPDL,          "mop-dl"    },
        !           758:        { ETHERTYPE_MOPRC,          "mop-rc"    },
        !           759:        { ETHERTYPE_DN,             "dn"        },
        !           760:        { ETHERTYPE_LAT,            "lat"       },
        !           761:        { ETHERTYPE_SCA,            "sca"       },
        !           762:        { ETHERTYPE_LANBRIDGE,      "lanbridge" },
        !           763:        { ETHERTYPE_DECDNS,         "dec-dns"   },
        !           764:        { ETHERTYPE_DECDTS,         "dec-dts"   },
        !           765:        { ETHERTYPE_VEXP,           "vexp"      },
        !           766:        { ETHERTYPE_VPROD,          "vprod"     },
        !           767:        { ETHERTYPE_ATALK,          "atalk"     },
        !           768:        { ETHERTYPE_AARP,           "atalk-arp" },
        !           769:        { ETHERTYPE_IPX,            "ipx"       },
        !           770:        { ETHERTYPE_PPP,            "ppp"       },
        !           771:        { ETHERTYPE_PPPOED,         "pppoe-d"   },
        !           772:        { ETHERTYPE_PPPOES,         "pppoe-s"   },
        !           773:        { ETHERTYPE_LOOPBACK,       "loopback"  },
        !           774:        { 0, NULL }
        !           775: };
        !           776: 
        !           777: static void
        !           778: init_etypearray(void)
        !           779: {
        !           780:        register int i;
        !           781:        register struct hnamemem *table;
        !           782: 
        !           783:        for (i = 0; ethertype_db[i].s; i++) {
        !           784:                int j = htons(ethertype_db[i].v) & (HASHNAMESIZE-1);
        !           785:                table = &etypetable[j];
        !           786:                while (table->name)
        !           787:                        table = table->nxt;
        !           788:                table->name = ethertype_db[i].s;
        !           789:                table->addr = htons(ethertype_db[i].v);
        !           790:                table->nxt = newhnamemem();
        !           791:        }
        !           792: }
        !           793: 
        !           794: static struct protoidlist {
        !           795:        const u_char protoid[5];
        !           796:        const char *name;
        !           797: } protoidlist[] = {
        !           798:        {{ 0x00, 0x00, 0x0c, 0x01, 0x07 }, "CiscoMLS" },
        !           799:        {{ 0x00, 0x00, 0x0c, 0x20, 0x00 }, "CiscoCDP" },
        !           800:        {{ 0x00, 0x00, 0x0c, 0x20, 0x01 }, "CiscoCGMP" },
        !           801:        {{ 0x00, 0x00, 0x0c, 0x20, 0x03 }, "CiscoVTP" },
        !           802:        {{ 0x00, 0xe0, 0x2b, 0x00, 0xbb }, "ExtremeEDP" },
        !           803:        {{ 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
        !           804: };
        !           805: 
        !           806: /*
        !           807:  * SNAP proto IDs with org code 0:0:0 are actually encapsulated Ethernet
        !           808:  * types.
        !           809:  */
        !           810: static void
        !           811: init_protoidarray(void)
        !           812: {
        !           813:        register int i;
        !           814:        register struct protoidmem *tp;
        !           815:        struct protoidlist *pl;
        !           816:        u_char protoid[5];
        !           817: 
        !           818:        protoid[0] = 0;
        !           819:        protoid[1] = 0;
        !           820:        protoid[2] = 0;
        !           821:        for (i = 0; ethertype_db[i].s; i++) {
        !           822:                u_short etype = htons(ethertype_db[i].v);
        !           823: 
        !           824:                memcpy((char *)&protoid[3], (char *)&etype, 2);
        !           825:                tp = lookup_protoid(protoid);
        !           826:                tp->p_name = strdup(ethertype_db[i].s);
        !           827:        }
        !           828:        /* Hardwire some SNAP proto ID names */
        !           829:        for (pl = protoidlist; pl->name != NULL; ++pl) {
        !           830:                tp = lookup_protoid(pl->protoid);
        !           831:                /* Don't override existing name */
        !           832:                if (tp->p_name != NULL)
        !           833:                        continue;
        !           834: 
        !           835:                tp->p_name = pl->name;
        !           836:        }
        !           837: }
        !           838: 
        !           839: static struct etherlist {
        !           840:        const u_char addr[6];
        !           841:        const char *name;
        !           842: } etherlist[] = {
        !           843:        {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, "ethernet" },
        !           844:        {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "broadcast" },
        !           845:        {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
        !           846: };
        !           847: 
        !           848: /*
        !           849:  * Initialize the ethers hash table.  We take two different approaches
        !           850:  * depending on whether or not the system provides the ethers name
        !           851:  * service.  If it does, we just wire in a few names at startup,
        !           852:  * and etheraddr_string() fills in the table on demand.  If it doesn't,
        !           853:  * then we suck in the entire /etc/ethers file at startup.  The idea
        !           854:  * is that parsing the local file will be fast, but spinning through
        !           855:  * all the ethers entries via NIS & next_etherent might be very slow.
        !           856:  *
        !           857:  * XXX pcap_next_etherent doesn't belong in the pcap interface, but
        !           858:  * since the pcap module already does name-to-address translation,
        !           859:  * it's already does most of the work for the ethernet address-to-name
        !           860:  * translation, so we just pcap_next_etherent as a convenience.
        !           861:  */
        !           862: static void
        !           863: init_etherarray(void)
        !           864: {
        !           865:        register struct etherlist *el;
        !           866:        register struct enamemem *tp;
        !           867: #ifdef USE_ETHER_NTOHOST
        !           868:        char name[256];
        !           869: #else
        !           870:        register struct pcap_etherent *ep;
        !           871:        register FILE *fp;
        !           872: 
        !           873:        /* Suck in entire ethers file */
        !           874:        fp = fopen(PCAP_ETHERS_FILE, "r");
        !           875:        if (fp != NULL) {
        !           876:                while ((ep = pcap_next_etherent(fp)) != NULL) {
        !           877:                        tp = lookup_emem(ep->addr);
        !           878:                        tp->e_name = strdup(ep->name);
        !           879:                }
        !           880:                (void)fclose(fp);
        !           881:        }
        !           882: #endif
        !           883: 
        !           884:        /* Hardwire some ethernet names */
        !           885:        for (el = etherlist; el->name != NULL; ++el) {
        !           886:                tp = lookup_emem(el->addr);
        !           887:                /* Don't override existing name */
        !           888:                if (tp->e_name != NULL)
        !           889:                        continue;
        !           890: 
        !           891: #ifdef USE_ETHER_NTOHOST
        !           892:                 /* Use yp/nis version of name if available */
        !           893:                 if (ether_ntohost(name, (const struct ether_addr *)el->addr) == 0) {
        !           894:                         tp->e_name = strdup(name);
        !           895:                        continue;
        !           896:                }
        !           897: #endif
        !           898:                tp->e_name = el->name;
        !           899:        }
        !           900: }
        !           901: 
        !           902: static struct tok llcsap_db[] = {
        !           903:        /* IEEE SAPs */
        !           904:        { 0x00, "null"          },
        !           905:        { 0x02, "isap"          },
        !           906:        { 0x03, "gsap"          },
        !           907:        { 0x06, "ip-sap"        },
        !           908:        { 0x0e, "proway-nm"     },
        !           909:        { 0x42, "stp"           },
        !           910:        { 0x4e, "rs511"         },
        !           911:        { 0x5e, "isi-ip"        },
        !           912:        { 0x7e, "x25-plp"       },
        !           913:        { 0x80, "3com"          },
        !           914:        { 0x8e, "proway"        },
        !           915:        { 0xaa, "snap"          },
        !           916:        { 0xbc, "banyan"        },
        !           917:        { 0xe0, "ipx"           },
        !           918:        { 0xf0, "netbeui"       },
        !           919:        { 0xf4, "lanman"        },
        !           920:        { 0xfe, "iso-clns"      },
        !           921:        { 0xff, "raw-ipx"       }, /* known as raw 802.3 packet */
        !           922:        /* IBM SAPs */
        !           923:        { 0x04, "isna"          },
        !           924:        { 0x05, "gsna"          },
        !           925:        { 0xd4, "resource"      },
        !           926:        { 0xdc, "dyn-arp"       },
        !           927:        { 0xf0, "netbios"       },
        !           928:        { 0xf8, "irpl"          },
        !           929:        { 0xf4, "ilan"          },
        !           930:        { 0xf5, "glan"          },
        !           931:        { 0xfc, "discovery"     },
        !           932:        { 0, NULL }
        !           933: };
        !           934: 
        !           935: static void
        !           936: init_llcsaparray(void)
        !           937: {
        !           938:        register int i;
        !           939:        register struct hnamemem *table;
        !           940: 
        !           941:        for (i = 0; llcsap_db[i].s != NULL; i++) {
        !           942:                table = &llcsaptable[llcsap_db[i].v];
        !           943:                while (table->name)
        !           944:                        table = table->nxt;
        !           945:                table->name = llcsap_db[i].s;
        !           946:                table->addr = llcsap_db[i].v;
        !           947:                table->nxt = newhnamemem();
        !           948:        }
        !           949: }
        !           950: 
        !           951: static struct tok ipxsap_db[] = {
        !           952:        { 0x0000, "Unknown" },
        !           953:        { 0x0001, "User" },
        !           954:        { 0x0002, "User Group" },
        !           955:        { 0x0003, "PrintQueue" },
        !           956:        { 0x0004, "FileServer" },
        !           957:        { 0x0005, "JobServer" },
        !           958:        { 0x0006, "Gateway" },
        !           959:        { 0x0007, "PrintServer" },
        !           960:        { 0x0008, "ArchiveQueue" },
        !           961:        { 0x0009, "ArchiveServer" },
        !           962:        { 0x000a, "JobQueue" },
        !           963:        { 0x000b, "Administration" },
        !           964:        { 0x000F, "Novell TI-RPC" },
        !           965:        { 0x0017, "Diagnostics" },
        !           966:        { 0x0020, "NetBIOS" },
        !           967:        { 0x0021, "NAS SNA Gateway" },
        !           968:        { 0x0023, "NACS AsyncGateway" },
        !           969:        { 0x0024, "RemoteBridge/RoutingService" },
        !           970:        { 0x0026, "BridgeServer" },
        !           971:        { 0x0027, "TCP/IP Gateway" },
        !           972:        { 0x0028, "Point-to-point X.25 BridgeServer" },
        !           973:        { 0x0029, "3270 Gateway" },
        !           974:        { 0x002a, "CHI Corp" },
        !           975:        { 0x002c, "PC Chalkboard" },
        !           976:        { 0x002d, "TimeSynchServer" },
        !           977:        { 0x002e, "ARCserve5.0/PalindromeBackup" },
        !           978:        { 0x0045, "DI3270 Gateway" },
        !           979:        { 0x0047, "AdvertisingPrintServer" },
        !           980:        { 0x004a, "NetBlazerModems" },
        !           981:        { 0x004b, "BtrieveVAP" },
        !           982:        { 0x004c, "NetwareSQL" },
        !           983:        { 0x004d, "XtreeNetwork" },
        !           984:        { 0x0050, "BtrieveVAP4.11" },
        !           985:        { 0x0052, "QuickLink" },
        !           986:        { 0x0053, "PrintQueueUser" },
        !           987:        { 0x0058, "Multipoint X.25 Router" },
        !           988:        { 0x0060, "STLB/NLM" },
        !           989:        { 0x0064, "ARCserve" },
        !           990:        { 0x0066, "ARCserve3.0" },
        !           991:        { 0x0072, "WAN CopyUtility" },
        !           992:        { 0x007a, "TES-NetwareVMS" },
        !           993:        { 0x0092, "WATCOM Debugger/EmeraldTapeBackupServer" },
        !           994:        { 0x0095, "DDA OBGYN" },
        !           995:        { 0x0098, "NetwareAccessServer" },
        !           996:        { 0x009a, "Netware for VMS II/NamedPipeServer" },
        !           997:        { 0x009b, "NetwareAccessServer" },
        !           998:        { 0x009e, "PortableNetwareServer/SunLinkNVT" },
        !           999:        { 0x00a1, "PowerchuteAPC UPS" },
        !          1000:        { 0x00aa, "LAWserve" },
        !          1001:        { 0x00ac, "CompaqIDA StatusMonitor" },
        !          1002:        { 0x0100, "PIPE STAIL" },
        !          1003:        { 0x0102, "LAN ProtectBindery" },
        !          1004:        { 0x0103, "OracleDataBaseServer" },
        !          1005:        { 0x0107, "Netware386/RSPX RemoteConsole" },
        !          1006:        { 0x010f, "NovellSNA Gateway" },
        !          1007:        { 0x0111, "TestServer" },
        !          1008:        { 0x0112, "HP PrintServer" },
        !          1009:        { 0x0114, "CSA MUX" },
        !          1010:        { 0x0115, "CSA LCA" },
        !          1011:        { 0x0116, "CSA CM" },
        !          1012:        { 0x0117, "CSA SMA" },
        !          1013:        { 0x0118, "CSA DBA" },
        !          1014:        { 0x0119, "CSA NMA" },
        !          1015:        { 0x011a, "CSA SSA" },
        !          1016:        { 0x011b, "CSA STATUS" },
        !          1017:        { 0x011e, "CSA APPC" },
        !          1018:        { 0x0126, "SNA TEST SSA Profile" },
        !          1019:        { 0x012a, "CSA TRACE" },
        !          1020:        { 0x012b, "NetwareSAA" },
        !          1021:        { 0x012e, "IKARUS VirusScan" },
        !          1022:        { 0x0130, "CommunicationsExecutive" },
        !          1023:        { 0x0133, "NNS DomainServer/NetwareNamingServicesDomain" },
        !          1024:        { 0x0135, "NetwareNamingServicesProfile" },
        !          1025:        { 0x0137, "Netware386 PrintQueue/NNS PrintQueue" },
        !          1026:        { 0x0141, "LAN SpoolServer" },
        !          1027:        { 0x0152, "IRMALAN Gateway" },
        !          1028:        { 0x0154, "NamedPipeServer" },
        !          1029:        { 0x0166, "NetWareManagement" },
        !          1030:        { 0x0168, "Intel PICKIT CommServer/Intel CAS TalkServer" },
        !          1031:        { 0x0173, "Compaq" },
        !          1032:        { 0x0174, "Compaq SNMP Agent" },
        !          1033:        { 0x0175, "Compaq" },
        !          1034:        { 0x0180, "XTreeServer/XTreeTools" },
        !          1035:        { 0x018A, "NASI ServicesBroadcastServer" },
        !          1036:        { 0x01b0, "GARP Gateway" },
        !          1037:        { 0x01b1, "Binfview" },
        !          1038:        { 0x01bf, "IntelLanDeskManager" },
        !          1039:        { 0x01ca, "AXTEC" },
        !          1040:        { 0x01cb, "ShivaNetModem/E" },
        !          1041:        { 0x01cc, "ShivaLanRover/E" },
        !          1042:        { 0x01cd, "ShivaLanRover/T" },
        !          1043:        { 0x01ce, "ShivaUniversal" },
        !          1044:        { 0x01d8, "CastelleFAXPressServer" },
        !          1045:        { 0x01da, "CastelleLANPressPrintServer" },
        !          1046:        { 0x01dc, "CastelleFAX/Xerox7033 FaxServer/ExcelLanFax" },
        !          1047:        { 0x01f0, "LEGATO" },
        !          1048:        { 0x01f5, "LEGATO" },
        !          1049:        { 0x0233, "NMS Agent/NetwareManagementAgent" },
        !          1050:        { 0x0237, "NMS IPX Discovery/LANternReadWriteChannel" },
        !          1051:        { 0x0238, "NMS IP Discovery/LANternTrapAlarmChannel" },
        !          1052:        { 0x023a, "LANtern" },
        !          1053:        { 0x023c, "MAVERICK" },
        !          1054:        { 0x023f, "NovellSMDR" },
        !          1055:        { 0x024e, "NetwareConnect" },
        !          1056:        { 0x024f, "NASI ServerBroadcast Cisco" },
        !          1057:        { 0x026a, "NMS ServiceConsole" },
        !          1058:        { 0x026b, "TimeSynchronizationServer Netware 4.x" },
        !          1059:        { 0x0278, "DirectoryServer Netware 4.x" },
        !          1060:        { 0x027b, "NetwareManagementAgent" },
        !          1061:        { 0x0280, "Novell File and Printer Sharing Service for PC" },
        !          1062:        { 0x0304, "NovellSAA Gateway" },
        !          1063:        { 0x0308, "COM/VERMED" },
        !          1064:        { 0x030a, "GalacticommWorldgroupServer" },
        !          1065:        { 0x030c, "IntelNetport2/HP JetDirect/HP Quicksilver" },
        !          1066:        { 0x0320, "AttachmateGateway" },
        !          1067:        { 0x0327, "MicrosoftDiagnostiocs" },
        !          1068:        { 0x0328, "WATCOM SQL Server" },
        !          1069:        { 0x0335, "MultiTechSystems MultisynchCommServer" },
        !          1070:        { 0x0343, "Xylogics RemoteAccessServer/LANModem" },
        !          1071:        { 0x0355, "ArcadaBackupExec" },
        !          1072:        { 0x0358, "MSLCD1" },
        !          1073:        { 0x0361, "NETINELO" },
        !          1074:        { 0x037e, "Powerchute UPS Monitoring" },
        !          1075:        { 0x037f, "ViruSafeNotify" },
        !          1076:        { 0x0386, "HP Bridge" },
        !          1077:        { 0x0387, "HP Hub" },
        !          1078:        { 0x0394, "NetWare SAA Gateway" },
        !          1079:        { 0x039b, "LotusNotes" },
        !          1080:        { 0x03b7, "CertusAntiVirus" },
        !          1081:        { 0x03c4, "ARCserve4.0" },
        !          1082:        { 0x03c7, "LANspool3.5" },
        !          1083:        { 0x03d7, "LexmarkPrinterServer" },
        !          1084:        { 0x03d8, "LexmarkXLE PrinterServer" },
        !          1085:        { 0x03dd, "BanyanENS NetwareClient" },
        !          1086:        { 0x03de, "GuptaSequelBaseServer/NetWareSQL" },
        !          1087:        { 0x03e1, "UnivelUnixware" },
        !          1088:        { 0x03e4, "UnivelUnixware" },
        !          1089:        { 0x03fc, "IntelNetport" },
        !          1090:        { 0x03fd, "PrintServerQueue" },
        !          1091:        { 0x040A, "ipnServer" },
        !          1092:        { 0x040D, "LVERRMAN" },
        !          1093:        { 0x040E, "LVLIC" },
        !          1094:        { 0x0414, "NET Silicon (DPI)/Kyocera" },
        !          1095:        { 0x0429, "SiteLockVirus" },
        !          1096:        { 0x0432, "UFHELPR???" },
        !          1097:        { 0x0433, "Synoptics281xAdvancedSNMPAgent" },
        !          1098:        { 0x0444, "MicrosoftNT SNA Server" },
        !          1099:        { 0x0448, "Oracle" },
        !          1100:        { 0x044c, "ARCserve5.01" },
        !          1101:        { 0x0457, "CanonGP55" },
        !          1102:        { 0x045a, "QMS Printers" },
        !          1103:        { 0x045b, "DellSCSI Array" },
        !          1104:        { 0x0491, "NetBlazerModems" },
        !          1105:        { 0x04ac, "OnTimeScheduler" },
        !          1106:        { 0x04b0, "CD-Net" },
        !          1107:        { 0x0513, "EmulexNQA" },
        !          1108:        { 0x0520, "SiteLockChecks" },
        !          1109:        { 0x0529, "SiteLockChecks" },
        !          1110:        { 0x052d, "CitrixOS2 AppServer" },
        !          1111:        { 0x0535, "Tektronix" },
        !          1112:        { 0x0536, "Milan" },
        !          1113:        { 0x055d, "Attachmate SNA gateway" },
        !          1114:        { 0x056b, "IBM8235 ModemServer" },
        !          1115:        { 0x056c, "ShivaLanRover/E PLUS" },
        !          1116:        { 0x056d, "ShivaLanRover/T PLUS" },
        !          1117:        { 0x0580, "McAfeeNetShield" },
        !          1118:        { 0x05B8, "NLM to workstation communication (Revelation Software)" },
        !          1119:        { 0x05BA, "CompatibleSystemsRouters" },
        !          1120:        { 0x05BE, "CheyenneHierarchicalStorageManager" },
        !          1121:        { 0x0606, "JCWatermarkImaging" },
        !          1122:        { 0x060c, "AXISNetworkPrinter" },
        !          1123:        { 0x0610, "AdaptecSCSIManagement" },
        !          1124:        { 0x0621, "IBM AntiVirus" },
        !          1125:        { 0x0640, "Windows95 RemoteRegistryService" },
        !          1126:        { 0x064e, "MicrosoftIIS" },
        !          1127:        { 0x067b, "Microsoft Win95/98 File and Print Sharing for NetWare" },
        !          1128:        { 0x067c, "Microsoft Win95/98 File and Print Sharing for NetWare" },
        !          1129:        { 0x076C, "Xerox" },
        !          1130:        { 0x079b, "ShivaLanRover/E 115" },
        !          1131:        { 0x079c, "ShivaLanRover/T 115" },
        !          1132:        { 0x07B4, "CubixWorldDesk" },
        !          1133:        { 0x07c2, "Quarterdeck IWare Connect V2.x NLM" },
        !          1134:        { 0x07c1, "Quarterdeck IWare Connect V3.x NLM" },
        !          1135:        { 0x0810, "ELAN License Server Demo" },
        !          1136:        { 0x0824, "ShivaLanRoverAccessSwitch/E" },
        !          1137:        { 0x086a, "ISSC Collector" },
        !          1138:        { 0x087f, "ISSC DAS AgentAIX" },
        !          1139:        { 0x0880, "Intel Netport PRO" },
        !          1140:        { 0x0881, "Intel Netport PRO" },
        !          1141:        { 0x0b29, "SiteLock" },
        !          1142:        { 0x0c29, "SiteLockApplications" },
        !          1143:        { 0x0c2c, "LicensingServer" },
        !          1144:        { 0x2101, "PerformanceTechnologyInstantInternet" },
        !          1145:        { 0x2380, "LAI SiteLock" },
        !          1146:        { 0x238c, "MeetingMaker" },
        !          1147:        { 0x4808, "SiteLockServer/SiteLockMetering" },
        !          1148:        { 0x5555, "SiteLockUser" },
        !          1149:        { 0x6312, "Tapeware" },
        !          1150:        { 0x6f00, "RabbitGateway" },
        !          1151:        { 0x7703, "MODEM" },
        !          1152:        { 0x8002, "NetPortPrinters" },
        !          1153:        { 0x8008, "WordPerfectNetworkVersion" },
        !          1154:        { 0x85BE, "Cisco EIGRP" },
        !          1155:        { 0x8888, "WordPerfectNetworkVersion/QuickNetworkManagement" },
        !          1156:        { 0x9000, "McAfeeNetShield" },
        !          1157:        { 0x9604, "CSA-NT_MON" },
        !          1158:        { 0xb6a8, "OceanIsleReachoutRemoteControl" },
        !          1159:        { 0xf11f, "SiteLockMetering" },
        !          1160:        { 0xf1ff, "SiteLock" },
        !          1161:        { 0xf503, "Microsoft SQL Server" },
        !          1162:        { 0xF905, "IBM TimeAndPlace" },
        !          1163:        { 0xfbfb, "TopCallIII FaxServer" },
        !          1164:        { 0xffff, "AnyService/Wildcard" },
        !          1165:        { 0, (char *)0 }
        !          1166: };
        !          1167: 
        !          1168: static void
        !          1169: init_ipxsaparray(void)
        !          1170: {
        !          1171:        register int i;
        !          1172:        register struct hnamemem *table;
        !          1173: 
        !          1174:        for (i = 0; ipxsap_db[i].s != NULL; i++) {
        !          1175:                int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1);
        !          1176:                table = &ipxsaptable[j];
        !          1177:                while (table->name)
        !          1178:                        table = table->nxt;
        !          1179:                table->name = ipxsap_db[i].s;
        !          1180:                table->addr = htons(ipxsap_db[i].v);
        !          1181:                table->nxt = newhnamemem();
        !          1182:        }
        !          1183: }
        !          1184: 
        !          1185: const char *
        !          1186: ipproto_string(u_char proto)
        !          1187: {
        !          1188:        register struct hnamemem *tp;
        !          1189:        register u_int32_t i = proto;
        !          1190:        char buf[sizeof("00000")];
        !          1191: 
        !          1192:        for (tp = &iprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
        !          1193:                if (tp->addr == i)
        !          1194:                        return (tp->name);
        !          1195: 
        !          1196:        tp->addr = i;
        !          1197:        tp->nxt = newhnamemem();
        !          1198: 
        !          1199:        (void)snprintf(buf, sizeof(buf), "%u", i);
        !          1200:        tp->name = strdup(buf);
        !          1201:        return (tp->name);
        !          1202: }
        !          1203: 
        !          1204: static void
        !          1205: init_iprotoarray(void)
        !          1206: {
        !          1207:        struct protoent *pe;
        !          1208:        register struct hnamemem *tp;
        !          1209:        register u_int32_t i;
        !          1210: 
        !          1211:        while ((pe = getprotoent()) != NULL) {
        !          1212:                i = pe->p_proto;
        !          1213:                for (tp = &iprototable[i & (HASHNAMESIZE-1)];
        !          1214:                     tp->name; tp = tp->nxt) ;
        !          1215: 
        !          1216:                tp->name = strdup(pe->p_name);
        !          1217:                tp->addr = i;
        !          1218:                tp->nxt = newhnamemem();
        !          1219:        }
        !          1220:        endprotoent();
        !          1221: }
        !          1222: 
        !          1223: static struct tok icmp_db[] = {
        !          1224:        { 0x0000,       "echo-reply"    },
        !          1225:        { 0x0300,       "unrch-net"     },
        !          1226:        { 0x0301,       "unrch-host"    },
        !          1227:        { 0x0302,       "unrch-proto"   },
        !          1228:        { 0x0303,       "unrch-port"    },
        !          1229:        { 0x0304,       "need-frag"     },
        !          1230:        { 0x0305,       "src-fail"      },
        !          1231:        { 0x0306,       "bad-net"       },
        !          1232:        { 0x0307,       "bad-host"      },
        !          1233:        { 0x0308,       "isolated"      },
        !          1234:        { 0x0309,       "net-prhbt"     },
        !          1235:        { 0x030a,       "host-prhbt"    },
        !          1236:        { 0x030b,       "bad-ntos"      },
        !          1237:        { 0x030c,       "bad-htos"      },
        !          1238:        { 0x030d,       "filtered"      },
        !          1239:        { 0x030e,       "no-prec"       },
        !          1240:        { 0x030f,       "prec-cut"      },
        !          1241:        { 0x0400,       "quench"        },
        !          1242:        { 0x0500,       "redir-net"     },
        !          1243:        { 0x0501,       "redir-hst"     },
        !          1244:        { 0x0502,       "redir-ntos"    },
        !          1245:        { 0x0503,       "redir-htos"    },
        !          1246:        { 0x0800,       "echo-reqst"    },
        !          1247:        { 0x0900,       "advert"        },
        !          1248:        { 0x0a00,       "solicit"       },
        !          1249:        { 0x0b00,       "ttl-exceed"    },
        !          1250:        { 0x0b01,       "frg-exceed"    },
        !          1251:        { 0x0c00,       "err-atptr"     },
        !          1252:        { 0x0c01,       "optabsent"     },
        !          1253:        { 0x0c02,       "bad-len"       },
        !          1254:        { 0x0d00,       "time-reqst"    },
        !          1255:        { 0x0e00,       "time-reply"    },
        !          1256:        { 0x0f00,       "info-reqst"    },
        !          1257:        { 0x1000,       "info-reply"    },
        !          1258:        { 0x1100,       "mask-reqst"    },
        !          1259:        { 0x1200,       "mask-reply"    },
        !          1260:        { 0, NULL }
        !          1261: };
        !          1262: 
        !          1263: static void
        !          1264: init_icmparray(void)
        !          1265: {
        !          1266:        register int i;
        !          1267:        register struct hnamemem *table;
        !          1268: 
        !          1269:        for (i = 0; icmp_db[i].s != NULL; i++) {
        !          1270:                table = &icmptable[icmp_db[i].v & (HASHNAMESIZE-1)];
        !          1271:                while (table->name)
        !          1272:                        table = table->nxt;
        !          1273:                table->name = icmp_db[i].s;
        !          1274:                table->addr = icmp_db[i].v;
        !          1275:                table->nxt = newhnamemem();
        !          1276:        }
        !          1277: }
        !          1278: 
        !          1279: const char *
        !          1280: icmp_string(u_short code)
        !          1281: {
        !          1282:        register struct hnamemem *tp;
        !          1283:        register u_int32_t i = code;
        !          1284:        char buf[sizeof("0000")];
        !          1285: 
        !          1286:        for (tp = &icmptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
        !          1287:                if (tp->addr == i)
        !          1288:                        return (tp->name);
        !          1289: 
        !          1290:        tp->addr = i;
        !          1291:        tp->nxt = newhnamemem();
        !          1292: 
        !          1293:        snprintf(buf, sizeof(buf), "%04x", code);
        !          1294:        tp->name = strdup(buf);
        !          1295:        return (tp->name);
        !          1296: }
        !          1297: 
        !          1298: #ifdef INET6
        !          1299: static struct tok icmpv6_db[] = {
        !          1300:        { 0x0100,       "no-route"      },
        !          1301:        { 0x0101,       "adm-prhbt"     },
        !          1302:        { 0x0102,       "not-nghbr"     },
        !          1303:        { 0x0103,       "addr-unrch"    },
        !          1304:        { 0x0104,       "bad-port"      },
        !          1305:        { 0x0200,       "pkt-toobig"    },
        !          1306:        { 0x0300,       "hop-exceed"    },
        !          1307:        { 0x0301,       "frg-exceed"    },
        !          1308:        { 0x0400,       "bad-hdr"       },
        !          1309:        { 0x0401,       "unkn-nhdr"     },
        !          1310:        { 0x0402,       "unkn-opt"      },
        !          1311:        { 0x8000,       "echo-reqst"    },
        !          1312:        { 0x8100,       "echo-repl"     },
        !          1313:        { 0x8200,       "membr-qry"     },
        !          1314:        { 0x8300,       "membr-rprt"    },
        !          1315:        { 0x8400,       "membr-red"     },
        !          1316:        { 0x8500,       "router-sol"    },
        !          1317:        { 0x8600,       "router-adv"    },
        !          1318:        { 0x8700,       "nghbr-sol"     },
        !          1319:        { 0x8800,       "nghbr-adv"     },
        !          1320:        { 0x8900,       "redirect"      },
        !          1321:        { 0, NULL }
        !          1322: };
        !          1323: 
        !          1324: static void
        !          1325: init_icmpv6array(void)
        !          1326: {
        !          1327:        register int i;
        !          1328:        register struct hnamemem *table;
        !          1329: 
        !          1330:        for (i = 0; icmpv6_db[i].s != NULL; i++) {
        !          1331:                table = &icmpv6table[icmpv6_db[i].v & (HASHNAMESIZE-1)];
        !          1332:                while (table->name)
        !          1333:                        table = table->nxt;
        !          1334:                table->name = icmpv6_db[i].s;
        !          1335:                table->addr = icmpv6_db[i].v;
        !          1336:                table->nxt = newhnamemem();
        !          1337:        }
        !          1338: }
        !          1339: 
        !          1340: const char *
        !          1341: icmpv6_string(u_short code)
        !          1342: {
        !          1343:        register struct hnamemem *tp;
        !          1344:        register u_int32_t i = code;
        !          1345:        char buf[sizeof("0000")];
        !          1346: 
        !          1347:        for (tp = &icmpv6table[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
        !          1348:                if (tp->addr == i)
        !          1349:                        return (tp->name);
        !          1350: 
        !          1351:        tp->addr = i;
        !          1352:        tp->nxt = newhnamemem();
        !          1353: 
        !          1354:        snprintf(buf, sizeof(buf), "%04x", code);
        !          1355:        tp->name = strdup(buf);
        !          1356:        return (tp->name);
        !          1357: }
        !          1358: #endif
        !          1359: 
        !          1360: /*
        !          1361:  * Initialize the address to name translation machinery.  We map all
        !          1362:  * non-local IP addresses to numeric addresses if fflag is true (i.e.,
        !          1363:  * to prevent blocking on the nameserver).  localnet is the IP address
        !          1364:  * of the local network.  mask is its subnet mask.
        !          1365:  */
        !          1366: void
        !          1367: init_addrtoname()
        !          1368: {
        !          1369: #ifdef notdef
        !          1370:        if (nflag)
        !          1371:                /*
        !          1372:                 * Simplest way to suppress names.
        !          1373:                 */
        !          1374:                return;
        !          1375: #endif
        !          1376:        init_etherarray();
        !          1377:        init_servarray();
        !          1378:        init_etypearray();
        !          1379:        init_llcsaparray();
        !          1380:        init_protoidarray();
        !          1381:        init_ipxsaparray();
        !          1382:        init_iprotoarray();
        !          1383:        init_icmparray();
        !          1384: #ifdef INET6
        !          1385:        init_icmpv6array();
        !          1386: #endif
        !          1387: }
        !          1388: 
        !          1389: #ifdef notdef
        !          1390: const char *
        !          1391: dnaddr_string(u_short dnaddr)
        !          1392: {
        !          1393:        register struct hnamemem *tp;
        !          1394: 
        !          1395:        for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != 0;
        !          1396:             tp = tp->nxt)
        !          1397:                if (tp->addr == dnaddr)
        !          1398:                        return (tp->name);
        !          1399: 
        !          1400:        tp->addr = dnaddr;
        !          1401:        tp->nxt = newhnamemem();
        !          1402:        if (nflag)
        !          1403:                tp->name = dnnum_string(dnaddr);
        !          1404:        else
        !          1405:                tp->name = dnname_string(dnaddr);
        !          1406: 
        !          1407:        return(tp->name);
        !          1408: }
        !          1409: #endif
        !          1410: 
        !          1411: /* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
        !          1412: struct hnamemem *
        !          1413: newhnamemem(void)
        !          1414: {
        !          1415:        register struct hnamemem *p;
        !          1416:        static struct hnamemem *ptr = NULL;
        !          1417:        static u_int num = 0;
        !          1418: 
        !          1419:        if (num  <= 0) {
        !          1420:                num = 64;
        !          1421:                ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));
        !          1422:                if (ptr == NULL)
        !          1423:                        error("newhnamemem: calloc");
        !          1424:        }
        !          1425:        --num;
        !          1426:        p = ptr++;
        !          1427:        return (p);
        !          1428: }
        !          1429: 
        !          1430: #ifdef INET6
        !          1431: /* Return a zero'ed h6namemem struct and cuts down on calloc() overhead */
        !          1432: struct h6namemem *
        !          1433: newh6namemem(void)
        !          1434: {
        !          1435:        register struct h6namemem *p;
        !          1436:        static struct h6namemem *ptr = NULL;
        !          1437:        static u_int num = 0;
        !          1438: 
        !          1439:        if (num  <= 0) {
        !          1440:                num = 64;
        !          1441:                ptr = (struct h6namemem *)calloc(num, sizeof (*ptr));
        !          1442:                if (ptr == NULL)
        !          1443:                        error("newh6namemem: calloc");
        !          1444:        }
        !          1445:        --num;
        !          1446:        p = ptr++;
        !          1447:        return (p);
        !          1448: }
        !          1449: #endif /* INET6 */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>