"@(#) 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.134 1999-11-21 03:50:26 assar Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.156 2000-12-09 02:58:48 fenner Exp $ (LBL)";
#endif
/*
* combined efforts of Van, Steve McCanne and Craig Leres of LBL.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include <sys/types.h>
#include <sys/time.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <ctype.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
#include "interface.h"
#include "addrtoname.h"
int pflag; /* don't go promiscuous */
int qflag; /* quick (shorter) output */
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;
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;
static struct printer printers[] = {
{ 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 },
{ null_if_print, DLT_NULL },
{ 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_PPP_SERIAL
+ { ppp_hdlc_if_print, DLT_PPP_SERIAL },
#endif
{ NULL, 0 },
};
if (type == p->type)
return p->f;
- error("unknown data link type 0x%x", type);
+ error("unknown data link type %d", type);
/* NOTREACHED */
}
else
program_name = argv[0];
- if (abort_on_misalignment(ebuf) < 0)
+ if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
error("%s", ebuf);
+#ifdef LIBSMI
+ smiInit("tcpdump");
+#endif
+
opterr = 0;
while (
- (op = getopt(argc, argv, "ac:deE:fF:i:lnNOpqr: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)
break;
case 'E':
-#ifndef CRYPTO
+#ifndef HAVE_LIBCRYPTO
warning("crypto code not compiled in");
#endif
espsecret = optarg;
++Nflag;
break;
+ case 'm':
+#ifdef LIBSMI
+ if (smiLoadModule(optarg) == 0) {
+ error("could not load MIB module %s", optarg);
+ }
+ sflag = 1;
+#else
+ (void)fprintf(stderr, "%s: ignoring option `-m %s' ",
+ program_name, optarg);
+ (void)fprintf(stderr, "(no libsmi support)\n");
+#endif
+
case 'O':
Oflag = 0;
break;
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;
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;
case 'w':
WFileName = optarg;
break;
+
+ case 'x':
+ ++xflag;
+ break;
+
+ case 'X':
+ ++xflag;
+ ++Xflag;
+ break;
+
#ifdef YYDEBUG
case 'Y':
{
}
break;
#endif
- case 'x':
- ++xflag;
- break;
-
default:
usage();
/* NOTREACHED */
}
/* make a clean exit on interrupts */
-RETSIGTYPE
+static RETSIGTYPE
cleanup(int signo)
{
struct pcap_stat stat;
void
default_print_unaligned(register const u_char *cp, register u_int length)
{
- register u_int i, s;
- 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--;
- }
+ 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) {
+ if ((i++ % 8) == 0)
+ (void)printf("\n\t\t\t");
+ s = *cp++;
+ (void)printf(" %02x%02x", s, *cp++);
+ }
+ if (length & 1) {
+ if ((i % 8) == 0)
+ (void)printf("\n\t\t\t");
+ (void)printf(" %02x", *cp);
+ }
}
/*
* 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)
{
- register const u_short *sp;
- register u_int i;
- register int nshorts;
-
default_print_unaligned(bp, length);
}
-__dead void
+static void
usage(void)
{
extern char version[];
(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,