X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c4521bbf470420aa57fa5f252bcf3576318ace87..cbd4cbb99cf9e68c67af16b5b20a050ef8819af6:/tcpdump.c diff --git a/tcpdump.c b/tcpdump.c index 714b19ee..4903a623 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.137 1999-12-22 06:27:24 itojun Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.161 2001-04-30 16:08:43 fenner Exp $ (LBL)"; #endif /* @@ -52,8 +52,6 @@ static const char rcsid[] = #include #include -#include -#include #include "interface.h" #include "addrtoname.h" @@ -74,10 +72,11 @@ 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 */ -char *ahsecret = NULL; /* AH secret key */ char *espsecret = NULL; /* ESP secret key */ int packettype; @@ -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; @@ -103,13 +99,17 @@ struct printer { }; static struct printer printers[] = { + { arcnet_if_print, DLT_ARCNET }, { ether_if_print, DLT_EN10MB }, - { ether_if_print, DLT_IEEE802 }, + { token_if_print, DLT_IEEE802 }, #ifdef DLT_LANE8023 { lane_if_print, DLT_LANE8023 }, #endif #ifdef DLT_CIP { cip_if_print, DLT_CIP }, +#endif +#ifdef DLT_ATM_CLIP + { cip_if_print, DLT_ATM_CLIP }, #endif { sl_if_print, DLT_SLIP }, { sl_bsdos_if_print, DLT_SLIP_BSDOS }, @@ -117,10 +117,22 @@ static struct printer printers[] = { { ppp_bsdos_if_print, DLT_PPP_BSDOS }, { fddi_if_print, DLT_FDDI }, { null_if_print, DLT_NULL }, +#ifdef DLT_LOOP + { null_if_print, DLT_LOOP }, +#endif { raw_if_print, DLT_RAW }, { atm_if_print, DLT_ATM_RFC1483 }, -#ifdef DLT_CHDLC - { chdlc_if_print, DLT_CHDLC }, +#ifdef DLT_C_HDLC + { chdlc_if_print, DLT_C_HDLC }, +#endif +#ifdef DLT_HDLC + { chdlc_if_print, DLT_HDLC }, +#endif +#ifdef DLT_PPP_SERIAL + { ppp_hdlc_if_print, DLT_PPP_SERIAL }, +#endif +#ifdef DLT_LINUX_SLL + { sll_if_print, DLT_LINUX_SLL }, #endif { NULL, 0 }, }; @@ -134,7 +146,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 */ } @@ -166,7 +178,7 @@ main(int argc, char **argv) else program_name = argv[0]; - if (abort_on_misalignment(ebuf) < 0) + if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0) error("%s", ebuf); #ifdef LIBSMI @@ -175,22 +187,13 @@ main(int argc, char **argv) opterr = 0; while ( - (op = getopt(argc, argv, "ac:deE:fF:i:lnNm:Opqr:Rs:StT:vw:xY")) != EOF) + (op = getopt(argc, argv, "ac:deE:fF:i:lm:nNOpqr:Rs:StT:uvw:xXY")) != -1) switch (op) { case 'a': ++aflag; break; -#if 0 - case 'A': -#ifndef CRYPTO - warning("crypto code not compiled in"); -#endif - ahsecret = optarg; - break; -#endif - case 'c': cnt = atoi(optarg); if (cnt <= 0) @@ -206,7 +209,7 @@ main(int argc, char **argv) break; case 'E': -#ifndef CRYPTO +#ifndef HAVE_LIBCRYPTO warning("crypto code not compiled in"); #endif espsecret = optarg; @@ -272,11 +275,17 @@ main(int argc, char **argv) Rflag = 0; break; - case 's': - snaplen = atoi(optarg); - if (snaplen <= 0) + case 's': { + char *end; + + snaplen = strtol(optarg, &end, 0); + if (optarg == end || *end != '\0' + || snaplen < 0 || snaplen > 65535) error("invalid snaplen %s", optarg); + else if (snaplen == 0) + snaplen = 65535; break; + } case 'S': ++Sflag; @@ -299,10 +308,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; @@ -310,6 +325,16 @@ main(int argc, char **argv) case 'w': WFileName = optarg; break; + + case 'x': + ++xflag; + break; + + case 'X': + ++xflag; + ++Xflag; + break; + #ifdef YYDEBUG case 'Y': { @@ -319,10 +344,6 @@ main(int argc, char **argv) } break; #endif - case 'x': - ++xflag; - break; - default: usage(); /* NOTREACHED */ @@ -355,9 +376,12 @@ main(int argc, char **argv) if (device == NULL) error("%s", ebuf); } + *ebuf = '\0'; pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf); if (pd == NULL) error("%s", ebuf); + else if (*ebuf) + warning("%s", ebuf); i = pcap_snapshot(pd); if (snaplen < i) { warning("snaplen raised from %d to %d", snaplen, i); @@ -419,7 +443,7 @@ main(int argc, char **argv) } /* make a clean exit on interrupts */ -RETSIGTYPE +static RETSIGTYPE cleanup(int signo) { struct pcap_stat stat; @@ -445,10 +469,13 @@ cleanup(int signo) void default_print_unaligned(register const u_char *cp, register u_int length) { -#if 1 register u_int i, s; register int nshorts; + if (Xflag) { + ascii_print(cp, length); + return; + } nshorts = (u_int) length / sizeof(u_short); i = 0; while (--nshorts >= 0) { @@ -462,50 +489,10 @@ default_print_unaligned(register const u_char *cp, register u_int length) (void)printf("\n\t\t\t"); (void)printf(" %02x", *cp); } -#else - register u_int i; - register int nshorts; - - char line[81]; - - nshorts = (u_int) length / sizeof(u_short); - i = 0; - memset(line, ' ', 80); - line[81]='\0'; - - putchar('\n'); - while (nshorts >= 0) { - - sprintf(line+20+i*5, "%02x%02x ", cp[0], cp[1]); - - if(isprint(cp[0])) { - line[62+i*2]=cp[0]; - } else { - line[62+i*2]='.'; - } - if(isprint(cp[1])) { - line[62+i*2+1]=cp[1]; - } else { - line[62+i*2+1]='.'; - } - i++; - if (i == 8) { - line[60]=' '; - line[61]=' '; - line[62+16]='\0'; - puts(line); - i=0; - } - cp += 2; - nshorts--; - } -#endif } /* * By default, print the packet out in hex. - * - * (BTW, please don't send us patches to print the packet out in ascii) */ void default_print(register const u_char *bp, register u_int length) @@ -513,7 +500,7 @@ default_print(register const u_char *bp, register u_int length) default_print_unaligned(bp, length); } -__dead void +static void usage(void) { extern char version[]; @@ -522,7 +509,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 [-adeflnNOpqStvx] [-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,