Added the ability to create a read-only ethereal, i.e., one that
[obnox/wireshark/wip.git] / capture.c
index da5dfb5f41ac6f11ab21df3a127a457e2dd6cb96..736f28ebf5537e36128698da7bbd6168f88ff61b 100644 (file)
--- a/capture.c
+++ b/capture.c
@@ -1,7 +1,7 @@
 /* capture.c
  * Routines for packet capture windows
  *
- * $Id: capture.c,v 1.24 1999/06/05 01:44:11 guy Exp $
+ * $Id: capture.c,v 1.30 1999/07/09 04:18:32 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 # include "config.h"
 #endif
 
+#ifdef HAVE_LIBPCAP
+
 #ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
 
 #include <gtk/gtk.h>
-#include <pcap.h>
-
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -81,10 +81,6 @@ extern int sync_mode;
 extern int sigusr2_received;
 extern int quit_after_cap;
 
-/* File selection data keys */
-#define E_CAP_PREP_FS_KEY "cap_prep_fs"
-#define E_CAP_PREP_TE_KEY "cap_prep_te"
-
 /* Capture callback data keys */
 #define E_CAP_IFACE_KEY "cap_iface"
 #define E_CAP_FILT_KEY  "cap_filter"
@@ -95,7 +91,14 @@ extern int quit_after_cap;
 /* Capture filter key */
 #define E_CAP_FILT_TE_KEY "cap_filt_te"
 
-GList *
+static void capture_prep_ok_cb(GtkWidget *, gpointer);
+static void capture_prep_close_cb(GtkWidget *, gpointer);
+static float pct(gint, gint);
+static void capture_stop_cb(GtkWidget *, gpointer);
+static void capture_pcap_cb(u_char *, const struct pcap_pkthdr *,
+  const u_char *);
+
+static GList *
 get_interface_list() {
   GList  *il = NULL;
   struct  ifreq *ifr, *last;
@@ -262,7 +265,7 @@ capture_prep_cb(GtkWidget *w, gpointer d) {
   gtk_widget_show(bbox);
 
   ok_bt = gtk_button_new_with_label ("OK");
-  gtk_signal_connect_object(GTK_OBJECT(ok_bt), "clicked",
+  gtk_signal_connect(GTK_OBJECT(ok_bt), "clicked",
     GTK_SIGNAL_FUNC(capture_prep_ok_cb), GTK_OBJECT(cap_open_w));
   GTK_WIDGET_SET_FLAGS(ok_bt, GTK_CAN_DEFAULT);
   gtk_box_pack_start (GTK_BOX (bbox), ok_bt, TRUE, TRUE, 0);
@@ -270,7 +273,7 @@ capture_prep_cb(GtkWidget *w, gpointer d) {
   gtk_widget_show(ok_bt);
 
   cancel_bt = gtk_button_new_with_label ("Cancel");
-  gtk_signal_connect_object(GTK_OBJECT(cancel_bt), "clicked",
+  gtk_signal_connect(GTK_OBJECT(cancel_bt), "clicked",
     GTK_SIGNAL_FUNC(capture_prep_close_cb), GTK_OBJECT(cap_open_w));
   GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT);
   gtk_box_pack_start (GTK_BOX (bbox), cancel_bt, TRUE, TRUE, 0);
@@ -285,58 +288,16 @@ capture_prep_cb(GtkWidget *w, gpointer d) {
   gtk_widget_show(cap_open_w);
 }
 
-void
-capture_prep_file_cb(GtkWidget *w, gpointer te) {
-  GtkWidget *fs;
-
-  fs = gtk_file_selection_new ("Ethereal: Open Save File");
-
-  gtk_object_set_data(GTK_OBJECT(w), E_CAP_PREP_FS_KEY, fs);
-  gtk_object_set_data(GTK_OBJECT(w), E_CAP_PREP_TE_KEY, (GtkWidget *) te);
-  
-  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button),
-    "clicked", (GtkSignalFunc) cap_prep_fs_ok_cb, w);
-
-  /* Connect the cancel_button to destroy the widget */
-  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->cancel_button),
-    "clicked", (GtkSignalFunc) cap_prep_fs_cancel_cb, w);
-  
-  gtk_widget_show(fs);
-}
-
-void
-cap_prep_fs_ok_cb(GtkWidget *w, gpointer data) {
-  GtkWidget *fs, *te;
-  
-  fs = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_PREP_FS_KEY);
-  te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_PREP_TE_KEY);
-
-  gtk_entry_set_text(GTK_ENTRY(te),
-    gtk_file_selection_get_filename (GTK_FILE_SELECTION(fs)));
-  cap_prep_fs_cancel_cb(w, data);
-}
-
-void
-cap_prep_fs_cancel_cb(GtkWidget *w, gpointer data) {
-  GtkWidget *fs;
-  
-  fs = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_PREP_FS_KEY);
-
-  gtk_widget_destroy(fs);
-}  
-
-void
-capture_prep_ok_cb(GtkWidget *w, gpointer data) {
+static void
+capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) {
   GtkWidget *if_cb, *filter_te, *count_cb, *snap_sb;
 
   gchar *filter_text;
-#ifdef GTK_HAVE_FEATURES_1_1_0
-  data = w;
-#endif
-  if_cb     = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_IFACE_KEY);
-  filter_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_FILT_KEY);
-  count_cb  = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_COUNT_KEY);
-  snap_sb   = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_SNAP_KEY);
+
+  if_cb     = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_IFACE_KEY);
+  filter_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILT_KEY);
+  count_cb  = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_COUNT_KEY);
+  snap_sb   = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SNAP_KEY);
 
   if (cf.iface) g_free(cf.iface);
   cf.iface =
@@ -354,7 +315,7 @@ capture_prep_ok_cb(GtkWidget *w, gpointer data) {
   else if (cf.snap < MIN_PACKET_SIZE)
     cf.snap = MIN_PACKET_SIZE;
 
-  gtk_widget_destroy(GTK_WIDGET(data));
+  gtk_widget_destroy(GTK_WIDGET(parent_w));
 
   /* Choose a random name for the capture buffer */
   if (cf.save_file && !cf.user_saved) {
@@ -368,6 +329,7 @@ capture_prep_ok_cb(GtkWidget *w, gpointer data) {
     int  fork_child;
     char ssnap[24];
     char scount[24];   /* need a constant for len of numbers */
+    int err;
 
     sprintf(ssnap,"%d",cf.snap); /* in liu of itoa */
     sprintf(scount,"%d",cf.count);
@@ -412,8 +374,13 @@ capture_prep_ok_cb(GtkWidget *w, gpointer data) {
           if (kill(fork_child, 0) == -1 && errno == ESRCH) 
             break;
         }
-        if (sigusr2_received) 
-          tail_cap_file(cf.save_file, &cf);
+        if (sigusr2_received) {
+          err = tail_cap_file(cf.save_file, &cf);
+          if (err != 0) {
+            simple_dialog(ESD_TYPE_WARN, NULL,
+                       file_open_error_message(err, FALSE), cf.save_file);
+          }
+        }
         sigusr2_received = FALSE;
        }
     }
@@ -422,25 +389,23 @@ capture_prep_ok_cb(GtkWidget *w, gpointer data) {
     capture();
 }
 
-void
-capture_prep_close_cb(GtkWidget *w, gpointer win) {
-
-#ifdef GTK_HAVE_FEATURES_1_1_0
-  win = w;
-#endif
-  gtk_grab_remove(GTK_WIDGET(win));
-  gtk_widget_destroy(GTK_WIDGET(win));
+static void
+capture_prep_close_cb(GtkWidget *close_bt, gpointer parent_w)
+{
+  gtk_grab_remove(GTK_WIDGET(parent_w));
+  gtk_widget_destroy(GTK_WIDGET(parent_w));
 }
 
 void
 capture(void) {
   GtkWidget  *cap_w, *main_vb, *count_lb, *tcp_lb, *udp_lb, 
-             *ospf_lb, *other_lb, *stop_bt;
+             *ospf_lb, *gre_lb, *other_lb, *stop_bt;
   pcap_t     *pch;
   gchar       err_str[PCAP_ERRBUF_SIZE], label_str[32];
   loop_data   ld;
   bpf_u_int32 netnum, netmask;
   time_t      upd_time, cur_time;
+  int         err;
   
   ld.go           = TRUE;
   ld.counts.total = 0;
@@ -451,6 +416,7 @@ capture(void) {
   ld.counts.tcp   = 0;
   ld.counts.udp   = 0;
   ld.counts.ospf  = 0;
+  ld.counts.gre   = 0;
   ld.counts.other = 0;
   ld.pdh          = NULL;
 
@@ -510,6 +476,10 @@ capture(void) {
     gtk_box_pack_start(GTK_BOX(main_vb), ospf_lb, FALSE, FALSE, 3);
     gtk_widget_show(ospf_lb);
 
+    gre_lb = gtk_label_new("GRE: 0 (0.0%)");
+    gtk_box_pack_start(GTK_BOX(main_vb), gre_lb, FALSE, FALSE, 3);
+    gtk_widget_show(gre_lb);
+
     other_lb = gtk_label_new("Other: 0 (0.0%)");
     gtk_box_pack_start(GTK_BOX(main_vb), other_lb, FALSE, FALSE, 3);
     gtk_widget_show(other_lb);
@@ -553,6 +523,10 @@ capture(void) {
          pct(ld.counts.ospf, ld.counts.total));
         gtk_label_set(GTK_LABEL(ospf_lb), label_str);
 
+        sprintf(label_str, "GRE: %d (%.1f%%)", ld.counts.gre,
+         pct(ld.counts.gre, ld.counts.total));
+        gtk_label_set(GTK_LABEL(gre_lb), label_str);
+
         sprintf(label_str, "Other: %d (%.1f%%)", ld.counts.other,
           pct(ld.counts.other, ld.counts.total));
         gtk_label_set(GTK_LABEL(other_lb), label_str);
@@ -577,17 +551,25 @@ capture(void) {
     gtk_exit(0);
   }
 
-  if (cf.save_file) load_cap_file(cf.save_file, &cf);
+  if (cf.save_file) {
+    err = load_cap_file(cf.save_file, &cf);
+    if (err != 0) {
+      simple_dialog(ESD_TYPE_WARN, NULL,
+                       file_open_error_message(err, FALSE), cf.save_file);
+    }
+  }
 #ifdef USE_ITEM
-    set_menu_sensitivity("/File/Save", TRUE);
-    set_menu_sensitivity("/File/Save as", FALSE);
+  set_menu_sensitivity("/File/Save", TRUE);
+  set_menu_sensitivity("/File/Save as", FALSE);
+  set_menu_sensitivity("/Tools/Summary", TRUE);
 #else
-    set_menu_sensitivity("<Main>/File/Save", TRUE);
-    set_menu_sensitivity("<Main>/File/Save as", FALSE);
+  set_menu_sensitivity("<Main>/File/Save", TRUE);
+  set_menu_sensitivity("<Main>/File/Save as", FALSE);
+  set_menu_sensitivity("<Main>/Tools/Summary", TRUE);
 #endif
 }
 
-float
+static float
 pct(gint num, gint denom) {
   if (denom) {
     return (float) num * 100.0 / (float) denom;
@@ -596,14 +578,14 @@ pct(gint num, gint denom) {
   }
 }
 
-void
+static void
 capture_stop_cb(GtkWidget *w, gpointer data) {
   loop_data *ld = (loop_data *) data;
   
   ld->go = FALSE;
 }
 
-void
+static void
 capture_pcap_cb(u_char *user, const struct pcap_pkthdr *phdr,
   const u_char *pd) {
   
@@ -656,3 +638,5 @@ capture_pcap_cb(u_char *user, const struct pcap_pkthdr *phdr,
   }
   
 }
+
+#endif /* HAVE_LIBPCAP */