aboutsummaryrefslogtreecommitdiffstats
path: root/capture_opts.c
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2007-08-02 21:45:27 +0000
committerGerald Combs <gerald@wireshark.org>2007-08-02 21:45:27 +0000
commit89a2966ced23693ab513131ef37641ed40787e01 (patch)
treecca4caad8e2d8be6877bd0cb6820661817c69dfb /capture_opts.c
parent98309a6c837fb050aeab6106b619701cbb75af9f (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.c92
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)
{