/* 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>
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"
/* 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;
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);
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);
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 =
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) {
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);
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;
}
}
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;
ld.counts.tcp = 0;
ld.counts.udp = 0;
ld.counts.ospf = 0;
+ ld.counts.gre = 0;
ld.counts.other = 0;
ld.pdh = NULL;
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);
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);
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;
}
}
-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) {
}
}
+
+#endif /* HAVE_LIBPCAP */