]> The Tcpdump Group git mirrors - tcpdump/commitdiff
NDOize AppleTalk, CDP and Kerberos decoders
authorDenis Ovsienko <[email protected]>
Fri, 28 Mar 2014 10:43:43 +0000 (14:43 +0400)
committerDenis Ovsienko <[email protected]>
Fri, 28 Mar 2014 12:02:56 +0000 (16:02 +0400)
12 files changed:
interface.h
netdissect.h
print-arcnet.c
print-atalk.c
print-cdp.c
print-ether.c
print-gre.c
print-krb.c
print-llc.c
print-null.c
print-udp.c
tcpdump.c

index 5e339b9b39a5be65a57b9d8441d3bd781bff2154..03f6d922504b0b7e77cecf5a1264e12cb4ff03fa 100644 (file)
@@ -163,8 +163,6 @@ extern u_int16_t create_osi_cksum(const u_int8_t *, int, int);
 #include <pcap.h>
 
 extern void ascii_print(const u_char *, u_int);
-extern void aarp_print(const u_char *, u_int);
-extern void atalk_print(const u_char *, u_int);
 extern void decnet_print(const u_char *, u_int, u_int);
 extern void default_print(const u_char *, u_int);
 extern char *q922_string(const u_char *);
@@ -173,9 +171,6 @@ extern u_int ieee802_11_radio_if_print(const struct pcap_pkthdr *,
        const u_char *);
 extern u_int ieee802_11_radio_avs_if_print(const struct pcap_pkthdr *,
        const u_char *);
-extern void krb_print(const u_char *);
-extern u_int llap_print(const u_char *, u_int);
-extern u_int ltalk_if_print(const struct pcap_pkthdr *, const u_char *);
 extern void nfsreply_print(const u_char *, u_int, const u_char *);
 extern void nfsreply_print_noaddr(const u_char *, u_int, const u_char *);
 extern void nfsreq_print(const u_char *, u_int, const u_char *);
@@ -217,7 +212,6 @@ extern char *smb_errstr(int, int);
 extern const char *nt_errstr(u_int32_t);
 extern void print_data(const unsigned char *, int);
 extern void cfm_print(const u_char *, u_int);
-extern void cdp_print(const u_char *, u_int, u_int);
 extern void lwres_print(const u_char *, u_int);
 extern void mpls_lsp_ping_print(const u_char *, u_int);
 extern void sip_print(const u_char *, u_int);
index aba31c6e83334291e5cf028d88578a0e8ad1cbb8..5d9c5738c4f73e7310981f771020f4813d8ef974 100644 (file)
@@ -475,26 +475,25 @@ extern void olsr_print(netdissect_options *, const u_char *, u_int, int);
 extern void forces_print(netdissect_options *, const u_char *, u_int);
 extern void lspping_print(netdissect_options *, const u_char *, u_int);
 extern void isoclns_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void krb_print(netdissect_options *, const u_char *);
+extern void cdp_print(netdissect_options *, const u_char *, u_int, u_int);
+extern void atalk_print(netdissect_options *, const u_char *, u_int);
+extern u_int ltalk_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
+extern u_int llap_print(netdissect_options *, const u_char *, u_int);
+extern void aarp_print(netdissect_options *, const u_char *, u_int);
 
 /* stuff that has not yet been rototiled */
 
 #if 0
 extern void ascii_print(netdissect_options *,u_int);
-extern void aarp_print(netdissect_options *,const u_char *, u_int);
-extern void atalk_print(netdissect_options *,const u_char *, u_int);
 extern void bxxp_print(netdissect_options *,const u_char *, u_int);
 extern void decnet_print(netdissect_options *,const u_char *,
                         u_int, u_int);
 extern void default_print(netdissect_options *,const u_char *, u_int);
 
 extern void ieee802_11_if_print(u_char *,const struct pcap_pkthdr *, const u_char *);
-extern void krb_print(netdissect_options *,const u_char *, u_int);
-extern void llap_print(netdissect_options *,const u_char *, u_int);
 extern const char *linkaddr_string(netdissect_options *ndo,
                                   const u_char *ep, const unsigned int len);
-extern void ltalk_if_print(netdissect_options *ndo,
-                          u_char *user, const struct pcap_pkthdr *h,
-                          const u_char *p);
 extern void nfsreply_print(netdissect_options *,const u_char *,
                           u_int, const u_char *);
 extern void nfsreq_print(netdissect_options *,const u_char *,
@@ -529,8 +528,6 @@ extern char *smb_errstr(netdissect_options *,int, int);
 extern const char *nt_errstr(netdissect_options *, u_int32_t);
 extern void print_data(netdissect_options *,const unsigned char *, int);
 extern void lcp_print(netdissect_options *,const u_char *, u_int);
-extern void cdp_print(netdissect_options *,const u_char *,
-                     u_int, u_int, const u_char *, const u_char *);
 extern void lwres_print(netdissect_options *,const u_char *, u_int);
 #endif
 
index 640d31beb06fed2b39b543ebac4807593ae34ff6..d2a6d87d6ad270a3ba5f5dc9c2942ff350ccba95 100644 (file)
@@ -341,7 +341,7 @@ arcnet_encap_print(netdissect_options *ndo, u_char arctype, const u_char *p,
        case ARCTYPE_ATALK:     /* XXX was this ever used? */
                if (ndo->ndo_vflag)
                        ND_PRINT((ndo, "et1 "));
-               atalk_print(p, length);
+               atalk_print(ndo, p, length);
                return (1);
 
        case ARCTYPE_IPX:
index 0f46fa3e4999792fc1098622700f8c406015ba91..00f9dac4a7c55e4c01ee3cea499de0075aa71c25 100644 (file)
@@ -21,6 +21,7 @@
  * Format and print AppleTalk packets.
  */
 
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -28,7 +29,6 @@
 #include <tcpdump-stdinc.h>
 
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
 
 #include "interface.h"
@@ -59,33 +59,34 @@ struct aarp {
        u_int8_t        pdaddr[4];
 };
 
-static void atp_print(const struct atATP *, u_int);
-static void atp_bitmap_print(u_char);
-static void nbp_print(const struct atNBP *, u_int, u_short, u_char, u_char);
-static const char *print_cstring(const char *, const u_char *);
-static const struct atNBPtuple *nbp_tuple_print(const struct atNBPtuple *,
+static void atp_print(netdissect_options *, const struct atATP *, u_int);
+static void atp_bitmap_print(netdissect_options *, u_char);
+static void nbp_print(netdissect_options *, const struct atNBP *, u_int, u_short, u_char, u_char);
+static const struct atNBPtuple *nbp_tuple_print(netdissect_options *ndo, const struct atNBPtuple *,
                                                const u_char *,
                                                u_short, u_char, u_char);
-static const struct atNBPtuple *nbp_name_print(const struct atNBPtuple *,
+static const struct atNBPtuple *nbp_name_print(netdissect_options *, const struct atNBPtuple *,
                                               const u_char *);
-static const char *ataddr_string(u_short, u_char);
-static void ddp_print(const u_char *, u_int, int, u_short, u_char, u_char);
-static const char *ddpskt_string(int);
+static const char *ataddr_string(netdissect_options *, u_short, u_char);
+static void ddp_print(netdissect_options *, const u_char *, u_int, int, u_short, u_char, u_char);
+static const char *ddpskt_string(netdissect_options *, int);
 
 /*
  * Print LLAP packets received on a physical LocalTalk interface.
  */
 u_int
-ltalk_if_print(const struct pcap_pkthdr *h, const u_char *p)
+ltalk_if_print(netdissect_options *ndo,
+               const struct pcap_pkthdr *h, const u_char *p)
 {
-       return (llap_print(p, h->caplen));
+       return (llap_print(ndo, p, h->caplen));
 }
 
 /*
  * Print AppleTalk LLAP packets.
  */
 u_int
-llap_print(register const u_char *bp, u_int length)
+llap_print(netdissect_options *ndo,
+           register const u_char *bp, u_int length)
 {
        register const struct LAP *lp;
        register const struct atDDP *dp;
@@ -94,7 +95,7 @@ llap_print(register const u_char *bp, u_int length)
        u_int hdrlen;
 
        if (length < sizeof(*lp)) {
-               (void)printf(" [|llap %u]", length);
+               ND_PRINT((ndo, " [|llap %u]", length));
                return (length);
        }
        lp = (const struct LAP *)bp;
@@ -105,36 +106,36 @@ llap_print(register const u_char *bp, u_int length)
 
        case lapShortDDP:
                if (length < ddpSSize) {
-                       (void)printf(" [|sddp %u]", length);
+                       ND_PRINT((ndo, " [|sddp %u]", length));
                        return (length);
                }
                sdp = (const struct atShortDDP *)bp;
-               printf("%s.%s",
-                   ataddr_string(0, lp->src), ddpskt_string(sdp->srcSkt));
-               printf(" > %s.%s:",
-                   ataddr_string(0, lp->dst), ddpskt_string(sdp->dstSkt));
+               ND_PRINT((ndo, "%s.%s",
+                   ataddr_string(ndo, 0, lp->src), ddpskt_string(ndo, sdp->srcSkt)));
+               ND_PRINT((ndo, " > %s.%s:",
+                   ataddr_string(ndo, 0, lp->dst), ddpskt_string(ndo, sdp->dstSkt)));
                bp += ddpSSize;
                length -= ddpSSize;
                hdrlen += ddpSSize;
-               ddp_print(bp, length, sdp->type, 0, lp->src, sdp->srcSkt);
+               ddp_print(ndo, bp, length, sdp->type, 0, lp->src, sdp->srcSkt);
                break;
 
        case lapDDP:
                if (length < ddpSize) {
-                       (void)printf(" [|ddp %u]", length);
+                       ND_PRINT((ndo, " [|ddp %u]", length));
                        return (length);
                }
                dp = (const struct atDDP *)bp;
                snet = EXTRACT_16BITS(&dp->srcNet);
-               printf("%s.%s", ataddr_string(snet, dp->srcNode),
-                   ddpskt_string(dp->srcSkt));
-               printf(" > %s.%s:",
-                   ataddr_string(EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
-                   ddpskt_string(dp->dstSkt));
+               ND_PRINT((ndo, "%s.%s", ataddr_string(ndo, snet, dp->srcNode),
+                   ddpskt_string(ndo, dp->srcSkt)));
+               ND_PRINT((ndo, " > %s.%s:",
+                   ataddr_string(ndo, EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
+                   ddpskt_string(ndo, dp->dstSkt)));
                bp += ddpSize;
                length -= ddpSize;
                hdrlen += ddpSize;
-               ddp_print(bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
+               ddp_print(ndo, bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
                break;
 
 #ifdef notdef
@@ -144,8 +145,8 @@ llap_print(register const u_char *bp, u_int length)
 #endif
 
        default:
-               printf("%d > %d at-lap#%d %u",
-                   lp->src, lp->dst, lp->type, length);
+               ND_PRINT((ndo, "%d > %d at-lap#%d %u",
+                   lp->src, lp->dst, lp->type, length));
                break;
        }
        return (hdrlen);
@@ -157,39 +158,41 @@ llap_print(register const u_char *bp, u_int length)
  * packets in them).
  */
 void
-atalk_print(register const u_char *bp, u_int length)
+atalk_print(netdissect_options *ndo,
+            register const u_char *bp, u_int length)
 {
        register const struct atDDP *dp;
        u_short snet;
 
-        if(!eflag)
-            printf("AT ");
+        if(!ndo->ndo_eflag)
+            ND_PRINT((ndo, "AT "));
 
        if (length < ddpSize) {
-               (void)printf(" [|ddp %u]", length);
+               ND_PRINT((ndo, " [|ddp %u]", length));
                return;
        }
        dp = (const struct atDDP *)bp;
        snet = EXTRACT_16BITS(&dp->srcNet);
-       printf("%s.%s", ataddr_string(snet, dp->srcNode),
-              ddpskt_string(dp->srcSkt));
-       printf(" > %s.%s: ",
-              ataddr_string(EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
-              ddpskt_string(dp->dstSkt));
+       ND_PRINT((ndo, "%s.%s", ataddr_string(ndo, snet, dp->srcNode),
+              ddpskt_string(ndo, dp->srcSkt)));
+       ND_PRINT((ndo, " > %s.%s: ",
+              ataddr_string(ndo, EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
+              ddpskt_string(ndo, dp->dstSkt)));
        bp += ddpSize;
        length -= ddpSize;
-       ddp_print(bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
+       ddp_print(ndo, bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
 }
 
 /* XXX should probably pass in the snap header and do checks like arp_print() */
 void
-aarp_print(register const u_char *bp, u_int length)
+aarp_print(netdissect_options *ndo,
+           register const u_char *bp, u_int length)
 {
        register const struct aarp *ap;
 
-#define AT(member) ataddr_string((ap->member[1]<<8)|ap->member[2],ap->member[3])
+#define AT(member) ataddr_string(ndo, (ap->member[1]<<8)|ap->member[2],ap->member[3])
 
-       printf("aarp ");
+       ND_PRINT((ndo, "aarp "));
        ap = (const struct aarp *)bp;
        if (EXTRACT_16BITS(&ap->htype) == 1 &&
            EXTRACT_16BITS(&ap->ptype) == ETHERTYPE_ATALK &&
@@ -197,151 +200,151 @@ aarp_print(register const u_char *bp, u_int length)
                switch (EXTRACT_16BITS(&ap->op)) {
 
                case 1:                         /* request */
-                       (void)printf("who-has %s tell %s",
-                           AT(pdaddr), AT(psaddr));
+                       ND_PRINT((ndo, "who-has %s tell %s", AT(pdaddr), AT(psaddr)));
                        return;
 
                case 2:                         /* response */
-                       (void)printf("reply %s is-at %s",
-                           AT(psaddr), etheraddr_string(ap->hsaddr));
+                       ND_PRINT((ndo, "reply %s is-at %s", AT(psaddr), etheraddr_string(ap->hsaddr)));
                        return;
 
                case 3:                         /* probe (oy!) */
-                       (void)printf("probe %s tell %s",
-                           AT(pdaddr), AT(psaddr));
+                       ND_PRINT((ndo, "probe %s tell %s", AT(pdaddr), AT(psaddr)));
                        return;
                }
-       (void)printf("len %u op %u htype %u ptype %#x halen %u palen %u",
+       ND_PRINT((ndo, "len %u op %u htype %u ptype %#x halen %u palen %u",
            length, EXTRACT_16BITS(&ap->op), EXTRACT_16BITS(&ap->htype),
-           EXTRACT_16BITS(&ap->ptype), ap->halen, ap->palen);
+           EXTRACT_16BITS(&ap->ptype), ap->halen, ap->palen));
 }
 
 /*
  * Print AppleTalk Datagram Delivery Protocol packets.
  */
 static void
-ddp_print(register const u_char *bp, register u_int length, register int t,
-         register u_short snet, register u_char snode, u_char skt)
+ddp_print(netdissect_options *ndo,
+          register const u_char *bp, register u_int length, register int t,
+          register u_short snet, register u_char snode, u_char skt)
 {
 
        switch (t) {
 
        case ddpNBP:
-               nbp_print((const struct atNBP *)bp, length, snet, snode, skt);
+               nbp_print(ndo, (const struct atNBP *)bp, length, snet, snode, skt);
                break;
 
        case ddpATP:
-               atp_print((const struct atATP *)bp, length);
+               atp_print(ndo, (const struct atATP *)bp, length);
                break;
 
        case ddpEIGRP:
-               eigrp_print(gndo, bp, length);
+               eigrp_print(ndo, bp, length);
                break;
 
        default:
-               (void)printf(" at-%s %d", tok2str(type2str, NULL, t), length);
+               ND_PRINT((ndo, " at-%s %d", tok2str(type2str, NULL, t), length));
                break;
        }
 }
 
 static void
-atp_print(register const struct atATP *ap, u_int length)
+atp_print(netdissect_options *ndo,
+          register const struct atATP *ap, u_int length)
 {
        char c;
        u_int32_t data;
 
-       if ((const u_char *)(ap + 1) > snapend) {
+       if ((const u_char *)(ap + 1) > ndo->ndo_snapend) {
                /* Just bail if we don't have the whole chunk. */
-               fputs(tstr, stdout);
+               ND_PRINT((ndo, tstr));
                return;
        }
        if (length < sizeof(*ap)) {
-               (void)printf(" [|atp %u]", length);
+               ND_PRINT((ndo, " [|atp %u]", length));
                return;
        }
        length -= sizeof(*ap);
        switch (ap->control & 0xc0) {
 
        case atpReqCode:
-               (void)printf(" atp-req%s %d",
+               ND_PRINT((ndo, " atp-req%s %d",
                             ap->control & atpXO? " " : "*",
-                            EXTRACT_16BITS(&ap->transID));
+                            EXTRACT_16BITS(&ap->transID)));
 
-               atp_bitmap_print(ap->bitmap);
+               atp_bitmap_print(ndo, ap->bitmap);
 
                if (length != 0)
-                       (void)printf(" [len=%u]", length);
+                       ND_PRINT((ndo, " [len=%u]", length));
 
                switch (ap->control & (atpEOM|atpSTS)) {
                case atpEOM:
-                       (void)printf(" [EOM]");
+                       ND_PRINT((ndo, " [EOM]"));
                        break;
                case atpSTS:
-                       (void)printf(" [STS]");
+                       ND_PRINT((ndo, " [STS]"));
                        break;
                case atpEOM|atpSTS:
-                       (void)printf(" [EOM,STS]");
+                       ND_PRINT((ndo, " [EOM,STS]"));
                        break;
                }
                break;
 
        case atpRspCode:
-               (void)printf(" atp-resp%s%d:%d (%u)",
+               ND_PRINT((ndo, " atp-resp%s%d:%d (%u)",
                             ap->control & atpEOM? "*" : " ",
-                            EXTRACT_16BITS(&ap->transID), ap->bitmap, length);
+                            EXTRACT_16BITS(&ap->transID), ap->bitmap, length));
                switch (ap->control & (atpXO|atpSTS)) {
                case atpXO:
-                       (void)printf(" [XO]");
+                       ND_PRINT((ndo, " [XO]"));
                        break;
                case atpSTS:
-                       (void)printf(" [STS]");
+                       ND_PRINT((ndo, " [STS]"));
                        break;
                case atpXO|atpSTS:
-                       (void)printf(" [XO,STS]");
+                       ND_PRINT((ndo, " [XO,STS]"));
                        break;
                }
                break;
 
        case atpRelCode:
-               (void)printf(" atp-rel  %d", EXTRACT_16BITS(&ap->transID));
+               ND_PRINT((ndo, " atp-rel  %d", EXTRACT_16BITS(&ap->transID)));
 
-               atp_bitmap_print(ap->bitmap);
+               atp_bitmap_print(ndo, ap->bitmap);
 
                /* length should be zero */
                if (length)
-                       (void)printf(" [len=%u]", length);
+                       ND_PRINT((ndo, " [len=%u]", length));
 
                /* there shouldn't be any control flags */
                if (ap->control & (atpXO|atpEOM|atpSTS)) {
                        c = '[';
                        if (ap->control & atpXO) {
-                               (void)printf("%cXO", c);
+                               ND_PRINT((ndo, "%cXO", c));
                                c = ',';
                        }
                        if (ap->control & atpEOM) {
-                               (void)printf("%cEOM", c);
+                               ND_PRINT((ndo, "%cEOM", c));
                                c = ',';
                        }
                        if (ap->control & atpSTS) {
-                               (void)printf("%cSTS", c);
+                               ND_PRINT((ndo, "%cSTS", c));
                                c = ',';
                        }
-                       (void)printf("]");
+                       ND_PRINT((ndo, "]"));
                }
                break;
 
        default:
-               (void)printf(" atp-0x%x  %d (%u)", ap->control,
-                            EXTRACT_16BITS(&ap->transID), length);
+               ND_PRINT((ndo, " atp-0x%x  %d (%u)", ap->control,
+                            EXTRACT_16BITS(&ap->transID), length));
                break;
        }
        data = EXTRACT_32BITS(&ap->userData);
        if (data != 0)
-               (void)printf(" 0x%x", data);
+               ND_PRINT((ndo, " 0x%x", data));
 }
 
 static void
-atp_bitmap_print(register u_char bm)
+atp_bitmap_print(netdissect_options *ndo,
+                 register u_char bm)
 {
        register char c;
        register int i;
@@ -355,25 +358,26 @@ atp_bitmap_print(register u_char bm)
                c = '<';
                for (i = 0; bm; ++i) {
                        if (bm & 1) {
-                               (void)printf("%c%d", c, i);
+                               ND_PRINT((ndo, "%c%d", c, i));
                                c = ',';
                        }
                        bm >>= 1;
                }
-               (void)printf(">");
+               ND_PRINT((ndo, ">"));
        } else {
                for (i = 0; bm; ++i)
                        bm >>= 1;
                if (i > 1)
-                       (void)printf("<0-%d>", i - 1);
+                       ND_PRINT((ndo, "<0-%d>", i - 1));
                else
-                       (void)printf("<0>");
+                       ND_PRINT((ndo, "<0>"));
        }
 }
 
 static void
-nbp_print(register const struct atNBP *np, u_int length, register u_short snet,
-         register u_char snode, register u_char skt)
+nbp_print(netdissect_options *ndo,
+          register const struct atNBP *np, u_int length, register u_short snet,
+          register u_char snode, register u_char skt)
 {
        register const struct atNBPtuple *tp =
                (const struct atNBPtuple *)((u_char *)np + nbpHeaderSize);
@@ -381,138 +385,137 @@ nbp_print(register const struct atNBP *np, u_int length, register u_short snet,
        const u_char *ep;
 
        if (length < nbpHeaderSize) {
-               (void)printf(" truncated-nbp %u", length);
+               ND_PRINT((ndo, " truncated-nbp %u", length));
                return;
        }
 
        length -= nbpHeaderSize;
        if (length < 8) {
                /* must be room for at least one tuple */
-               (void)printf(" truncated-nbp %u", length + nbpHeaderSize);
+               ND_PRINT((ndo, " truncated-nbp %u", length + nbpHeaderSize));
                return;
        }
        /* ep points to end of available data */
-       ep = snapend;
+       ep = ndo->ndo_snapend;
        if ((const u_char *)tp > ep) {
-               fputs(tstr, stdout);
+               ND_PRINT((ndo, tstr));
                return;
        }
        switch (i = np->control & 0xf0) {
 
        case nbpBrRq:
        case nbpLkUp:
-               (void)printf(i == nbpLkUp? " nbp-lkup %d:":" nbp-brRq %d:",
-                            np->id);
+               ND_PRINT((ndo, i == nbpLkUp? " nbp-lkup %d:":" nbp-brRq %d:", np->id));
                if ((const u_char *)(tp + 1) > ep) {
-                       fputs(tstr, stdout);
+                       ND_PRINT((ndo, tstr));
                        return;
                }
-               (void)nbp_name_print(tp, ep);
+               (void)nbp_name_print(ndo, tp, ep);
                /*
                 * look for anomalies: the spec says there can only
                 * be one tuple, the address must match the source
                 * address and the enumerator should be zero.
                 */
                if ((np->control & 0xf) != 1)
-                       (void)printf(" [ntup=%d]", np->control & 0xf);
+                       ND_PRINT((ndo, " [ntup=%d]", np->control & 0xf));
                if (tp->enumerator)
-                       (void)printf(" [enum=%d]", tp->enumerator);
+                       ND_PRINT((ndo, " [enum=%d]", tp->enumerator));
                if (EXTRACT_16BITS(&tp->net) != snet ||
                    tp->node != snode || tp->skt != skt)
-                       (void)printf(" [addr=%s.%d]",
-                           ataddr_string(EXTRACT_16BITS(&tp->net),
-                           tp->node), tp->skt);
+                       ND_PRINT((ndo, " [addr=%s.%d]",
+                           ataddr_string(ndo, EXTRACT_16BITS(&tp->net),
+                           tp->node), tp->skt));
                break;
 
        case nbpLkUpReply:
-               (void)printf(" nbp-reply %d:", np->id);
+               ND_PRINT((ndo, " nbp-reply %d:", np->id));
 
                /* print each of the tuples in the reply */
                for (i = np->control & 0xf; --i >= 0 && tp; )
-                       tp = nbp_tuple_print(tp, ep, snet, snode, skt);
+                       tp = nbp_tuple_print(ndo, tp, ep, snet, snode, skt);
                break;
 
        default:
-               (void)printf(" nbp-0x%x  %d (%u)", np->control, np->id,
-                               length);
+               ND_PRINT((ndo, " nbp-0x%x  %d (%u)", np->control, np->id, length));
                break;
        }
 }
 
 /* print a counted string */
 static const char *
-print_cstring(register const char *cp, register const u_char *ep)
+print_cstring(netdissect_options *ndo,
+              register const char *cp, register const u_char *ep)
 {
        register u_int length;
 
        if (cp >= (const char *)ep) {
-               fputs(tstr, stdout);
+               ND_PRINT((ndo, tstr));
                return (0);
        }
        length = *cp++;
 
        /* Spec says string can be at most 32 bytes long */
        if (length > 32) {
-               (void)printf("[len=%u]", length);
+               ND_PRINT((ndo, "[len=%u]", length));
                return (0);
        }
        while ((int)--length >= 0) {
                if (cp >= (const char *)ep) {
-                       fputs(tstr, stdout);
+                       ND_PRINT((ndo, tstr));
                        return (0);
                }
-               putchar(*cp++);
+               ND_PRINT((ndo, "%c", *cp++));
        }
        return (cp);
 }
 
 static const struct atNBPtuple *
-nbp_tuple_print(register const struct atNBPtuple *tp,
-               register const u_char *ep,
-               register u_short snet, register u_char snode,
-               register u_char skt)
+nbp_tuple_print(netdissect_options *ndo,
+                register const struct atNBPtuple *tp, register const u_char *ep,
+                register u_short snet, register u_char snode, register u_char skt)
 {
        register const struct atNBPtuple *tpn;
 
        if ((const u_char *)(tp + 1) > ep) {
-               fputs(tstr, stdout);
+               ND_PRINT((ndo, tstr));
                return 0;
        }
-       tpn = nbp_name_print(tp, ep);
+       tpn = nbp_name_print(ndo, tp, ep);
 
        /* if the enumerator isn't 1, print it */
        if (tp->enumerator != 1)
-               (void)printf("(%d)", tp->enumerator);
+               ND_PRINT((ndo, "(%d)", tp->enumerator));
 
        /* if the socket doesn't match the src socket, print it */
        if (tp->skt != skt)
-               (void)printf(" %d", tp->skt);
+               ND_PRINT((ndo, " %d", tp->skt));
 
        /* if the address doesn't match the src address, it's an anomaly */
        if (EXTRACT_16BITS(&tp->net) != snet || tp->node != snode)
-               (void)printf(" [addr=%s]",
-                   ataddr_string(EXTRACT_16BITS(&tp->net), tp->node));
+               ND_PRINT((ndo, " [addr=%s]",
+                   ataddr_string(ndo, EXTRACT_16BITS(&tp->net), tp->node)));
 
        return (tpn);
 }
 
 static const struct atNBPtuple *
-nbp_name_print(const struct atNBPtuple *tp, register const u_char *ep)
+nbp_name_print(netdissect_options *ndo,
+               const struct atNBPtuple *tp, register const u_char *ep)
 {
        register const char *cp = (const char *)tp + nbpTupleSize;
 
-       putchar(' ');
+       ND_PRINT((ndo, " "));
 
        /* Object */
-       putchar('"');
-       if ((cp = print_cstring(cp, ep)) != NULL) {
+       ND_PRINT((ndo, "\""));
+       if ((cp = print_cstring(ndo, cp, ep)) != NULL) {
                /* Type */
-               putchar(':');
-               if ((cp = print_cstring(cp, ep)) != NULL) {
+               ND_PRINT((ndo, ":"));
+               if ((cp = print_cstring(ndo, cp, ep)) != NULL) {
                        /* Zone */
-                       putchar('@');
-                       if ((cp = print_cstring(cp, ep)) != NULL)
-                               putchar('"');
+                       ND_PRINT((ndo, "@"));
+                       if ((cp = print_cstring(ndo, cp, ep)) != NULL)
+                               ND_PRINT((ndo, "\""));
                }
        }
        return ((const struct atNBPtuple *)cp);
@@ -530,7 +533,8 @@ struct hnamemem {
 static struct hnamemem hnametable[HASHNAMESIZE];
 
 static const char *
-ataddr_string(u_short atnet, u_char athost)
+ataddr_string(netdissect_options *ndo,
+              u_short atnet, u_char athost)
 {
        register struct hnamemem *tp, *tp2;
        register int i = (atnet << 8) | athost;
@@ -542,7 +546,7 @@ ataddr_string(u_short atnet, u_char athost)
         * if this is the first call, see if there's an AppleTalk
         * number to name map file.
         */
-       if (first && (first = 0, !nflag)
+       if (first && (first = 0, !ndo->ndo_nflag)
            && (fp = fopen("/etc/atalk.names", "r"))) {
                char line[256];
                int i1, i2;
@@ -605,11 +609,12 @@ static const struct tok skt2str[] = {
 };
 
 static const char *
-ddpskt_string(register int skt)
+ddpskt_string(netdissect_options *ndo,
+              register int skt)
 {
        static char buf[8];
 
-       if (nflag) {
+       if (ndo->ndo_nflag) {
                (void)snprintf(buf, sizeof(buf), "%d", skt);
                return (buf);
        }
index 5383fd50f9d57d754a361447e59af57092ae15a9..880b81cdc70ed1306e89ffb3e0cf492e064de0bc 100644 (file)
  *    http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm
  */
 
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <tcpdump-stdinc.h>
 
-#include <stdio.h>
 #include <string.h>
 
 #include "interface.h"
@@ -78,144 +78,143 @@ static const struct tok cdp_capability_values[] = {
     { 0, NULL }
 };
 
-static int cdp_print_addr(const u_char *, int);
-static int cdp_print_prefixes(const u_char *, int);
+static int cdp_print_addr(netdissect_options *, const u_char *, int);
+static int cdp_print_prefixes(netdissect_options *, const u_char *, int);
 static unsigned long cdp_get_number(const u_char *, int);
 
 void
-cdp_print(const u_char *pptr, u_int length, u_int caplen)
+cdp_print(netdissect_options *ndo,
+          const u_char *pptr, u_int length, u_int caplen)
 {
        int type, len, i, j;
         const u_char *tptr;
 
        if (caplen < CDP_HEADER_LEN) {
-               printf("%s", tstr);
+               ND_PRINT((ndo, "%s", tstr));
                return;
        }
 
         tptr = pptr; /* temporary pointer */
 
-        if (!TTEST2(*tptr, CDP_HEADER_LEN))
-                goto trunc;
-       printf("CDPv%u, ttl: %us", *tptr, *(tptr+1));
-        if (vflag)
-                printf(", checksum: %u (unverified), length %u", EXTRACT_16BITS(tptr), length);
+       if (!ND_TTEST2(*tptr, CDP_HEADER_LEN))
+               goto trunc;
+       ND_PRINT((ndo, "CDPv%u, ttl: %us", *tptr, *(tptr + 1)));
+       if (ndo->ndo_vflag)
+               ND_PRINT((ndo, ", checksum: %u (unverified), length %u", EXTRACT_16BITS(tptr), length));
        tptr += CDP_HEADER_LEN;
 
        while (tptr < (pptr+length)) {
 
-                if (!TTEST2(*tptr, 4)) /* read out Type and Length */
+                if (!ND_TTEST2(*tptr, 4)) /* read out Type and Length */
                     goto trunc;
                type = EXTRACT_16BITS(tptr);
                len  = EXTRACT_16BITS(tptr+2); /* object length includes the 4 bytes header length */
                 tptr += 4;
                 len -= 4;
 
-               if (!TTEST2(*tptr, len))
+               if (!ND_TTEST2(*tptr, len))
                        goto trunc;
 
-                if (vflag || type == 1) { /* in non-verbose mode just print Device-ID */
+                if (ndo->ndo_vflag || type == 1) { /* in non-verbose mode just print Device-ID */
 
-                    if (vflag)
-                        printf("\n\t%s (0x%02x), length: %u byte%s: ",
+                    if (ndo->ndo_vflag)
+                        ND_PRINT((ndo, "\n\t%s (0x%02x), length: %u byte%s: ",
                                tok2str(cdp_tlv_values,"unknown field type", type),
                                type,
                                len,
-                               PLURAL_SUFFIX(len)); /* plural */
+                               PLURAL_SUFFIX(len))); /* plural */
 
                     switch (type) {
 
                     case 0x01: /* Device-ID */
-                        if (!vflag)
-                            printf(", Device-ID ");
-                        printf("'");
+                        if (!ndo->ndo_vflag)
+                            ND_PRINT((ndo, ", Device-ID "));
+                        ND_PRINT((ndo, "'"));
                         fn_printn(tptr, len, NULL);
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                        break;
                     case 0x02: /* Address */
-                        if (cdp_print_addr(tptr, len) < 0)
+                        if (cdp_print_addr(ndo, tptr, len) < 0)
                             goto trunc;
                        break;
                     case 0x03: /* Port-ID */
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                         fn_printn(tptr, len, NULL);
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                        break;
                     case 0x04: /* Capabilities */
-                       printf("(0x%08x): %s",
+                       ND_PRINT((ndo, "(0x%08x): %s",
                                EXTRACT_32BITS(tptr),
-                               bittok2str(cdp_capability_values, "none",EXTRACT_32BITS(tptr)));
+                               bittok2str(cdp_capability_values, "none", EXTRACT_32BITS(tptr))));
                        break;
                     case 0x05: /* Version */
-                        printf("\n\t  ");
+                        ND_PRINT((ndo, "\n\t  "));
                         for (i=0;i<len;i++) {
                             j = *(tptr+i);
-                            putchar(j);
+                            ND_PRINT((ndo, "%c", j));
                             if (j == 0x0a) /* lets rework the version string to get a nice identation */
-                                printf("\t  ");
+                                ND_PRINT((ndo, "\t  "));
                         }
                        break;
                     case 0x06: /* Platform */
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                         fn_printn(tptr, len, NULL);
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                        break;
                     case 0x07: /* Prefixes */
-                       if (cdp_print_prefixes(tptr, len) < 0)
+                       if (cdp_print_prefixes(ndo, tptr, len) < 0)
                             goto trunc;
                        break;
                     case 0x08: /* Protocol Hello Option - not documented */
                        break;
                     case 0x09: /* VTP Mgmt Domain  - not documented */
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                         fn_printn(tptr, len, NULL);
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                        break;
                     case 0x0a: /* Native VLAN ID - not documented */
-                       printf("%d",EXTRACT_16BITS(tptr));
+                       ND_PRINT((ndo, "%d", EXTRACT_16BITS(tptr)));
                        break;
                     case 0x0b: /* Duplex - not documented */
-                       printf("%s", *(tptr) ? "full": "half");
+                       ND_PRINT((ndo, "%s", *(tptr) ? "full": "half"));
                        break;
 
                     /* http://www.cisco.com/univercd/cc/td/doc/product/voice/ata/atarn/186rn21m.htm
                      * plus more details from other sources
                      */
                     case 0x0e: /* ATA-186 VoIP VLAN request - incomplete doc. */
-                       printf("app %d, vlan %d",
-                               *(tptr), EXTRACT_16BITS(tptr+1));
+                       ND_PRINT((ndo, "app %d, vlan %d", *(tptr), EXTRACT_16BITS(tptr + 1)));
                        break;
                     case 0x10: /* ATA-186 VoIP VLAN assignment - incomplete doc. */
-                       printf("%1.2fW",
-                               cdp_get_number(tptr, len)/1000.0 );
+                       ND_PRINT((ndo, "%1.2fW", cdp_get_number(tptr, len) / 1000.0));
                        break;
                     case 0x11: /* MTU - not documented */
-                       printf("%u bytes", EXTRACT_32BITS(tptr));
+                       ND_PRINT((ndo, "%u bytes", EXTRACT_32BITS(tptr)));
                        break;
                     case 0x12: /* AVVID trust bitmap - not documented */
-                       printf("0x%02x", *(tptr) );
+                       ND_PRINT((ndo, "0x%02x", *(tptr)));
                        break;
                     case 0x13: /* AVVID untrusted port CoS - not documented */
-                       printf("0x%02x", *(tptr));
+                       ND_PRINT((ndo, "0x%02x", *(tptr)));
                        break;
                     case 0x14: /* System Name - not documented */
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                         fn_printn(tptr, len, NULL);
-                        printf("'");
+                        ND_PRINT((ndo, "'"));
                        break;
                     case 0x16: /* System Object ID - not documented */
-                       if (cdp_print_addr(tptr, len) < 0)
+                       if (cdp_print_addr(ndo, tptr, len) < 0)
                                goto trunc;
                        break;
                     case 0x17: /* Physical Location - not documented */
-                       printf("0x%02x", *(tptr));
+                       ND_PRINT((ndo, "0x%02x", *(tptr)));
                        if (len > 1) {
-                               printf("/");
+                               ND_PRINT((ndo, "/"));
                                fn_printn(tptr + 1, len - 1, NULL);
                        }
                        break;
                     default:
-                        print_unknown_data(gndo,tptr,"\n\t  ",len);
+                        print_unknown_data(ndo, tptr, "\n\t  ", len);
                        break;
                     }
                 }
@@ -224,12 +223,12 @@ cdp_print(const u_char *pptr, u_int length, u_int caplen)
                        break;
                tptr = tptr+len;
        }
-        if (vflag < 1)
-            printf(", length %u",caplen);
+        if (ndo->ndo_vflag < 1)
+            ND_PRINT((ndo, ", length %u", caplen));
 
        return;
 trunc:
-       printf("%s", tstr);
+       ND_PRINT((ndo, "%s", tstr));
 }
 
 /*
@@ -244,7 +243,8 @@ trunc:
 #define PT_IEEE_802_2          2       /* IEEE 802.2 LLC header */
 
 static int
-cdp_print_addr(const u_char * p, int l)
+cdp_print_addr(netdissect_options *ndo,
+               const u_char * p, int l)
 {
        int pt, pl, al, num;
        const u_char *endp = p + l;
@@ -254,19 +254,19 @@ cdp_print_addr(const u_char * p, int l)
        };
 #endif
 
-       TCHECK2(*p, 2);
+       ND_TCHECK2(*p, 2);
        num = EXTRACT_32BITS(p);
        p += 4;
 
        while (p < endp && num >= 0) {
-               TCHECK2(*p, 2);
+               ND_TCHECK2(*p, 2);
                if (p + 2 > endp)
                        goto trunc;
                pt = p[0];              /* type of "protocol" field */
                pl = p[1];              /* length of "protocol" field */
                p += 2;
 
-               TCHECK2(p[pl], 2);
+               ND_TCHECK2(p[pl], 2);
                if (p + pl + 2 > endp)
                        goto trunc;
                al = EXTRACT_16BITS(&p[pl]);    /* address length */
@@ -279,12 +279,10 @@ cdp_print_addr(const u_char * p, int l)
                         */
                        p += 3;
 
-                       TCHECK2(*p, 4);
+                       ND_TCHECK2(*p, 4);
                        if (p + 4 > endp)
                                goto trunc;
-                       printf("IPv4 (%u) %s",
-                               num,
-                               ipaddr_string(p));
+                       ND_PRINT((ndo, "IPv4 (%u) %s", num, ipaddr_string(p)));
                        p += 4;
                }
 #ifdef INET6
@@ -297,13 +295,11 @@ cdp_print_addr(const u_char * p, int l)
                         * Ethertype, address length = 16
                         */
                        p += 10;
-                       TCHECK2(*p, al);
+                       ND_TCHECK2(*p, al);
                        if (p + al > endp)
                                goto trunc;
 
-                       printf("IPv6 (%u) %s",
-                               num,
-                               ip6addr_string(p));
+                       ND_PRINT((ndo, "IPv6 (%u) %s", num, ip6addr_string(p)));
                        p += al;
                }
 #endif
@@ -311,27 +307,27 @@ cdp_print_addr(const u_char * p, int l)
                        /*
                         * Generic case: just print raw data
                         */
-                       TCHECK2(*p, pl);
+                       ND_TCHECK2(*p, pl);
                        if (p + pl > endp)
                                goto trunc;
-                       printf("pt=0x%02x, pl=%d, pb=", *(p - 2), pl);
+                       ND_PRINT((ndo, "pt=0x%02x, pl=%d, pb=", *(p - 2), pl));
                        while (pl-- > 0)
-                               printf(" %02x", *p++);
-                       TCHECK2(*p, 2);
+                               ND_PRINT((ndo, " %02x", *p++));
+                       ND_TCHECK2(*p, 2);
                        if (p + 2 > endp)
                                goto trunc;
                        al = (*p << 8) + *(p + 1);
-                       printf(", al=%d, a=", al);
+                       ND_PRINT((ndo, ", al=%d, a=", al));
                        p += 2;
-                       TCHECK2(*p, al);
+                       ND_TCHECK2(*p, al);
                        if (p + al > endp)
                                goto trunc;
                        while (al-- > 0)
-                               printf(" %02x", *p++);
+                               ND_PRINT((ndo, " %02x", *p++));
                }
                num--;
                if (num)
-                       printf(" ");
+                       ND_PRINT((ndo, " "));
        }
 
        return 0;
@@ -342,15 +338,16 @@ trunc:
 
 
 static int
-cdp_print_prefixes(const u_char * p, int l)
+cdp_print_prefixes(netdissect_options *ndo,
+                   const u_char * p, int l)
 {
        if (l % 5)
                goto trunc;
 
-       printf(" IPv4 Prefixes (%d):", l / 5);
+       ND_PRINT((ndo, " IPv4 Prefixes (%d):", l / 5));
 
        while (l > 0) {
-               printf(" %u.%u.%u.%u/%u", p[0], p[1], p[2], p[3], p[4]);
+               ND_PRINT((ndo, " %u.%u.%u.%u/%u", p[0], p[1], p[2], p[3], p[4]));
                l -= 5;
                p += 5;
        }
index 624d0c54425dd1890dfbfd2d9b5cb2e53c3a7eaf..4702e883a443359b56eaf4d32a928e1566446c34 100644 (file)
@@ -342,11 +342,11 @@ ethertype_print(netdissect_options *ndo,
        case ETHERTYPE_ATALK:
                if (ndo->ndo_vflag)
                        ND_PRINT((ndo, "et1 "));
-               atalk_print(/*ndo,*/p, length);
+               atalk_print(ndo, p, length);
                return (1);
 
        case ETHERTYPE_AARP:
-               aarp_print(/*ndo,*/p, length);
+               aarp_print(ndo, p, length);
                return (1);
 
        case ETHERTYPE_IPX:
index 35890d6819b83dea3d6ec19322b2469601247c62..a8584f485c523a843f60d1b1b201b86ad338b97f 100644 (file)
@@ -212,7 +212,7 @@ gre_print_0(netdissect_options *ndo, const u_char *bp, u_int length)
                ipx_print(ndo, bp, len);
                break;
        case ETHERTYPE_ATALK:
-               atalk_print(bp, len);
+               atalk_print(ndo, bp, len);
                break;
        case ETHERTYPE_GRE_ISO:
                isoclns_print(ndo, bp, len, len);
index b8e1768167d9fd2852c7c2a3b38d56cfc713eaac..e726cee9981175b1e81013c793c7139fe2eda7eb 100644 (file)
  * Initial contribution from John Hawkinson ([email protected]).
  */
 
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <tcpdump-stdinc.h>
 
-#include <stdio.h>
-
 #include "interface.h"
 #include "extract.h"
 
 static const char tstr[] = " [|kerberos]";
 
-static const u_char *c_print(register const u_char *, register const u_char *);
-static const u_char *krb4_print_hdr(const u_char *);
-static void krb4_print(const u_char *);
+static const u_char *c_print(netdissect_options *, register const u_char *, register const u_char *);
+static const u_char *krb4_print_hdr(netdissect_options *, const u_char *);
+static void krb4_print(netdissect_options *, const u_char *);
 
 #define AUTH_MSG_KDC_REQUEST                   1<<1
 #define AUTH_MSG_KDC_REPLY                     2<<1
@@ -94,7 +93,8 @@ static const struct tok kerr2str[] = {
 };
 
 static const u_char *
-c_print(register const u_char *s, register const u_char *ep)
+c_print(netdissect_options *ndo,
+        register const u_char *s, register const u_char *ep)
 {
        register u_char c;
        register int flag;
@@ -108,14 +108,13 @@ c_print(register const u_char *s, register const u_char *ep)
                }
                if (!ND_ISASCII(c)) {
                        c = ND_TOASCII(c);
-                       putchar('M');
-                       putchar('-');
+                       ND_PRINT((ndo, "M-"));
                }
                if (!ND_ISPRINT(c)) {
                        c ^= 0x40;      /* DEL to ?, others to alpha */
-                       putchar('^');
+                       ND_PRINT((ndo, "^"));
                }
-               putchar(c);
+               ND_PRINT((ndo, "%c", c));
        }
        if (flag)
                return NULL;
@@ -123,112 +122,115 @@ c_print(register const u_char *s, register const u_char *ep)
 }
 
 static const u_char *
-krb4_print_hdr(const u_char *cp)
+krb4_print_hdr(netdissect_options *ndo,
+               const u_char *cp)
 {
        cp += 2;
 
-#define PRINT          if ((cp = c_print(cp, snapend)) == NULL) goto trunc
+#define PRINT          if ((cp = c_print(ndo, cp, ndo->ndo_snapend)) == NULL) goto trunc
 
        PRINT;
-       putchar('.');
+       ND_PRINT((ndo, "."));
        PRINT;
-       putchar('@');
+       ND_PRINT((ndo, "@"));
        PRINT;
        return (cp);
 
 trunc:
-       fputs(tstr, stdout);
+       ND_PRINT((ndo, tstr));
        return (NULL);
 
 #undef PRINT
 }
 
 static void
-krb4_print(const u_char *cp)
+krb4_print(netdissect_options *ndo,
+           const u_char *cp)
 {
        register const struct krb *kp;
        u_char type;
        u_short len;
 
-#define PRINT          if ((cp = c_print(cp, snapend)) == NULL) goto trunc
+#define PRINT          if ((cp = c_print(ndo, cp, ndo->ndo_snapend)) == NULL) goto trunc
 /*  True if struct krb is little endian */
 #define IS_LENDIAN(kp) (((kp)->type & 0x01) != 0)
 #define KTOHSP(kp, cp) (IS_LENDIAN(kp) ? EXTRACT_LE_16BITS(cp) : EXTRACT_16BITS(cp))
 
        kp = (struct krb *)cp;
 
-       if ((&kp->type) >= snapend) {
-               fputs(tstr, stdout);
+       if ((&kp->type) >= ndo->ndo_snapend) {
+               ND_PRINT((ndo, tstr));
                return;
        }
 
        type = kp->type & (0xFF << 1);
 
-       printf(" %s %s: ",
-           IS_LENDIAN(kp) ? "le" : "be", tok2str(type2str, NULL, type));
+       ND_PRINT((ndo, " %s %s: ",
+           IS_LENDIAN(kp) ? "le" : "be", tok2str(type2str, NULL, type)));
 
        switch (type) {
 
        case AUTH_MSG_KDC_REQUEST:
-               if ((cp = krb4_print_hdr(cp)) == NULL)
+               if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
                        return;
                cp += 4;        /* ctime */
-               TCHECK(*cp);
-               printf(" %dmin ", *cp++ * 5);
+               ND_TCHECK(*cp);
+               ND_PRINT((ndo, " %dmin ", *cp++ * 5));
                PRINT;
-               putchar('.');
+               ND_PRINT((ndo, "."));
                PRINT;
                break;
 
        case AUTH_MSG_APPL_REQUEST:
                cp += 2;
-               TCHECK(*cp);
-               printf("v%d ", *cp++);
+               ND_TCHECK(*cp);
+               ND_PRINT((ndo, "v%d ", *cp++));
                PRINT;
-               TCHECK(*cp);
-               printf(" (%d)", *cp++);
-               TCHECK(*cp);
-               printf(" (%d)", *cp);
+               ND_TCHECK(*cp);
+               ND_PRINT((ndo, " (%d)", *cp++));
+               ND_TCHECK(*cp);
+               ND_PRINT((ndo, " (%d)", *cp));
                break;
 
        case AUTH_MSG_KDC_REPLY:
-               if ((cp = krb4_print_hdr(cp)) == NULL)
+               if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
                        return;
                cp += 10;       /* timestamp + n + exp + kvno */
-               TCHECK2(*cp, sizeof(short));
+               ND_TCHECK2(*cp, sizeof(short));
                len = KTOHSP(kp, cp);
-               printf(" (%d)", len);
+               ND_PRINT((ndo, " (%d)", len));
                break;
 
        case AUTH_MSG_ERR_REPLY:
-               if ((cp = krb4_print_hdr(cp)) == NULL)
+               if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
                        return;
                cp += 4;          /* timestamp */
-               TCHECK2(*cp, sizeof(short));
-               printf(" %s ", tok2str(kerr2str, NULL, KTOHSP(kp, cp)));
+               ND_TCHECK2(*cp, sizeof(short));
+               ND_PRINT((ndo, " %s ", tok2str(kerr2str, NULL, KTOHSP(kp, cp))));
                cp += 4;
                PRINT;
                break;
 
        default:
-               fputs("(unknown)", stdout);
+               ND_PRINT((ndo, "(unknown)"));
                break;
        }
 
        return;
 trunc:
-       fputs(tstr, stdout);
+       ND_PRINT((ndo, tstr));
 }
 
 void
-krb_print(const u_char *dat)
+krb_print(netdissect_options *ndo,
+          const u_char *dat)
 {
        register const struct krb *kp;
 
        kp = (struct krb *)dat;
 
-       if (dat >= snapend) {
-               fputs(tstr, stdout);
+       if (dat >= ndo->ndo_snapend) {
+               ND_PRINT((ndo, tstr));
                return;
        }
 
@@ -237,17 +239,17 @@ krb_print(const u_char *dat)
        case 1:
        case 2:
        case 3:
-               printf(" v%d", kp->pvno);
+               ND_PRINT((ndo, " v%d", kp->pvno));
                break;
 
        case 4:
-               printf(" v%d", kp->pvno);
-               krb4_print((const u_char *)kp);
+               ND_PRINT((ndo, " v%d", kp->pvno));
+               krb4_print(ndo, (const u_char *)kp);
                break;
 
        case 106:
        case 107:
-               fputs(" v5", stdout);
+               ND_PRINT((ndo, " v5"));
                /* Decode ASN.1 here "someday" */
                break;
        }
index fdb1d9815372c9e198594c0301c02676f00c3c79..565fd3ce9ed0de88db80c0dec5c3bd53edb2a76b 100644 (file)
@@ -425,7 +425,7 @@ snap_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen,
        case OUI_CISCO:
                 switch (et) {
                 case PID_CISCO_CDP:
-                        cdp_print(p, length, caplen);
+                        cdp_print(ndo, p, length, caplen);
                         return (1);
                 case PID_CISCO_DTP:
                         dtp_print(ndo, p, length);
index a8be6c8ba7c05fcdc4ef45410e4eb17e8ccae657..47df451ee7803d4771da099a3ff7a88d5afba7e2 100644 (file)
@@ -122,7 +122,7 @@ null_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char
                break;
 
        case BSD_AFNUM_APPLETALK:
-               atalk_print(p, length);
+               atalk_print(ndo, p, length);
                break;
 
        case BSD_AFNUM_IPX:
index a5412a16b706fc57fe0a8f579269a2649b9b663b..5d2d83cdce51674b2ac884950bca64d7089bac44 100644 (file)
@@ -515,7 +515,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length,
                    (atalk_port(sport) || atalk_port(dport))) {
                        if (ndo->ndo_vflag)
                                ND_PRINT((ndo, "kip "));
-                       llap_print(cp, length);
+                       llap_print(ndo, cp, length);
                        return;
                }
        }
@@ -595,7 +595,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length,
                else if (ISPORT(NTP_PORT))
                        ntp_print(ndo, (const u_char *)(up + 1), length);
                else if (ISPORT(KERBEROS_PORT) || ISPORT(KERBEROS_SEC_PORT))
-                       krb_print((const void *)(up + 1));
+                       krb_print(ndo, (const void *)(up + 1));
                else if (ISPORT(L2TP_PORT))
                        l2tp_print(ndo, (const u_char *)(up + 1), length);
 #ifdef TCPDUMP_DO_SMB
index 2fc257acd01b42ef4b252f7e844191db908bc946..75ea7eb70f0e9ceda223139aee0a222915d8f472 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -180,9 +180,6 @@ static const struct printer printers[] = {
 #ifdef DLT_IEEE802_11
        { ieee802_11_if_print,  DLT_IEEE802_11},
 #endif
-#ifdef DLT_LTALK
-       { ltalk_if_print,       DLT_LTALK },
-#endif
 #ifdef DLT_PRISM_HEADER
        { prism_if_print,       DLT_PRISM_HEADER },
 #endif
@@ -343,6 +340,9 @@ static const struct ndo_printer ndo_printers[] = {
        { sl_if_print,          DLT_SLIP },
 #ifdef DLT_SLIP_BSDOS
        { sl_bsdos_if_print,    DLT_SLIP_BSDOS },
+#endif
+#ifdef DLT_LTALK
+       { ltalk_if_print,       DLT_LTALK },
 #endif
        { NULL,                 0 },
 };