summaryrefslogtreecommitdiff
path: root/usr.sbin/tcpdump/tcpdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/tcpdump/tcpdump.c')
-rw-r--r--usr.sbin/tcpdump/tcpdump.c105
1 files changed, 67 insertions, 38 deletions
diff --git a/usr.sbin/tcpdump/tcpdump.c b/usr.sbin/tcpdump/tcpdump.c
index 48285b97ce6..948281fa3c5 100644
--- a/usr.sbin/tcpdump/tcpdump.c
+++ b/usr.sbin/tcpdump/tcpdump.c
@@ -1,8 +1,7 @@
-/**//* $OpenBSD: tcpdump.c,v 1.3 1996/06/10 07:47:58 deraadt Exp $ */
-/* $NetBSD: tcpdump.c,v 1.4.4.1 1996/06/05 18:07:48 cgd Exp $ */
+/* $OpenBSD: tcpdump.c,v 1.4 1996/07/13 11:01:34 mickey Exp $ */
/*
- * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -23,9 +22,10 @@
*/
#ifndef lint
char copyright[] =
- "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994\nThe Regents of the University of California. All rights reserved.\n";
+ "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995\n\
+The Regents of the University of California. All rights reserved.\n";
static char rcsid[] =
- "@(#)Header: tcpdump.c,v 1.93 94/06/10 17:01:44 mccanne Exp (LBL)";
+ "@(#)Header: tcpdump.c,v 1.109 96/06/22 14:46:37 leres Exp (LBL)";
#endif
/*
@@ -38,17 +38,19 @@ static char rcsid[] =
#include <sys/types.h>
#include <sys/time.h>
+#ifdef __osf__
+#include <sys/sysinfo.h>
+#include <sys/proc.h>
+#endif
#include <netinet/in.h>
#include <pcap.h>
#include <signal.h>
#include <stdio.h>
-#ifdef __STDC__
#include <stdlib.h>
-#endif
-#include <unistd.h>
#include <string.h>
+#include <unistd.h>
#include "interface.h"
#include "addrtoname.h"
@@ -70,11 +72,18 @@ int dflag; /* print filter code */
char *program_name;
-int thiszone;
+int32_t thiszone; /* seconds offset from gmt to local time */
-SIGRET cleanup(int);
+/* Externs */
extern void bpf_dump(struct bpf_program *, int);
+/* Forwards */
+RETSIGTYPE cleanup(int);
+extern __dead void usage(void) __attribute__((volatile));
+#ifdef __osf__
+static void abort_on_misalignment(void);
+#endif
+
/* Length of saved portion of packet. */
int snaplen = DEFAULT_SNAPLEN;
@@ -83,12 +92,18 @@ struct printer {
int type;
};
+/* XXX needed if using old bpf.h */
+#ifndef DLT_ATM_RFC1483
+#define DLT_ATM_RFC1483 11
+#endif
+
static struct printer printers[] = {
{ ether_if_print, DLT_EN10MB },
{ sl_if_print, DLT_SLIP },
{ ppp_if_print, DLT_PPP },
{ fddi_if_print, DLT_FDDI },
{ null_if_print, DLT_NULL },
+ { atm_if_print, DLT_ATM_RFC1483 },
{ NULL, 0 },
};
@@ -107,38 +122,33 @@ lookup_printer(int type)
static pcap_t *pd;
+/* OSF magic */
#ifdef __osf__
-#include <sys/sysinfo.h>
-#include <sys/proc.h>
-void
+static void
abort_on_misalignment()
{
- int buf[2];
-
- buf[0] = SSIN_UACPROC;
- buf[1] = UAC_SIGBUS;
- if (setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0) < 0) {
- perror("setsysinfo");
- exit(1);
- }
-}
+ static int buf[2] = { SSIN_UACPROC, UAC_SIGBUS };
+ if (setsysinfo(SSI_NVPAIRS, (caddr_t)buf, 1, 0, 0) < 0)
+ error("setsysinfo: %s", pcap_strerror(errno));
+}
#endif
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
int
main(int argc, char **argv)
{
- register int cnt, op;
- u_int32_t localnet, netmask;
+ register int cnt, op, i;
+ bpf_u_int32 localnet, netmask;
register char *cp, *infile, *cmdbuf, *device, *RFileName, *WFileName;
pcap_handler printer;
struct bpf_program fcode;
u_char *pcap_userdata;
char errbuf[PCAP_ERRBUF_SIZE];
- extern char *optarg;
- extern int optind, opterr;
-
#ifdef __osf__
abort_on_misalignment();
#endif
@@ -181,7 +191,11 @@ main(int argc, char **argv)
break;
case 'l':
+#ifdef HAVE_SETLINEBUF
setlinebuf(stdout);
+#else
+ setvbuf(stdout, NULL, _IOLBF, 0);
+#endif
break;
case 'n':
@@ -222,13 +236,15 @@ main(int argc, char **argv)
case 'T':
if (strcasecmp(optarg, "vat") == 0)
- packettype = 1;
+ packettype = PT_VAT;
else if (strcasecmp(optarg, "wb") == 0)
- packettype = 2;
+ packettype = PT_WB;
else if (strcasecmp(optarg, "rpc") == 0)
- packettype = 3;
+ packettype = PT_RPC;
else if (strcasecmp(optarg, "rtp") == 0)
- packettype = 4;
+ packettype = PT_RTP;
+ else if (strcasecmp(optarg, "rtcp") == 0)
+ packettype = PT_RTCP;
else
error("unknown packet type `%s'", optarg);
break;
@@ -243,6 +259,7 @@ main(int argc, char **argv)
#ifdef YYDEBUG
case 'Y':
{
+ /* Undocumented flag */
extern int yydebug;
yydebug = 1;
}
@@ -284,6 +301,11 @@ main(int argc, char **argv)
pd = pcap_open_live(device, snaplen, !pflag, 1000, errbuf);
if (pd == NULL)
error(errbuf);
+ i = pcap_snapshot(pd);
+ if (snaplen < i) {
+ warning("snaplen raised from %d to %d", snaplen, i);
+ snaplen = i;
+ }
if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)
error(errbuf);
/*
@@ -296,6 +318,10 @@ main(int argc, char **argv)
else
cmdbuf = copy_argv(&argv[optind]);
+ /* XXX padding only needed for kernel fcode */
+ if (RFileName != NULL)
+ pcap_fddipad = 0;
+
if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
error(pcap_geterr(pd));
if (dflag) {
@@ -321,11 +347,12 @@ main(int argc, char **argv)
pcap_userdata = 0;
}
if (RFileName == NULL) {
- fprintf(stderr, "%s: listening on %s\n", program_name, device);
- fflush(stderr);
+ (void)fprintf(stderr, "%s: listening on %s\n",
+ program_name, device);
+ (void)fflush(stderr);
}
if (pcap_loop(pd, cnt, printer, pcap_userdata) < 0) {
- (void)fprintf(stderr, "%s: pcap_loop %s\n",
+ (void)fprintf(stderr, "%s: pcap_loop: %s\n",
program_name, pcap_geterr(pd));
exit(1);
}
@@ -334,7 +361,7 @@ main(int argc, char **argv)
}
/* make a clean exit on interrupts */
-SIGRET
+RETSIGTYPE
cleanup(int signo)
{
struct pcap_stat stat;
@@ -404,15 +431,17 @@ default_print(register const u_char *bp, register int length)
}
}
-void
+__dead void
usage()
{
extern char version[];
(void)fprintf(stderr, "Version %s\n", version);
(void)fprintf(stderr,
-"Usage: tcpdump [-deflnOpqtvx] [-c count] [-i interface]\n");
+"Usage: tcpdump [-deflnNOpqStvx] [-c count] [ -F file ]\n");
+ (void)fprintf(stderr,
+"\t\t[ -i interface ] [ -r file ] [ -s snaplen ]\n");
(void)fprintf(stderr,
-"\t\t[-r filename] [-w filename] [expr]\n");
+"\t\t[ -T type ] [ -w file ] [ expression ]\n");
exit(-1);
}