1999-10-08 07:47:09 +08:00
|
|
|
/*
|
2001-07-05 06:03:13 +08:00
|
|
|
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
|
1999-10-08 07:47:09 +08:00
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that: (1) source code distributions
|
|
|
|
* retain the above copyright notice and this paragraph in its entirety, (2)
|
|
|
|
* distributions including binary code include the above copyright notice and
|
|
|
|
* this paragraph in its entirety in the documentation or other materials
|
|
|
|
* provided with the distribution, and (3) all advertising materials mentioning
|
|
|
|
* features or use of this software display the following acknowledgement:
|
|
|
|
* ``This product includes software developed by the University of California,
|
|
|
|
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
|
|
|
* the University nor the names of its contributors may be used to endorse
|
|
|
|
* or promote products derived from this software without specific prior
|
|
|
|
* written permission.
|
|
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
|
|
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
2001-10-03 15:35:42 +08:00
|
|
|
*
|
|
|
|
* Support for splitting captures into multiple files with a maximum
|
|
|
|
* file size:
|
|
|
|
*
|
|
|
|
* Copyright (c) 2001
|
|
|
|
* Seth Webster <swebster@sst.ll.mit.edu>
|
1999-10-08 07:47:09 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef lint
|
|
|
|
static const char copyright[] =
|
2001-07-05 06:03:13 +08:00
|
|
|
"@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
|
1999-10-08 07:47:09 +08:00
|
|
|
The Regents of the University of California. All rights reserved.\n";
|
|
|
|
static const char rcsid[] =
|
2002-11-12 03:54:40 +08:00
|
|
|
"@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.188 2002-11-11 19:54:40 guy Exp $ (LBL)";
|
1999-10-08 07:47:09 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* tcpdump - monitor tcp/ip traffic on an ethernet.
|
|
|
|
*
|
|
|
|
* First written in 1987 by Van Jacobson, Lawrence Berkeley Laboratory.
|
|
|
|
* Mercilessly hacked and occasionally improved since then via the
|
|
|
|
* combined efforts of Van, Steve McCanne and Craig Leres of LBL.
|
|
|
|
*/
|
|
|
|
|
1999-11-21 17:36:43 +08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#include <tcpdump-stdinc.h>
|
1999-10-08 07:47:09 +08:00
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
|
|
|
#include "getopt.h"
|
|
|
|
#include "w32_fzs.h"
|
|
|
|
extern int strcasecmp (const char *__s1, const char *__s2);
|
|
|
|
extern int SIZE_BUF;
|
|
|
|
#define off_t long
|
|
|
|
#define uint UINT
|
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
#include <pcap.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
1999-10-18 05:56:53 +08:00
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
#include "interface.h"
|
|
|
|
#include "addrtoname.h"
|
|
|
|
#include "machdep.h"
|
|
|
|
#include "setsignal.h"
|
|
|
|
#include "gmt2local.h"
|
|
|
|
|
|
|
|
int aflag; /* translate network and broadcast addresses */
|
|
|
|
int dflag; /* print filter code */
|
|
|
|
int eflag; /* print ethernet header */
|
|
|
|
int fflag; /* don't translate "foreign" IP address */
|
|
|
|
int nflag; /* leave addresses as numbers */
|
|
|
|
int Nflag; /* remove domains from printed host names */
|
|
|
|
int Oflag = 1; /* run filter code optimizer */
|
|
|
|
int pflag; /* don't go promiscuous */
|
|
|
|
int qflag; /* quick (shorter) output */
|
1999-10-30 13:11:06 +08:00
|
|
|
int Rflag = 1; /* print sequence # field in AH/ESP*/
|
1999-12-14 02:06:13 +08:00
|
|
|
int sflag = 0; /* use the libsmi to translate OIDs */
|
1999-10-08 07:47:09 +08:00
|
|
|
int Sflag; /* print raw TCP sequence numbers */
|
|
|
|
int tflag = 1; /* print packet arrival time */
|
2000-06-01 09:10:31 +08:00
|
|
|
int uflag = 0; /* Print undecoded NFS handles */
|
1999-10-08 07:47:09 +08:00
|
|
|
int vflag; /* verbose */
|
|
|
|
int xflag; /* print packet in hex */
|
1999-12-22 23:44:09 +08:00
|
|
|
int Xflag; /* print packet in ascii as well as hex */
|
2001-10-01 09:12:00 +08:00
|
|
|
off_t Cflag = 0; /* rotate dump files after this many bytes */
|
2002-04-24 14:55:54 +08:00
|
|
|
int Aflag = 0; /* print packet only in ascii observing LF, CR, TAB, SPACE */
|
1999-10-08 07:47:09 +08:00
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
char *espsecret = NULL; /* ESP secret key */
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
int packettype;
|
|
|
|
|
2001-07-05 06:03:13 +08:00
|
|
|
int infodelay;
|
|
|
|
int infoprint;
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
char *program_name;
|
|
|
|
|
|
|
|
int32_t thiszone; /* seconds offset from gmt to local time */
|
|
|
|
|
|
|
|
/* Forwards */
|
2000-06-18 19:12:06 +08:00
|
|
|
static RETSIGTYPE cleanup(int);
|
2000-07-11 08:49:02 +08:00
|
|
|
static void usage(void) __attribute__((noreturn));
|
2001-10-01 09:12:00 +08:00
|
|
|
|
2002-11-12 03:54:40 +08:00
|
|
|
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 *);
|
2001-10-01 09:12:00 +08:00
|
|
|
|
2001-07-05 06:03:13 +08:00
|
|
|
#ifdef SIGINFO
|
|
|
|
RETSIGTYPE requestinfo(int);
|
|
|
|
#endif
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
/* Length of saved portion of packet. */
|
|
|
|
int snaplen = DEFAULT_SNAPLEN;
|
|
|
|
|
|
|
|
struct printer {
|
|
|
|
pcap_handler f;
|
|
|
|
int type;
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct printer printers[] = {
|
2001-04-17 16:39:17 +08:00
|
|
|
{ arcnet_if_print, DLT_ARCNET },
|
Get rid of the PCAP_ENCAP_ values - if an application uses them, that
application won't build with any other version of libpcap, which means
that a lot of applications won't use them. In addition,
"pcap_linktype()" needs to return DLT_ values, so that platforms that
build libpcap as a shared library won't break binary compatibility if
they update to this version of libpcap.
Instead, we map from DLT_ values to LINKTYPE_ values when writing
savefiles, and map from LINKTYPE_ values to DLT_ values when reading
savefiles, so that savefiles don't have platform-dependent DLT_ values
in the header as the link type, they have platform-independent LINKTYPE_
values.
This means we don't need to make DLT_ATM_RFC1483, DLT_RAW, etc. have
platform-independent values starting at 100 - only the values in the
savefile header need to be like that.
2000-10-12 11:57:13 +08:00
|
|
|
{ ether_if_print, DLT_EN10MB },
|
|
|
|
{ token_if_print, DLT_IEEE802 },
|
|
|
|
#ifdef DLT_LANE8023
|
|
|
|
{ lane_if_print, DLT_LANE8023 },
|
1999-10-30 13:11:06 +08:00
|
|
|
#endif
|
2000-09-17 12:13:13 +08:00
|
|
|
#ifdef DLT_CIP
|
|
|
|
{ cip_if_print, DLT_CIP },
|
|
|
|
#endif
|
2000-12-09 10:58:45 +08:00
|
|
|
#ifdef DLT_ATM_CLIP
|
2000-09-17 12:13:13 +08:00
|
|
|
{ cip_if_print, DLT_ATM_CLIP },
|
2000-12-09 10:58:45 +08:00
|
|
|
#endif
|
Get rid of the PCAP_ENCAP_ values - if an application uses them, that
application won't build with any other version of libpcap, which means
that a lot of applications won't use them. In addition,
"pcap_linktype()" needs to return DLT_ values, so that platforms that
build libpcap as a shared library won't break binary compatibility if
they update to this version of libpcap.
Instead, we map from DLT_ values to LINKTYPE_ values when writing
savefiles, and map from LINKTYPE_ values to DLT_ values when reading
savefiles, so that savefiles don't have platform-dependent DLT_ values
in the header as the link type, they have platform-independent LINKTYPE_
values.
This means we don't need to make DLT_ATM_RFC1483, DLT_RAW, etc. have
platform-independent values starting at 100 - only the values in the
savefile header need to be like that.
2000-10-12 11:57:13 +08:00
|
|
|
{ sl_if_print, DLT_SLIP },
|
|
|
|
{ sl_bsdos_if_print, DLT_SLIP_BSDOS },
|
|
|
|
{ ppp_if_print, DLT_PPP },
|
|
|
|
{ ppp_bsdos_if_print, DLT_PPP_BSDOS },
|
|
|
|
{ fddi_if_print, DLT_FDDI },
|
|
|
|
{ null_if_print, DLT_NULL },
|
Handle DLT_NULL correctly - the AF_ value is in host byte order, which
may not be *our* byte order if we're reading a capture file from another
machine; we currently handle that by checking whether it looks like an
integer < 65536 or not and, if it's not, byte-swap it.
This also lets us handle OpenBSD DLT_LOOP as well - it's like DLT_NULL
except that the AF_ value is in *network* byte order.
(Old-style Linux loopback captures were also DLT_NULL, but the header
had an Ethernet type in it; there have also been captures where the
header was a PPP header. For now, we just continue to assume that all
DLT_NULL packets are IP, and check the IP version field to decide
whether it's IPv4, IPv6, or something else.
We may want to consider adopting Ethereal's heuristics, which would at
least mean we wouldn't be reporting bogus packet types for old-style
Linux loopback captures and those weird PPP - ISDN4BSD? - captures,
although the version of libpcap that goes with this version of tcpdump
doesn't produce bogus DLT_NULL captures for Linux loopback devices.)
2000-12-17 06:00:50 +08:00
|
|
|
#ifdef DLT_LOOP
|
|
|
|
{ null_if_print, DLT_LOOP },
|
|
|
|
#endif
|
Get rid of the PCAP_ENCAP_ values - if an application uses them, that
application won't build with any other version of libpcap, which means
that a lot of applications won't use them. In addition,
"pcap_linktype()" needs to return DLT_ values, so that platforms that
build libpcap as a shared library won't break binary compatibility if
they update to this version of libpcap.
Instead, we map from DLT_ values to LINKTYPE_ values when writing
savefiles, and map from LINKTYPE_ values to DLT_ values when reading
savefiles, so that savefiles don't have platform-dependent DLT_ values
in the header as the link type, they have platform-independent LINKTYPE_
values.
This means we don't need to make DLT_ATM_RFC1483, DLT_RAW, etc. have
platform-independent values starting at 100 - only the values in the
savefile header need to be like that.
2000-10-12 11:57:13 +08:00
|
|
|
{ raw_if_print, DLT_RAW },
|
|
|
|
{ atm_if_print, DLT_ATM_RFC1483 },
|
2000-12-09 10:58:45 +08:00
|
|
|
#ifdef DLT_C_HDLC
|
Get rid of the PCAP_ENCAP_ values - if an application uses them, that
application won't build with any other version of libpcap, which means
that a lot of applications won't use them. In addition,
"pcap_linktype()" needs to return DLT_ values, so that platforms that
build libpcap as a shared library won't break binary compatibility if
they update to this version of libpcap.
Instead, we map from DLT_ values to LINKTYPE_ values when writing
savefiles, and map from LINKTYPE_ values to DLT_ values when reading
savefiles, so that savefiles don't have platform-dependent DLT_ values
in the header as the link type, they have platform-independent LINKTYPE_
values.
This means we don't need to make DLT_ATM_RFC1483, DLT_RAW, etc. have
platform-independent values starting at 100 - only the values in the
savefile header need to be like that.
2000-10-12 11:57:13 +08:00
|
|
|
{ chdlc_if_print, DLT_C_HDLC },
|
2000-12-09 10:58:45 +08:00
|
|
|
#endif
|
2001-03-11 10:45:28 +08:00
|
|
|
#ifdef DLT_HDLC
|
|
|
|
{ chdlc_if_print, DLT_HDLC },
|
|
|
|
#endif
|
2000-12-09 10:58:45 +08:00
|
|
|
#ifdef DLT_PPP_SERIAL
|
2000-09-18 13:11:43 +08:00
|
|
|
{ ppp_hdlc_if_print, DLT_PPP_SERIAL },
|
2000-12-21 18:43:19 +08:00
|
|
|
#endif
|
2001-06-20 15:40:44 +08:00
|
|
|
#ifdef DLT_PPP_ETHER
|
|
|
|
{ pppoe_if_print, DLT_PPP_ETHER },
|
|
|
|
#endif
|
2000-12-21 18:43:19 +08:00
|
|
|
#ifdef DLT_LINUX_SLL
|
|
|
|
{ sll_if_print, DLT_LINUX_SLL },
|
2001-06-12 13:17:16 +08:00
|
|
|
#endif
|
|
|
|
#ifdef DLT_IEEE802_11
|
|
|
|
{ ieee802_11_if_print, DLT_IEEE802_11},
|
2001-06-18 16:52:51 +08:00
|
|
|
#endif
|
|
|
|
#ifdef DLT_LTALK
|
|
|
|
{ ltalk_if_print, DLT_LTALK },
|
2000-12-09 10:58:45 +08:00
|
|
|
#endif
|
2002-02-05 18:07:38 +08:00
|
|
|
#ifdef DLT_PFLOG
|
|
|
|
{ pflog_if_print, DLT_PFLOG },
|
2002-07-11 16:09:45 +08:00
|
|
|
#endif
|
|
|
|
#ifdef DLT_FR
|
|
|
|
{ fr_if_print, DLT_FR },
|
|
|
|
#endif
|
|
|
|
#ifdef DLT_FRELAY
|
|
|
|
{ fr_if_print, DLT_FRELAY },
|
2002-07-11 17:17:21 +08:00
|
|
|
#endif
|
|
|
|
#ifdef DLT_SUNATM
|
|
|
|
{ sunatm_if_print, DLT_SUNATM },
|
2002-10-18 17:17:46 +08:00
|
|
|
#endif
|
|
|
|
#ifdef DLT_IP_OVER_FC
|
|
|
|
{ ipfc_if_print, DLT_IP_OVER_FC },
|
2002-02-05 18:07:38 +08:00
|
|
|
#endif
|
1999-10-08 07:47:09 +08:00
|
|
|
{ NULL, 0 },
|
|
|
|
};
|
|
|
|
|
|
|
|
static pcap_handler
|
|
|
|
lookup_printer(int type)
|
|
|
|
{
|
|
|
|
struct printer *p;
|
|
|
|
|
|
|
|
for (p = printers; p->f; ++p)
|
|
|
|
if (type == p->type)
|
|
|
|
return p->f;
|
|
|
|
|
2000-09-17 12:13:13 +08:00
|
|
|
error("unknown data link type %d", type);
|
1999-10-08 07:47:09 +08:00
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
|
|
|
|
2001-10-03 15:35:42 +08:00
|
|
|
static pcap_t *pd;
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
extern int optind;
|
|
|
|
extern int opterr;
|
|
|
|
extern char *optarg;
|
|
|
|
|
2001-10-03 15:35:42 +08:00
|
|
|
struct dump_info {
|
|
|
|
char *WFileName;
|
|
|
|
pcap_t *pd;
|
|
|
|
pcap_dumper_t *p;
|
|
|
|
};
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
int
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
register int cnt, op, i;
|
|
|
|
bpf_u_int32 localnet, netmask;
|
2001-10-03 15:35:42 +08:00
|
|
|
register char *cp, *infile, *cmdbuf, *device, *RFileName, *WFileName;
|
1999-10-08 07:47:09 +08:00
|
|
|
pcap_handler printer;
|
|
|
|
struct bpf_program fcode;
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
1999-10-08 07:47:09 +08:00
|
|
|
RETSIGTYPE (*oldhandler)(int);
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif
|
2001-12-23 06:12:23 +08:00
|
|
|
struct dump_info dumpinfo;
|
1999-10-08 07:47:09 +08:00
|
|
|
u_char *pcap_userdata;
|
|
|
|
char ebuf[PCAP_ERRBUF_SIZE];
|
2002-08-04 06:37:01 +08:00
|
|
|
#ifdef HAVE_PCAP_FINDALLDEVS
|
2002-08-01 16:52:55 +08:00
|
|
|
pcap_if_t *devpointer;
|
|
|
|
int devnum;
|
2002-08-04 06:37:01 +08:00
|
|
|
#endif
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
|
|
|
DWORD dwVersion;
|
|
|
|
DWORD dwWindowsMajorVersion;
|
|
|
|
u_int UserBufferSize=1000000;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
dwVersion=GetVersion(); /* get the OS version */
|
|
|
|
dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
|
|
|
|
if(wsockinit()!=0) return 1;
|
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
cnt = -1;
|
|
|
|
device = NULL;
|
|
|
|
infile = NULL;
|
|
|
|
RFileName = NULL;
|
|
|
|
WFileName = NULL;
|
|
|
|
if ((cp = strrchr(argv[0], '/')) != NULL)
|
|
|
|
program_name = cp + 1;
|
|
|
|
else
|
|
|
|
program_name = argv[0];
|
|
|
|
|
2000-01-17 14:24:23 +08:00
|
|
|
if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
|
1999-10-08 07:47:09 +08:00
|
|
|
error("%s", ebuf);
|
|
|
|
|
1999-12-14 02:06:13 +08:00
|
|
|
#ifdef LIBSMI
|
|
|
|
smiInit("tcpdump");
|
|
|
|
#endif
|
2002-06-12 01:08:37 +08:00
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
opterr = 0;
|
|
|
|
while (
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
2002-08-06 12:36:12 +08:00
|
|
|
(op = getopt(argc, argv, "aAB:c:C:dDeE:fF:i:lm:nNOpqr:Rs:StT:uvw:xXY")) != -1)
|
2002-08-04 07:16:57 +08:00
|
|
|
#else /* WIN32 */
|
|
|
|
#ifdef HAVE_PCAP_FINDALLDEVS
|
2002-08-06 12:36:12 +08:00
|
|
|
(op = getopt(argc, argv, "aAc:C:dDeE:fF:i:lm:nNOpqr:Rs:StT:uvw:xXY")) != -1)
|
2002-08-04 07:16:57 +08:00
|
|
|
#else /* HAVE_PCAP_FINDALLDEVS */
|
2002-08-06 12:36:12 +08:00
|
|
|
(op = getopt(argc, argv, "aAc:C:deE:fF:i:lm:nNOpqr:Rs:StT:uvw:xXY")) != -1)
|
2002-08-04 07:16:57 +08:00
|
|
|
#endif /* HAVE_PCAP_FINDALLDEVS */
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
switch (op) {
|
|
|
|
|
|
|
|
case 'a':
|
|
|
|
++aflag;
|
|
|
|
break;
|
|
|
|
|
2002-04-24 14:55:54 +08:00
|
|
|
case 'A':
|
|
|
|
++xflag;
|
|
|
|
++Xflag;
|
|
|
|
++Aflag;
|
2002-06-12 01:08:37 +08:00
|
|
|
break;
|
2002-04-24 14:55:54 +08:00
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
|
|
|
case 'B':
|
|
|
|
UserBufferSize = atoi(optarg)*1024;
|
|
|
|
if (UserBufferSize < 0)
|
|
|
|
error("invalid packet buffer size %s", optarg);
|
|
|
|
break;
|
|
|
|
#endif /* WIN32 */
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'c':
|
|
|
|
cnt = atoi(optarg);
|
|
|
|
if (cnt <= 0)
|
|
|
|
error("invalid packet count %s", optarg);
|
|
|
|
break;
|
|
|
|
|
2001-10-01 09:12:00 +08:00
|
|
|
case 'C':
|
|
|
|
Cflag = atoi(optarg) * 1000000;
|
2002-06-12 01:08:37 +08:00
|
|
|
if (Cflag < 0)
|
2001-10-01 09:12:00 +08:00
|
|
|
error("invalid file size %s", optarg);
|
|
|
|
break;
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'd':
|
|
|
|
++dflag;
|
|
|
|
break;
|
|
|
|
|
2002-08-04 06:37:01 +08:00
|
|
|
#ifdef HAVE_PCAP_FINDALLDEVS
|
2002-08-01 16:52:55 +08:00
|
|
|
case 'D':
|
|
|
|
if (pcap_findalldevs(&devpointer, ebuf) < 0)
|
|
|
|
error("%s", ebuf);
|
|
|
|
else {
|
|
|
|
for (i = 0; devpointer != 0; i++) {
|
|
|
|
printf("%d.%s", i+1, devpointer->name);
|
|
|
|
if (devpointer->description != NULL)
|
|
|
|
printf(" (%s)", devpointer->description);
|
|
|
|
printf("\n");
|
|
|
|
devpointer = devpointer->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
2002-08-04 06:37:01 +08:00
|
|
|
#endif /* HAVE_PCAP_FINDALLDEVS */
|
2002-08-01 16:52:55 +08:00
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'e':
|
|
|
|
++eflag;
|
|
|
|
break;
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
case 'E':
|
2000-01-15 10:33:06 +08:00
|
|
|
#ifndef HAVE_LIBCRYPTO
|
1999-10-30 13:11:06 +08:00
|
|
|
warning("crypto code not compiled in");
|
|
|
|
#endif
|
|
|
|
espsecret = optarg;
|
|
|
|
break;
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'f':
|
|
|
|
++fflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'F':
|
|
|
|
infile = optarg;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'i':
|
2002-08-01 16:52:55 +08:00
|
|
|
if (optarg[0] == '0' && optarg[1] == 0)
|
|
|
|
error("Invalid adapter index");
|
|
|
|
|
2002-08-04 06:37:01 +08:00
|
|
|
#ifdef HAVE_PCAP_FINDALLDEVS
|
2002-08-01 16:52:55 +08:00
|
|
|
/*
|
|
|
|
* If the argument is a number, treat it as
|
|
|
|
* an index into the list of adapters, as
|
|
|
|
* printed by "tcpdump -D".
|
|
|
|
*
|
|
|
|
* This should be OK on UNIX systems, as interfaces
|
|
|
|
* shouldn't have names that begin with digits.
|
|
|
|
* It can be useful on Windows, where more than
|
|
|
|
* one interface can have the same name.
|
|
|
|
*/
|
|
|
|
if ((devnum = atoi(optarg)) != 0) {
|
|
|
|
if (devnum < 0)
|
|
|
|
error("Invalid adapter index");
|
|
|
|
|
|
|
|
if (pcap_findalldevs(&devpointer, ebuf) < 0)
|
|
|
|
error("%s", ebuf);
|
|
|
|
else {
|
|
|
|
for (i = 0; i < devnum-1; i++){
|
|
|
|
devpointer = devpointer->next;
|
|
|
|
if (devpointer == NULL)
|
|
|
|
error("Invalid adapter index");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
device = devpointer->name;
|
|
|
|
break;
|
|
|
|
}
|
2002-08-04 06:37:01 +08:00
|
|
|
#endif /* HAVE_PCAP_FINDALLDEVS */
|
1999-10-08 07:47:09 +08:00
|
|
|
device = optarg;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'l':
|
|
|
|
#ifdef HAVE_SETLINEBUF
|
|
|
|
setlinebuf(stdout);
|
|
|
|
#else
|
|
|
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'n':
|
|
|
|
++nflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'N':
|
|
|
|
++Nflag;
|
|
|
|
break;
|
|
|
|
|
1999-12-14 02:06:13 +08:00
|
|
|
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
|
2002-06-12 01:08:37 +08:00
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'O':
|
|
|
|
Oflag = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'p':
|
|
|
|
++pflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'q':
|
|
|
|
++qflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'r':
|
|
|
|
RFileName = optarg;
|
|
|
|
break;
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
case 'R':
|
|
|
|
Rflag = 0;
|
|
|
|
break;
|
|
|
|
|
2000-04-21 18:32:03 +08:00
|
|
|
case 's': {
|
|
|
|
char *end;
|
|
|
|
|
|
|
|
snaplen = strtol(optarg, &end, 0);
|
|
|
|
if (optarg == end || *end != '\0'
|
|
|
|
|| snaplen < 0 || snaplen > 65535)
|
1999-10-08 07:47:09 +08:00
|
|
|
error("invalid snaplen %s", optarg);
|
2000-04-21 18:32:03 +08:00
|
|
|
else if (snaplen == 0)
|
|
|
|
snaplen = 65535;
|
1999-10-08 07:47:09 +08:00
|
|
|
break;
|
2000-04-21 18:32:03 +08:00
|
|
|
}
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
case 'S':
|
|
|
|
++Sflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 't':
|
|
|
|
--tflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'T':
|
|
|
|
if (strcasecmp(optarg, "vat") == 0)
|
|
|
|
packettype = PT_VAT;
|
|
|
|
else if (strcasecmp(optarg, "wb") == 0)
|
|
|
|
packettype = PT_WB;
|
|
|
|
else if (strcasecmp(optarg, "rpc") == 0)
|
|
|
|
packettype = PT_RPC;
|
|
|
|
else if (strcasecmp(optarg, "rtp") == 0)
|
|
|
|
packettype = PT_RTP;
|
|
|
|
else if (strcasecmp(optarg, "rtcp") == 0)
|
|
|
|
packettype = PT_RTCP;
|
1999-10-18 05:37:10 +08:00
|
|
|
else if (strcasecmp(optarg, "snmp") == 0)
|
|
|
|
packettype = PT_SNMP;
|
2000-04-27 18:05:30 +08:00
|
|
|
else if (strcasecmp(optarg, "cnfp") == 0)
|
|
|
|
packettype = PT_CNFP;
|
1999-10-08 07:47:09 +08:00
|
|
|
else
|
|
|
|
error("unknown packet type `%s'", optarg);
|
|
|
|
break;
|
|
|
|
|
2000-06-01 09:10:31 +08:00
|
|
|
case 'u':
|
|
|
|
++uflag;
|
|
|
|
break;
|
2002-06-12 01:08:37 +08:00
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'v':
|
|
|
|
++vflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'w':
|
|
|
|
WFileName = optarg;
|
|
|
|
break;
|
1999-12-22 23:44:09 +08:00
|
|
|
|
|
|
|
case 'x':
|
|
|
|
++xflag;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'X':
|
2002-06-12 01:08:37 +08:00
|
|
|
++xflag;
|
1999-12-22 23:44:09 +08:00
|
|
|
++Xflag;
|
|
|
|
break;
|
|
|
|
|
2002-09-05 09:31:41 +08:00
|
|
|
#if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
|
1999-10-08 07:47:09 +08:00
|
|
|
case 'Y':
|
|
|
|
{
|
|
|
|
/* Undocumented flag */
|
2002-09-05 09:31:41 +08:00
|
|
|
#ifdef HAVE_PCAP_DEBUG
|
|
|
|
extern int pcap_debug;
|
|
|
|
pcap_debug = 1;
|
|
|
|
#else
|
1999-10-08 07:47:09 +08:00
|
|
|
extern int yydebug;
|
|
|
|
yydebug = 1;
|
2002-09-05 09:31:41 +08:00
|
|
|
#endif
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aflag && nflag)
|
|
|
|
error("-a and -n options are incompatible");
|
|
|
|
|
|
|
|
if (tflag > 0)
|
|
|
|
thiszone = gmt2local(0);
|
|
|
|
|
|
|
|
if (RFileName != NULL) {
|
|
|
|
/*
|
|
|
|
* We don't need network access, so set it back to the user id.
|
|
|
|
* Also, this prevents the user from reading anyone's
|
|
|
|
* trace file.
|
|
|
|
*/
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
1999-10-08 07:47:09 +08:00
|
|
|
setuid(getuid());
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
pd = pcap_open_offline(RFileName, ebuf);
|
|
|
|
if (pd == NULL)
|
|
|
|
error("%s", ebuf);
|
|
|
|
localnet = 0;
|
|
|
|
netmask = 0;
|
|
|
|
if (fflag != 0)
|
|
|
|
error("-f and -r options are incompatible");
|
|
|
|
} else {
|
|
|
|
if (device == NULL) {
|
|
|
|
device = pcap_lookupdev(ebuf);
|
|
|
|
if (device == NULL)
|
|
|
|
error("%s", ebuf);
|
|
|
|
}
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
2002-08-09 21:50:15 +08:00
|
|
|
PrintCapBegins(program_name,device);
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
2001-05-01 00:08:43 +08:00
|
|
|
*ebuf = '\0';
|
1999-10-08 07:47:09 +08:00
|
|
|
pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
|
|
|
|
if (pd == NULL)
|
|
|
|
error("%s", ebuf);
|
2001-05-01 00:08:43 +08:00
|
|
|
else if (*ebuf)
|
|
|
|
warning("%s", ebuf);
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
|
|
|
if(UserBufferSize != 1000000)
|
|
|
|
if(pcap_setbuff(pd, UserBufferSize)==-1){
|
|
|
|
error("%s", pcap_geterr(pd));
|
|
|
|
}
|
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
i = pcap_snapshot(pd);
|
|
|
|
if (snaplen < i) {
|
|
|
|
warning("snaplen raised from %d to %d", snaplen, i);
|
|
|
|
snaplen = i;
|
|
|
|
}
|
|
|
|
if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
|
|
|
|
localnet = 0;
|
|
|
|
netmask = 0;
|
|
|
|
warning("%s", ebuf);
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Let user own process after socket has been opened.
|
|
|
|
*/
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
1999-10-08 07:47:09 +08:00
|
|
|
setuid(getuid());
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|
|
|
|
if (infile)
|
|
|
|
cmdbuf = read_infile(infile);
|
|
|
|
else
|
|
|
|
cmdbuf = copy_argv(&argv[optind]);
|
|
|
|
|
|
|
|
if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
|
|
|
|
error("%s", pcap_geterr(pd));
|
|
|
|
if (dflag) {
|
|
|
|
bpf_dump(&fcode, dflag);
|
2002-08-06 12:36:12 +08:00
|
|
|
pcap_close(pd);
|
1999-10-08 07:47:09 +08:00
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
init_addrtoname(localnet, netmask);
|
|
|
|
|
|
|
|
(void)setsignal(SIGTERM, cleanup);
|
|
|
|
(void)setsignal(SIGINT, cleanup);
|
|
|
|
/* Cooperate with nohup(1) */
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
1999-10-08 07:47:09 +08:00
|
|
|
if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
|
|
|
|
(void)setsignal(SIGHUP, oldhandler);
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
|
|
|
|
if (pcap_setfilter(pd, &fcode) < 0)
|
|
|
|
error("%s", pcap_geterr(pd));
|
|
|
|
if (WFileName) {
|
|
|
|
pcap_dumper_t *p = pcap_dump_open(pd, WFileName);
|
|
|
|
if (p == NULL)
|
|
|
|
error("%s", pcap_geterr(pd));
|
2001-10-03 16:05:47 +08:00
|
|
|
if (Cflag != 0) {
|
2002-11-12 03:54:40 +08:00
|
|
|
printer = dump_packet_and_trunc;
|
2001-12-23 06:12:23 +08:00
|
|
|
dumpinfo.WFileName = WFileName;
|
|
|
|
dumpinfo.pd = pd;
|
|
|
|
dumpinfo.p = p;
|
|
|
|
pcap_userdata = (u_char *)&dumpinfo;
|
2001-10-03 16:05:47 +08:00
|
|
|
} else {
|
2002-11-12 03:54:40 +08:00
|
|
|
printer = dump_packet;
|
2001-10-03 16:05:47 +08:00
|
|
|
pcap_userdata = (u_char *)p;
|
|
|
|
}
|
1999-10-08 07:47:09 +08:00
|
|
|
} else {
|
|
|
|
printer = lookup_printer(pcap_datalink(pd));
|
|
|
|
pcap_userdata = 0;
|
2002-11-12 03:54:40 +08:00
|
|
|
}
|
2001-07-05 06:03:13 +08:00
|
|
|
#ifdef SIGINFO
|
2002-11-12 03:54:40 +08:00
|
|
|
(void)setsignal(SIGINFO, requestinfo);
|
2001-07-05 06:03:13 +08:00
|
|
|
#endif
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
1999-10-08 07:47:09 +08:00
|
|
|
if (RFileName == NULL) {
|
|
|
|
(void)fprintf(stderr, "%s: listening on %s\n",
|
|
|
|
program_name, device);
|
|
|
|
(void)fflush(stderr);
|
|
|
|
}
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
if (pcap_loop(pd, cnt, printer, pcap_userdata) < 0) {
|
|
|
|
(void)fprintf(stderr, "%s: pcap_loop: %s\n",
|
|
|
|
program_name, pcap_geterr(pd));
|
2002-05-16 18:25:58 +08:00
|
|
|
cleanup(0);
|
|
|
|
pcap_close(pd);
|
1999-10-08 07:47:09 +08:00
|
|
|
exit(1);
|
|
|
|
}
|
2001-12-23 06:12:23 +08:00
|
|
|
if (RFileName == NULL)
|
|
|
|
info(1);
|
1999-10-08 07:47:09 +08:00
|
|
|
pcap_close(pd);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* make a clean exit on interrupts */
|
2000-06-18 19:12:06 +08:00
|
|
|
static RETSIGTYPE
|
1999-10-08 07:47:09 +08:00
|
|
|
cleanup(int signo)
|
|
|
|
{
|
|
|
|
|
|
|
|
/* Can't print the summary if reading from a savefile */
|
|
|
|
if (pd != NULL && pcap_file(pd) == NULL) {
|
|
|
|
(void)fflush(stdout);
|
|
|
|
putc('\n', stderr);
|
2001-07-05 06:03:13 +08:00
|
|
|
info(1);
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|
2002-05-16 18:25:58 +08:00
|
|
|
if (signo)
|
|
|
|
exit(0);
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|
|
|
|
|
2001-07-05 06:03:13 +08:00
|
|
|
void
|
|
|
|
info(register int verbose)
|
|
|
|
{
|
|
|
|
struct pcap_stat stat;
|
|
|
|
|
|
|
|
if (pcap_stats(pd, &stat) < 0) {
|
|
|
|
(void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
|
|
|
|
return;
|
|
|
|
}
|
2002-08-01 16:52:55 +08:00
|
|
|
|
2001-07-05 06:03:13 +08:00
|
|
|
if (!verbose)
|
|
|
|
fprintf(stderr, "%s: ", program_name);
|
2002-08-01 16:52:55 +08:00
|
|
|
|
2001-07-05 06:03:13 +08:00
|
|
|
(void)fprintf(stderr, "%d packets received by filter", stat.ps_recv);
|
|
|
|
if (!verbose)
|
|
|
|
fputs(", ", stderr);
|
|
|
|
else
|
|
|
|
putc('\n', stderr);
|
|
|
|
(void)fprintf(stderr, "%d packets dropped by kernel\n", stat.ps_drop);
|
|
|
|
infoprint = 0;
|
|
|
|
}
|
|
|
|
|
2001-10-03 15:35:42 +08:00
|
|
|
static void
|
|
|
|
reverse(char *s)
|
|
|
|
{
|
|
|
|
int i, j, c;
|
|
|
|
|
|
|
|
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
|
|
|
|
c = s[i];
|
|
|
|
s[i] = s[j];
|
|
|
|
s[j] = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
swebitoa(unsigned int n, char *s)
|
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
do {
|
|
|
|
s[i++] = n % 10 + '0';
|
|
|
|
} while ((n /= 10) > 0);
|
|
|
|
|
|
|
|
s[i] = '\0';
|
|
|
|
reverse(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-11-12 03:54:40 +08:00
|
|
|
dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
|
2001-10-03 15:35:42 +08:00
|
|
|
{
|
2002-11-12 03:54:40 +08:00
|
|
|
struct dump_info *dump_info;
|
2001-10-03 15:35:42 +08:00
|
|
|
static uint cnt = 2;
|
|
|
|
char *name;
|
|
|
|
|
2002-11-12 03:54:40 +08:00
|
|
|
++infodelay;
|
|
|
|
|
|
|
|
dump_info = (struct dump_info *)user;
|
2002-06-12 01:08:37 +08:00
|
|
|
|
2001-10-03 15:35:42 +08:00
|
|
|
/*
|
|
|
|
* XXX - this won't prevent capture files from getting
|
|
|
|
* larger than Cflag - the last packet written to the
|
|
|
|
* file could put it over Cflag.
|
|
|
|
*/
|
2002-11-12 03:54:40 +08:00
|
|
|
if (ftell((FILE *)dump_info->p) > Cflag) {
|
|
|
|
name = (char *) malloc(strlen(dump_info->WFileName) + 4);
|
2001-11-15 16:03:41 +08:00
|
|
|
if (name == NULL)
|
2002-11-12 03:54:40 +08:00
|
|
|
error("dump_packet_and_trunc: malloc");
|
|
|
|
strcpy(name, dump_info->WFileName);
|
|
|
|
swebitoa(cnt, name + strlen(dump_info->WFileName));
|
2001-10-03 15:35:42 +08:00
|
|
|
cnt++;
|
2002-11-12 03:54:40 +08:00
|
|
|
pcap_dump_close(dump_info->p);
|
|
|
|
dump_info->p = pcap_dump_open(dump_info->pd, name);
|
2001-10-03 15:35:42 +08:00
|
|
|
free(name);
|
2002-11-12 03:54:40 +08:00
|
|
|
if (dump_info->p == NULL)
|
2001-10-04 00:42:06 +08:00
|
|
|
error("%s", pcap_geterr(pd));
|
2001-10-03 15:35:42 +08:00
|
|
|
}
|
|
|
|
|
2002-11-12 03:54:40 +08:00
|
|
|
pcap_dump((u_char *)dump_info->p, h, sp);
|
|
|
|
|
|
|
|
--infodelay;
|
|
|
|
if (infoprint)
|
|
|
|
info(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
|
|
|
|
{
|
|
|
|
++infodelay;
|
|
|
|
|
|
|
|
pcap_dump(user, h, sp);
|
|
|
|
|
|
|
|
--infodelay;
|
|
|
|
if (infoprint)
|
|
|
|
info(0);
|
2001-10-03 15:35:42 +08:00
|
|
|
}
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
/* Like default_print() but data need not be aligned */
|
|
|
|
void
|
|
|
|
default_print_unaligned(register const u_char *cp, register u_int length)
|
|
|
|
{
|
1999-12-22 14:27:19 +08:00
|
|
|
register u_int i, s;
|
|
|
|
register int nshorts;
|
|
|
|
|
1999-12-22 23:44:09 +08:00
|
|
|
if (Xflag) {
|
|
|
|
ascii_print(cp, length);
|
|
|
|
return;
|
|
|
|
}
|
1999-12-22 14:27:19 +08:00
|
|
|
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);
|
|
|
|
}
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
2002-08-06 12:36:12 +08:00
|
|
|
/*
|
|
|
|
* XXX - there should really be libpcap calls to get the version
|
|
|
|
* number as a string (the string would be generated from #defines
|
|
|
|
* at run time, so that it's not generated from string constants
|
|
|
|
* in the library, as, on many UNIX systems, those constants would
|
|
|
|
* be statically linked into the application executable image, and
|
|
|
|
* would thus reflect the version of libpcap on the system on
|
|
|
|
* which the application was *linked*, not the system on which it's
|
|
|
|
* *running*.
|
|
|
|
*
|
|
|
|
* That routine should be documented, unlike the "version[]"
|
|
|
|
* string, so that UNIX vendors providing their own libpcaps
|
|
|
|
* don't omit it (as a couple of vendors have...).
|
|
|
|
*
|
|
|
|
* Packet.dll should perhaps also export a routine to return the
|
|
|
|
* version number of the Packet.dll code, to supply the
|
|
|
|
* "Wpcap_version" information on Windows.
|
|
|
|
*/
|
2002-08-01 16:52:55 +08:00
|
|
|
char WDversion[]="current-cvs.tcpdump.org";
|
|
|
|
char version[]="current-cvs.tcpdump.org";
|
|
|
|
char pcap_version[]="current-cvs.tcpdump.org";
|
|
|
|
char Wpcap_version[]="3.0 alpha";
|
|
|
|
#endif
|
|
|
|
|
1999-10-08 07:47:09 +08:00
|
|
|
/*
|
|
|
|
* By default, print the packet out in hex.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
default_print(register const u_char *bp, register u_int length)
|
|
|
|
{
|
2000-04-27 18:41:27 +08:00
|
|
|
default_print_unaligned(bp, length);
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|
|
|
|
|
2001-07-05 06:03:13 +08:00
|
|
|
#ifdef SIGINFO
|
2002-09-06 05:25:34 +08:00
|
|
|
RETSIGTYPE requestinfo(int signo _U_)
|
2001-07-05 06:03:13 +08:00
|
|
|
{
|
|
|
|
if (infodelay)
|
|
|
|
++infoprint;
|
|
|
|
else
|
|
|
|
info(0);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2000-07-11 08:49:02 +08:00
|
|
|
static void
|
1999-10-08 07:47:09 +08:00
|
|
|
usage(void)
|
|
|
|
{
|
|
|
|
extern char version[];
|
2002-09-05 09:31:41 +08:00
|
|
|
#if defined(WIN32) || defined(HAVE_PCAP_VERSION)
|
1999-10-08 07:47:09 +08:00
|
|
|
extern char pcap_version[];
|
2002-09-05 09:31:41 +08:00
|
|
|
#else
|
|
|
|
static char pcap_version[] = "unknown";
|
|
|
|
#endif
|
1999-10-08 07:47:09 +08:00
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
|
|
|
(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
|
|
|
|
(void)fprintf(stderr, "WinPcap version %s, based on libpcap version %s\n",Wpcap_version, pcap_version);
|
|
|
|
#else
|
1999-10-08 07:47:09 +08:00
|
|
|
(void)fprintf(stderr, "%s version %s\n", program_name, version);
|
|
|
|
(void)fprintf(stderr, "libpcap version %s\n", pcap_version);
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
(void)fprintf(stderr,
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifdef WIN32
|
2002-08-06 12:36:12 +08:00
|
|
|
"Usage: %s [-aAdDeflnNOpqRStuvxX] [-B size] [-c count] [ -C file_size ]\n", program_name);
|
2002-08-04 07:16:57 +08:00
|
|
|
#else /* WIN32 */
|
|
|
|
#ifdef HAVE_PCAP_FINDALLDEVS
|
2002-08-06 12:36:12 +08:00
|
|
|
"Usage: %s [-aAdDeflnNOpqRStuvxX] [-c count] [ -C file_size ]\n", program_name);
|
2002-08-04 07:16:57 +08:00
|
|
|
#else /* HAVE_PCAP_FINDALLDEVS */
|
2002-08-06 12:36:12 +08:00
|
|
|
"Usage: %s [-aAdeflnNOpqRStuvxX] [-c count] [ -C file_size ]\n", program_name);
|
2002-08-04 07:16:57 +08:00
|
|
|
#endif /* HAVE_PCAP_FINDALLDEVS */
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
1999-10-08 07:47:09 +08:00
|
|
|
(void)fprintf(stderr,
|
2001-10-27 16:23:11 +08:00
|
|
|
"\t\t[ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ]\n");
|
1999-10-08 07:47:09 +08:00
|
|
|
(void)fprintf(stderr,
|
2001-10-27 16:23:11 +08:00
|
|
|
"\t\t[ -T type ] [ -w file ] [ -E algo:secret ] [ expression ]\n");
|
2001-06-25 04:38:52 +08:00
|
|
|
exit(1);
|
1999-10-08 07:47:09 +08:00
|
|
|
}
|