diff options
author | Gerald Combs <gerald@wireshark.org> | 2007-08-02 21:45:27 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2007-08-02 21:45:27 +0000 |
commit | 89a2966ced23693ab513131ef37641ed40787e01 (patch) | |
tree | cca4caad8e2d8be6877bd0cb6820661817c69dfb /capture_opts.c | |
parent | 98309a6c837fb050aeab6106b619701cbb75af9f (diff) |
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
Diffstat (limited to 'capture_opts.c')
-rw-r--r-- | capture_opts.c | 92 |
1 files changed, 92 insertions, 0 deletions
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 <string.h> #include <ctype.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif @@ -68,6 +72,10 @@ #include "capture-pcap-util.h" #include <wiretap/file_util.h> +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) { |