X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/6bd49d02af518be352e9e1f34ccaa8d2bde2db09..2cfe2bf4a5bdba199215e4c92129a36271b10a64:/tcpdump.c?ds=sidebyside diff --git a/tcpdump.c b/tcpdump.c index bc07a1ab..1ec0a0ff 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 + * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -21,10 +21,10 @@ #ifndef lint static const char copyright[] = - "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n\ + "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\ The Regents of the University of California. All rights reserved.\n"; static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.152 2000-09-18 05:11:44 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.166 2001-07-04 22:03:13 fenner Exp $ (LBL)"; #endif /* @@ -52,8 +52,6 @@ static const char rcsid[] = #include #include -#include -#include #include "interface.h" #include "addrtoname.h" @@ -83,6 +81,8 @@ char *espsecret = NULL; /* ESP secret key */ int packettype; +int infodelay; +int infoprint; char *program_name; @@ -91,6 +91,9 @@ int32_t thiszone; /* seconds offset from gmt to local time */ /* Forwards */ static RETSIGTYPE cleanup(int); static void usage(void) __attribute__((noreturn)); +#ifdef SIGINFO +RETSIGTYPE requestinfo(int); +#endif /* Length of saved portion of packet. */ int snaplen = DEFAULT_SNAPLEN; @@ -100,45 +103,12 @@ 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[] = { - /* - * 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_RAW - { raw_if_print, DLT_RAW }, -#endif -#ifdef DLT_SLIP_BSDOS - { sl_bsdos_if_print, DLT_SLIP_BSDOS }, -#endif -#ifdef DLT_PPP_BSDOS - { ppp_bsdos_if_print, DLT_PPP_BSDOS }, + { arcnet_if_print, DLT_ARCNET }, + { ether_if_print, DLT_EN10MB }, + { token_if_print, DLT_IEEE802 }, +#ifdef DLT_LANE8023 + { lane_if_print, DLT_LANE8023 }, #endif #ifdef DLT_CIP { cip_if_print, DLT_CIP }, @@ -146,25 +116,38 @@ static struct printer printers[] = { #ifdef DLT_ATM_CLIP { cip_if_print, DLT_ATM_CLIP }, #endif -#ifdef DLT_LANE8023 - { lane_if_print, DLT_LANE8023 }, + { 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 }, +#ifdef DLT_LOOP + { null_if_print, DLT_LOOP }, +#endif + { raw_if_print, DLT_RAW }, + { atm_if_print, DLT_ATM_RFC1483 }, +#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 - - /* - * 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 }, +#ifdef DLT_PPP_ETHER + { pppoe_if_print, DLT_PPP_ETHER }, +#endif +#ifdef DLT_LINUX_SLL + { sll_if_print, DLT_LINUX_SLL }, +#endif +#ifdef DLT_IEEE802_11 + { ieee802_11_if_print, DLT_IEEE802_11}, +#endif +#ifdef DLT_LTALK + { ltalk_if_print, DLT_LTALK }, +#endif { NULL, 0 }, }; @@ -407,9 +390,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); @@ -455,6 +441,9 @@ main(int argc, char **argv) } else { printer = lookup_printer(pcap_datalink(pd)); pcap_userdata = 0; +#ifdef SIGINFO + (void)setsignal(SIGINFO, requestinfo); +#endif } if (RFileName == NULL) { (void)fprintf(stderr, "%s: listening on %s\n", @@ -474,25 +463,36 @@ main(int argc, char **argv) static RETSIGTYPE cleanup(int signo) { - struct pcap_stat stat; /* Can't print the summary if reading from a savefile */ if (pd != NULL && pcap_file(pd) == NULL) { (void)fflush(stdout); putc('\n', stderr); - if (pcap_stats(pd, &stat) < 0) - (void)fprintf(stderr, "pcap_stats: %s\n", - pcap_geterr(pd)); - else { - (void)fprintf(stderr, "%d packets received by filter\n", - stat.ps_recv); - (void)fprintf(stderr, "%d packets dropped by kernel\n", - stat.ps_drop); - } + info(1); } exit(0); } +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; + } + if (!verbose) + fprintf(stderr, "%s: ", program_name); + (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; +} + /* Like default_print() but data need not be aligned */ void default_print_unaligned(register const u_char *cp, register u_int length) @@ -528,6 +528,16 @@ default_print(register const u_char *bp, register u_int length) default_print_unaligned(bp, length); } +#ifdef SIGINFO +RETSIGTYPE requestinfo(int signo) +{ + if (infodelay) + ++infoprint; + else + info(0); +} +#endif + static void usage(void) { @@ -542,5 +552,5 @@ usage(void) "\t\t[ -i interface ] [ -r file ] [ -s snaplen ]\n"); (void)fprintf(stderr, "\t\t[ -T type ] [ -w file ] [ expression ]\n"); - exit(-1); + exit(1); }