X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/e75af2003b1e9b905a2db92aea8756f3349cd4c8..2c3ee827aeb173c78f88ea032cf1405c92281a10:/tcpdump.c diff --git a/tcpdump.c b/tcpdump.c index f6d8860e..b2f19729 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -24,7 +24,7 @@ static const char copyright[] = "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n\ The Regents of the University of California. All rights reserved.\n"; static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.144 2000-04-21 10:32:03 assar Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.154 2000-09-29 04:58:53 guy Exp $ (LBL)"; #endif /* @@ -52,8 +52,6 @@ static const char rcsid[] = #include #include -#include -#include #include "interface.h" #include "addrtoname.h" @@ -74,6 +72,7 @@ int Rflag = 1; /* print sequence # field in AH/ESP*/ int sflag = 0; /* use the libsmi to translate OIDs */ int Sflag; /* print raw TCP sequence numbers */ int tflag = 1; /* print packet arrival time */ +int uflag = 0; /* Print undecoded NFS handles */ int vflag; /* verbose */ int xflag; /* print packet in hex */ int Xflag; /* print packet in ascii as well as hex */ @@ -87,12 +86,9 @@ char *program_name; int32_t thiszone; /* seconds offset from gmt to local time */ -/* Externs */ -extern void bpf_dump(struct bpf_program *, int); - /* Forwards */ -RETSIGTYPE cleanup(int); -extern __dead void usage(void) __attribute__((volatile)); +static RETSIGTYPE cleanup(int); +static void usage(void) __attribute__((noreturn)); /* Length of saved portion of packet. */ int snaplen = DEFAULT_SNAPLEN; @@ -102,26 +98,71 @@ struct printer { int type; }; +/* + * This table checks some DLT_* codes as well as checking PCAP_ENCAP_* + * codes, so that those DLT_* codes that aren't the same on all platforms + * (and thus don't have values identical to the values of the corresponding + * PCAP_ENCAP_* codes) are, at least, handled on the platform that wrote + * the capture file. + * + * (This may result in two identical entries in the table, if there's + * a DLT_* code defined to have the same value as the corresponding + * PCAP_ENCAP_* code. Those duplicate entries are harmless.) + */ static struct printer printers[] = { - { ether_if_print, DLT_EN10MB }, - { ether_if_print, DLT_IEEE802 }, -#ifdef DLT_LANE8023 - { lane_if_print, DLT_LANE8023 }, + /* + * PCAP_ENCAP_* codes that correspond to DLT_* codes whose values + * are the same on all platforms (the PCAP_ENCAP_* code values + * are the same as the DLT_* code values). + */ + { null_if_print, PCAP_ENCAP_NULL }, + { ether_if_print, PCAP_ENCAP_ETHERNET }, + { token_if_print, PCAP_ENCAP_TOKEN_RING }, + { sl_if_print, PCAP_ENCAP_SLIP }, + { ppp_if_print, PCAP_ENCAP_PPP }, + { fddi_if_print, PCAP_ENCAP_FDDI }, + + /* + * DLT_* codes that aren't the same on all platforms, or that + * aren't present on all platforms. + */ +#ifdef DLT_ATM_RFC1483 + { atm_if_print, DLT_ATM_RFC1483 }, #endif -#ifdef DLT_CIP - { cip_if_print, DLT_CIP }, +#ifdef DLT_RAW + { raw_if_print, DLT_RAW }, #endif - { sl_if_print, DLT_SLIP }, +#ifdef DLT_SLIP_BSDOS { sl_bsdos_if_print, DLT_SLIP_BSDOS }, - { ppp_if_print, DLT_PPP }, +#endif +#ifdef DLT_PPP_BSDOS { ppp_bsdos_if_print, DLT_PPP_BSDOS }, - { fddi_if_print, DLT_FDDI }, - { null_if_print, DLT_NULL }, - { raw_if_print, DLT_RAW }, - { atm_if_print, DLT_ATM_RFC1483 }, -#ifdef DLT_CHDLC - { chdlc_if_print, DLT_CHDLC }, #endif +#ifdef DLT_CIP + { cip_if_print, DLT_CIP }, +#endif +#ifdef DLT_ATM_CLIP + { cip_if_print, DLT_ATM_CLIP }, +#endif +#ifdef DLT_LANE8023 + { lane_if_print, DLT_LANE8023 }, +#endif +#ifdef DLT_PPP_SERIAL + { ppp_hdlc_if_print, DLT_PPP_SERIAL }, +#endif + + /* + * PCAP_ENCAP_* codes corresponding to DLT_* codes that aren't + * necessarily the same on all platforms, and PCAP_ENCAP_* codes + * for which there aren't DLT_* codes. + */ + { atm_if_print, PCAP_ENCAP_ATM_RFC1483 }, + { raw_if_print, PCAP_ENCAP_RAW }, + { sl_bsdos_if_print, PCAP_ENCAP_SLIP_BSDOS }, + { ppp_bsdos_if_print, PCAP_ENCAP_PPP_BSDOS }, + { chdlc_if_print, PCAP_ENCAP_C_HDLC }, + { cip_if_print, PCAP_ENCAP_ATM_CLIP }, + { ppp_hdlc_if_print, PCAP_ENCAP_PPP_HDLC }, { NULL, 0 }, }; @@ -134,7 +175,7 @@ lookup_printer(int type) if (type == p->type) return p->f; - error("unknown data link type 0x%x", type); + error("unknown data link type %d", type); /* NOTREACHED */ } @@ -175,7 +216,7 @@ main(int argc, char **argv) opterr = 0; while ( - (op = getopt(argc, argv, "ac:deE:fF:i:lm:nNOpqr:Rs:StT:vw:xXY")) != EOF) + (op = getopt(argc, argv, "ac:deE:fF:i:lm:nNOpqr:Rs:StT:uvw:xXY")) != -1) switch (op) { case 'a': @@ -296,10 +337,16 @@ main(int argc, char **argv) packettype = PT_RTCP; else if (strcasecmp(optarg, "snmp") == 0) packettype = PT_SNMP; + else if (strcasecmp(optarg, "cnfp") == 0) + packettype = PT_CNFP; else error("unknown packet type `%s'", optarg); break; + case 'u': + ++uflag; + break; + case 'v': ++vflag; break; @@ -422,7 +469,7 @@ main(int argc, char **argv) } /* make a clean exit on interrupts */ -RETSIGTYPE +static RETSIGTYPE cleanup(int signo) { struct pcap_stat stat; @@ -476,10 +523,10 @@ default_print_unaligned(register const u_char *cp, register u_int length) void default_print(register const u_char *bp, register u_int length) { - default_print_unaligned(bp, length); + default_print_unaligned(bp, length); } -__dead void +static void usage(void) { extern char version[]; @@ -488,7 +535,7 @@ usage(void) (void)fprintf(stderr, "%s version %s\n", program_name, version); (void)fprintf(stderr, "libpcap version %s\n", pcap_version); (void)fprintf(stderr, -"Usage: %s [-adeflnNOpqStvxX] [-c count] [ -F file ]\n", program_name); +"Usage: %s [-adeflnNOpqStuvxX] [-c count] [ -F file ]\n", program_name); (void)fprintf(stderr, "\t\t[ -i interface ] [ -r file ] [ -s snaplen ]\n"); (void)fprintf(stderr,