capture_opts_print_statistics() has nothing to do with capture options
authorGuy Harris <guy@alum.mit.edu>
Fri, 20 Jun 2008 00:09:47 +0000 (00:09 -0000)
committerGuy Harris <guy@alum.mit.edu>
Fri, 20 Jun 2008 00:09:47 +0000 (00:09 -0000)
setting, and is used only in dumpcap.c, and needs to get at information
set by dumpcap's signal handlers so it can respond to ^C; move it to
dumpcap.c, rename it print_statistics_loop(), and make it set ld.go to
TRUE before looping and loop only as long as ld.go is TRUE.

That fixes bug 2592 (at least on Mac OS X, and probably on other UN*Xes;
it should fix it on Windows as well).

svn path=/trunk/; revision=25492

capture_opts.c
capture_opts.h
dumpcap.c

index b75cf5affe659df403025960b5c73ce40b0caed1..a7fbfdad8a96244dc8696f8afa5f0c0c7b703bd3 100644 (file)
 #include "capture-pcap-util.h"
 #include <wsutil/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);
 
 
@@ -705,94 +700,6 @@ 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;
-#ifdef HAVE_PCAP_OPEN
-        pch = pcap_open(if_info->name, MIN_PACKET_SIZE, 0, 0, NULL, errbuf);
-#else
-        pch = pcap_open_live(if_info->name, MIN_PACKET_SIZE, 0, 0, errbuf);
-#endif
-
-        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)
 {
index 7b91c0947371129ae6de7b78c4676ff4072b57fd..00a65237383169950f363f9986f864304b8532a8 100644 (file)
@@ -175,10 +175,6 @@ capture_opts_list_link_layer_types(capture_options *capture_opts, gboolean machi
 extern int
 capture_opts_list_interfaces(gboolean machine_readable);
 
-/* print interface statistics */
-extern int
-capture_opts_print_statistics(gboolean machine_readable);
-
 /* trim the snaplen entry */
 extern void
 capture_opts_trim_snaplen(capture_options *capture_opts, int snaplen_min);
index 43a74ac7e1a3bd9ee2a6a8d43d9e11e02d86fc5c..a27c3b0172df4fee65b13d09fa374058960c674a 100644 (file)
--- a/dumpcap.c
+++ b/dumpcap.c
@@ -395,6 +395,100 @@ cmdarg_err_cont(const char *fmt, ...)
   }
 }
 
+typedef struct {
+    char *name;
+    pcap_t *pch;
+} if_stat_t;
+
+/* Print the number of packets captured for each interface until we're killed. */
+static int
+print_statistics_loop(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;
+#ifdef HAVE_PCAP_OPEN
+        pch = pcap_open(if_info->name, MIN_PACKET_SIZE, 0, 0, NULL, errbuf);
+#else
+        pch = pcap_open_live(if_info->name, MIN_PACKET_SIZE, 0, 0, errbuf);
+#endif
+
+        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");
+    }
+
+    ld.go = TRUE;
+    while (ld.go) {
+        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;
+}
+
 
 #ifdef _WIN32
 static BOOL WINAPI
@@ -2612,7 +2706,7 @@ main(int argc, char *argv[])
     status = capture_opts_list_link_layer_types(capture_opts, machine_readable);
     exit_main(status);
   } else if (print_statistics) {
-    status = capture_opts_print_statistics(machine_readable);
+    status = print_statistics_loop(machine_readable);
     exit_main(status);
   }