]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
add support for Frame-Relay over AS-PIC dissector
[tcpdump] / tcpdump.c
index 35c1153270e2f75a401cd8468c1d9e03b0281125..93a77558a921a0269d31f9a9924e98240fa3a296 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -30,7 +30,7 @@ static const char copyright[] _U_ =
     "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
 The Regents of the University of California.  All rights reserved.\n";
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.250 2004-11-07 22:05:20 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.253.2.10 2005-07-07 01:24:40 guy Exp $ (LBL)";
 #endif
 
 /*
@@ -106,6 +106,7 @@ static void usage(void) __attribute__((noreturn));
 static void show_dlts_and_exit(pcap_t *pd) __attribute__((noreturn));
 
 static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
+static void ndo_default_print(netdissect_options *, const u_char *, u_int);
 static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
 static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
 static void droproot(const char *, const char *);
@@ -224,6 +225,33 @@ static struct printer printers[] = {
 #endif
 #ifdef DLT_JUNIPER_ATM2
        { juniper_atm2_print,   DLT_JUNIPER_ATM2 },
+#endif
+#ifdef DLT_JUNIPER_MFR
+       { juniper_mfr_print,    DLT_JUNIPER_MFR },
+#endif
+#ifdef DLT_JUNIPER_MLFR
+       { juniper_mlfr_print,   DLT_JUNIPER_MLFR },
+#endif
+#ifdef DLT_JUNIPER_MLPPP
+       { juniper_mlppp_print,  DLT_JUNIPER_MLPPP },
+#endif
+#ifdef DLT_JUNIPER_PPPOE
+       { juniper_pppoe_print,  DLT_JUNIPER_PPPOE },
+#endif
+#ifdef DLT_JUNIPER_PPPOE_ATM
+       { juniper_pppoe_atm_print, DLT_JUNIPER_PPPOE_ATM },
+#endif
+#ifdef DLT_JUNIPER_GGSN
+       { juniper_ggsn_print,   DLT_JUNIPER_GGSN },
+#endif
+#ifdef DLT_JUNIPER_ES
+       { juniper_es_print,     DLT_JUNIPER_ES },
+#endif
+#ifdef DLT_JUNIPER_MONITOR
+       { juniper_monitor_print, DLT_JUNIPER_MONITOR },
+#endif
+#ifdef DLT_JUNIPER_SERVICES
+       { juniper_services_print, DLT_JUNIPER_SERVICES },
 #endif
        { NULL,                 0 },
 };
@@ -431,6 +459,7 @@ main(int argc, char **argv)
         gndo->ndo_Oflag=1;
        gndo->ndo_Rflag=1;
        gndo->ndo_dlt=-1;
+       gndo->ndo_default_print=ndo_default_print;
        gndo->ndo_printf=tcpdump_printf;
        gndo->ndo_error=ndo_error;
        gndo->ndo_warning=ndo_warning;
@@ -463,8 +492,6 @@ main(int argc, char **argv)
                        break;
 
                case 'A':
-                       ++xflag;
-                       ++Xflag;
                        ++Aflag;
                        break;
 
@@ -626,6 +653,7 @@ main(int argc, char **argv)
 
                case 'q':
                        ++qflag;
+                       ++suppress_default_print;
                        break;
 
                case 'r':
@@ -706,10 +734,12 @@ main(int argc, char **argv)
 
                case 'x':
                        ++xflag;
+                       ++suppress_default_print;
                        break;
 
                case 'X':
                        ++Xflag;
+                       ++suppress_default_print;
                        break;
 
                case 'y':
@@ -1122,7 +1152,7 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
         * larger than Cflag - the last packet written to the
         * file could put it over Cflag.
         */
-       if (ftell((FILE *)dump_info->p) > Cflag) {
+       if (pcap_dump_ftell(dump_info->p) > Cflag) {
                /*
                 * Close the current file and open a new one.
                 */
@@ -1195,9 +1225,28 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
        snapend = sp + h->caplen;
 
        hdrlen = (*print_info->printer)(h, sp);
-       if (xflag) {
+       if (Xflag) {
+               /*
+                * Print the raw packet data in hex and ASCII.
+                */
+               if (Xflag > 1) {
+                       /*
+                        * Include the link-layer header.
+                        */
+                       hex_and_ascii_print("\n\t", sp, h->caplen);
+               } else {
+                       /*
+                        * Don't include the link-layer header - and if
+                        * we have nothing past the link-layer header,
+                        * print nothing.
+                        */
+                       if (h->caplen > hdrlen)
+                               hex_and_ascii_print("\n\t", sp + hdrlen,
+                                   h->caplen - hdrlen);
+               }
+       } else if (xflag) {
                /*
-                * Print the raw packet data.
+                * Print the raw packet data in hex.
                 */
                if (xflag > 1) {
                        /*
@@ -1214,15 +1263,15 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
                                hex_print("\n\t", sp + hdrlen,
                                    h->caplen - hdrlen);
                }
-       } else if (Xflag) {
+       } else if (Aflag) {
                /*
-                * Print the raw packet data.
+                * Print the raw packet data in ASCII.
                 */
-               if (Xflag > 1) {
+               if (Aflag > 1) {
                        /*
                         * Include the link-layer header.
                         */
-                       ascii_print("\n\t", sp, h->caplen);
+                       ascii_print(sp, h->caplen);
                } else {
                        /*
                         * Don't include the link-layer header - and if
@@ -1230,8 +1279,7 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
                         * print nothing.
                         */
                        if (h->caplen > hdrlen)
-                               ascii_print("\n\t", sp + hdrlen,
-                                   h->caplen - hdrlen);
+                               ascii_print(sp + hdrlen, h->caplen - hdrlen);
                }
        }
 
@@ -1270,12 +1318,18 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
 #endif
 
 /*
- * By default, print the specified data out in hex.
+ * By default, print the specified data out in hex and ASCII.
  */
+static void
+ndo_default_print(netdissect_options *ndo _U_, const u_char *bp, u_int length)
+{
+       hex_and_ascii_print("\n\t", bp, length); /* pass on lf and identation string */
+}
+
 void
-default_print(register const u_char *bp, register u_int length)
+default_print(const u_char *bp, u_int length)
 {
-       ascii_print("\n\t", bp, length); /* pass on lf and identation string */
+       ndo_default_print(gndo, bp, length);
 }
 
 #ifdef SIGINFO