From: Francois-Xavier Le Bail Date: Wed, 26 Feb 2020 15:55:21 +0000 (+0100) Subject: Print an optional packet count on stderr instead of printing packets X-Git-Tag: tcpdump-4.99-bp~511 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/4d810e062dc6bdfd75f7c70a24c90eeaf3094636?hp=a3bbf1e278bcfd4479f06b499d3c993adecda69f Print an optional packet count on stderr instead of printing packets This change add an option to print only on stderr the packet count when reading capture file(s) instead of parsing/printing the packets. If a filter is specified on the command line, tcpdump counts only packets that were matched by the filter expression. The option name is '--count'. --- diff --git a/tcpdump.1.in b/tcpdump.1.in index ccecde6a..39bfe22b 100644 --- a/tcpdump.1.in +++ b/tcpdump.1.in @@ -39,6 +39,9 @@ tcpdump \- dump traffic on a network .I count ] [ +.B \-\-count +] +[ .B \-C .I file_size ] @@ -242,6 +245,12 @@ units of KiB (1024 bytes). .BI \-c " count" Exit after receiving \fIcount\fP packets. .TP +.BI \-\-count +Print only on stderr the packet count when reading capture file(s) instead +of parsing/printing the packets. If a filter is specified on the command +line, \fItcpdump\fP counts only packets that were matched by the filter +expression. +.TP .BI \-C " file_size" Before writing a raw packet to a savefile, check whether the file is currently larger than \fIfile_size\fP and, if so, close the current diff --git a/tcpdump.c b/tcpdump.c index cd277042..2f126391 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -220,6 +220,7 @@ static int timeout = 1000; /* default timeout = 1000 ms = 1 s */ #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE static int immediate_mode; #endif +static int count_mode; static int infodelay; static int infoprint; @@ -690,6 +691,7 @@ show_remote_devices_and_exit(void) #define OPTION_TSTAMP_MICRO 133 #define OPTION_TSTAMP_NANO 134 #define OPTION_FP_TYPE 135 +#define OPTION_COUNT 136 static const struct option longopts[] = { #if defined(HAVE_PCAP_CREATE) || defined(_WIN32) @@ -733,6 +735,7 @@ static const struct option longopts[] = { { "debug-filter-parser", no_argument, NULL, 'Y' }, #endif { "relinquish-privileges", required_argument, NULL, 'Z' }, + { "count", no_argument, NULL, OPTION_COUNT }, { "fp-type", no_argument, NULL, OPTION_FP_TYPE }, { "number", no_argument, NULL, '#' }, { "print", no_argument, NULL, OPTION_PRINT }, @@ -1908,6 +1911,10 @@ main(int argc, char **argv) float_type_check(0x4e93312d); return 0; + case OPTION_COUNT: + count_mode = 1; + break; + default: print_usage(); exit_tcpdump(S_ERR_HOST_PROGRAM); @@ -2595,6 +2602,10 @@ DIAG_ON_CLANG(assign-enum) } while (ret != NULL); + if (count_mode && RFileName != NULL) + fprintf(stderr, "%u packet%s\n", packets_captured, + PLURAL_SUFFIX(packets_captured)); + free(cmdbuf); pcap_freecode(&fcode); exit_tcpdump(status == -1 ? 1 : 0); @@ -3027,7 +3038,8 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) ++infodelay; - pretty_print_packet((netdissect_options *)user, h, sp, packets_captured); + if (!count_mode) + pretty_print_packet((netdissect_options *)user, h, sp, packets_captured); --infodelay; if (infoprint) @@ -3125,7 +3137,7 @@ print_usage(void) { print_version(); (void)fprintf(stderr, -"Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqStu" U_FLAG "vxX#]" B_FLAG_USAGE " [ -c count ]\n", program_name); +"Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqStu" U_FLAG "vxX#]" B_FLAG_USAGE " [ -c count ] [--count]\n", program_name); (void)fprintf(stderr, "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n"); (void)fprintf(stderr,