From 89a2966ced23693ab513131ef37641ed40787e01 Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Thu, 2 Aug 2007 21:45:27 +0000 Subject: Add a "-S" flag to dumpcap, which prints out interface statistics. Use this in the GUI rather than calling pcap_stats() directly. This gets rid of the last pcap_open_live() call in the GUI code. Update README.packaging. svn path=/trunk/; revision=22443 --- capture_opts.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) (limited to 'capture_opts.c') diff --git a/capture_opts.c b/capture_opts.c index 15ed92bb4a..c3ecd6a20a 100644 --- a/capture_opts.c +++ b/capture_opts.c @@ -31,6 +31,10 @@ #include #include +#ifdef HAVE_UNISTD_H +#include +#endif + #ifdef HAVE_SYS_TYPES_H # include #endif @@ -68,6 +72,10 @@ #include "capture-pcap-util.h" #include +typedef struct { + char *name; + pcap_t *pch; +} if_stat_t; static gboolean capture_opts_output_to_pipe(const char *save_file, gboolean *is_pipe); @@ -558,6 +566,90 @@ capture_opts_list_interfaces(gboolean machine_readable) return 0; } +/* Print the number of packets captured for each interface until we're killed. */ +int +capture_opts_print_statistics(gboolean machine_readable) +{ + GList *if_list, *if_entry, *stat_list = NULL, *stat_entry; + if_info_t *if_info; + if_stat_t *if_stat; + int err; + gchar *err_str; + pcap_t *pch; + char errbuf[PCAP_ERRBUF_SIZE]; + struct pcap_stat ps; + + if_list = get_interface_list(&err, &err_str); + if (if_list == NULL) { + switch (err) { + case CANT_GET_INTERFACE_LIST: + cmdarg_err("%s", err_str); + g_free(err_str); + break; + + case NO_INTERFACES_FOUND: + cmdarg_err("There are no interfaces on which a capture can be done"); + break; + } + return err; + } + + for (if_entry = g_list_first(if_list); if_entry != NULL; if_entry = g_list_next(if_entry)) { + if_info = if_entry->data; + pch = pcap_open_live(if_info->name, MIN_PACKET_SIZE, 0, 0, errbuf); + + if (pch) { + if_stat = g_malloc(sizeof(if_stat_t)); + if_stat->name = g_strdup(if_info->name); + if_stat->pch = pch; + stat_list = g_list_append(stat_list, if_stat); + } + } + + if (!stat_list) { + cmdarg_err("There are no interfaces on which a capture can be done"); + return 2; + } + + if (!machine_readable) { + printf("%-15s %10s %10s\n", "Interface", "Received", + "Dropped"); + } + + while (1) { /* XXX - Add signal handling? */ + for (stat_entry = g_list_first(stat_list); stat_entry != NULL; stat_entry = g_list_next(stat_entry)) { + if_stat = stat_entry->data; + pcap_stats(if_stat->pch, &ps); + + if (!machine_readable) { + printf("%-15s %10d %10d\n", if_stat->name, + ps.ps_recv, ps.ps_drop); + } else { + printf("%s\t%d\t%d\n", if_stat->name, + ps.ps_recv, ps.ps_drop); + fflush(stdout); + } + } +#ifdef _WIN32 + Sleep(1 * 1000); +#else + sleep(1); +#endif + } + + /* XXX - Not reached. Should we look for 'q' in stdin? */ + for (stat_entry = g_list_first(stat_list); stat_entry != NULL; stat_entry = g_list_next(stat_entry)) { + if_stat = stat_entry->data; + pcap_close(if_stat->pch); + g_free(if_stat->name); + g_free(if_stat); + } + g_list_free(stat_list); + free_interface_list(if_list); + + return 0; +} + void capture_opts_trim_snaplen(capture_options *capture_opts, int snaplen_min) { -- cgit v1.2.3