aboutsummaryrefslogtreecommitdiffstats
path: root/file.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>1999-07-11 08:40:52 +0000
committerGuy Harris <guy@alum.mit.edu>1999-07-11 08:40:52 +0000
commitbb0eaf66b754ce5714d271b625cd9697f033ea7a (patch)
treea61fde061a49712c7f84e7260af72fe4262a1381 /file.c
parentd35862ac07fed2f0a12032102c664665e50257f1 (diff)
When you hit <Return> in the text entry box for the display filter,
apply the filter (if it isn't invalid). Apply the filter by clearing the Clist that shows packet summary lines and scanning through the list of all packets and adding to the Clist those that match the filter. Get rid of "if (dfilter_proto_tree)" test in "load_cap_file()"; "dfilter_proto_tree" is always FALSE, and all the test does is keep us from doing a "gtk_clist_freeze()" of the packet list, and we don't want to do that (we don't want the packet to be updated until we're done reading in the file). Get rid of "dfilter_proto_tree", as it's no longer used. Move the test that checks whether the display filter matches the current packet to "add_packet_to_packet_list()"; this allows us to run "dissect_packet()" only once - if we have a display filter, we generate the summary info *and* the protocol tree in the same call, using the summary info to make the packet list item and the protocol tree when checking the display filter. In "dfilter_compile()", destroy "*p_dfcode" if it's not NULL, so we don't leak memory. svn path=/trunk/; revision=355
Diffstat (limited to 'file.c')
-rw-r--r--file.c108
1 files changed, 72 insertions, 36 deletions
diff --git a/file.c b/file.c
index b140704207..7813e8288a 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.35 1999/07/09 04:18:35 gram Exp $
+ * $Id: file.c,v 1.36 1999/07/11 08:40:52 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -80,9 +80,6 @@ guint cap_input_id, tail_timeout_id;
static guint32 firstsec, firstusec;
static guint32 lastsec, lastusec;
-/* Used when applying a display filter */
-static proto_tree *dfilter_proto_tree = NULL;
-
static void wtap_dispatch_cb(u_char *, const struct wtap_pkthdr *, int,
const u_char *);
@@ -123,22 +120,15 @@ open_cap_file(char *fname, capture_file *cf) {
firstsec = 0, firstusec = 0;
lastsec = 0, lastusec = 0;
- cf->wth = wtap_open_offline(fname);
- if (cf->wth == NULL) {
+ cf->wth = wtap_open_offline(fname);
+ if (cf->wth == NULL) {
- /* XXX - we assume that, because we were able to open it above,
- this must have failed because it's not a capture file in
- a format we can read. */
- return (OPEN_CAP_FILE_UNKNOWN_FORMAT);
- }
+ /* XXX - we assume that, because we were able to open it above,
+ this must have failed because it's not a capture file in
+ a format we can read. */
+ return (OPEN_CAP_FILE_UNKNOWN_FORMAT);
+ }
- if (cf->dfilter) {
- dfilter_compile(cf->dfilter, &cf->dfcode);
-/* if (wtap_offline_filter(cf->wth, cf->dfilter) < 0) {
- simple_dialog(ESD_TYPE_WARN, NULL, "Unable to parse filter string "
- "\"%s\".", cf->dfilter);
- }*/
- }
cf->fh = wtap_file(cf->wth);
cf->cd_t = wtap_file_type(cf->wth);
cf->snap = wtap_snapshot_length(cf->wth);
@@ -192,7 +182,7 @@ load_cap_file(char *fname, capture_file *cf) {
close_cap_file(cf, info_bar, file_ctx);
- /* Initialize protocol-speficic variables */
+ /* Initialize protocol-specific variables */
ncp_init_protocol();
if ((name_ptr = (gchar *) strrchr(fname, '/')) == NULL)
@@ -207,9 +197,6 @@ load_cap_file(char *fname, capture_file *cf) {
err = open_cap_file(fname, cf);
if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {
-
- if (dfilter_proto_tree)
-
gtk_clist_freeze(GTK_CLIST(packet_list));
init_col_widths(cf);
wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf);
@@ -302,7 +289,6 @@ cap_file_input_cb (gpointer data, gint source, GdkInputCondition condition) {
set_menu_sensitivity("/Capture/Start...", TRUE);
set_menu_sensitivity("/Tools/Capture...", TRUE);
set_menu_sensitivity("/Tools/Summary", TRUE);
-
#else
set_menu_sensitivity("<Main>/File/Open...", TRUE);
set_menu_sensitivity("<Main>/File/Close", TRUE);
@@ -380,7 +366,6 @@ tail_cap_file(char *fname, capture_file *cf) {
set_menu_sensitivity("/Capture/Start...", FALSE);
set_menu_sensitivity("/Tools/Capture...", FALSE);
set_menu_sensitivity("/Tools/Summary", FALSE);
-
#else
set_menu_sensitivity("<Main>/File/Open...", FALSE);
set_menu_sensitivity("<Main>/File/Close", FALSE);
@@ -388,8 +373,8 @@ tail_cap_file(char *fname, capture_file *cf) {
set_menu_sensitivity("<Main>/Capture/Start...", FALSE);
set_menu_sensitivity("<Main>/Tools/Capture...", FALSE);
set_menu_sensitivity("<Main>/Tools/Summary", FALSE);
-
#endif
+
cf->fh = fopen(fname, "r");
tail_timeout_id = -1;
cap_input_id = gtk_input_add_full (sync_pipe[0],
@@ -500,6 +485,7 @@ static void
add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf)
{
gint i, col_width, row;
+ proto_tree *protocol_tree;
compute_time_stamps(fdata, cf);
@@ -509,7 +495,16 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf
}
if (check_col(fdata, COL_NUMBER))
col_add_fstr(fdata, COL_NUMBER, "%d", cf->count);
- dissect_packet(buf, fdata, NULL);
+ /* Apply the display filter */
+ if (cf->dfcode) {
+ protocol_tree = proto_tree_create_root();
+ dissect_packet(buf, fdata, protocol_tree);
+ fdata->passed_dfilter = dfilter_apply(cf->dfcode, protocol_tree, cf->pd);
+ }
+ else {
+ dissect_packet(buf, fdata, NULL);
+ fdata->passed_dfilter = TRUE;
+ }
for (i = 0; i < fdata->cinfo->num_cols; i++) {
col_width = gdk_string_width(pl_style->font, fdata->cinfo->col_data[i]);
if (col_width > fdata->cinfo->col_width[i])
@@ -527,7 +522,6 @@ wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
const u_char *buf) {
frame_data *fdata;
capture_file *cf = (capture_file *) user;
- proto_tree *protocol_tree = NULL;
while (gtk_events_pending())
gtk_main_iteration();
@@ -547,17 +541,59 @@ wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
fdata->abs_usecs = phdr->ts.tv_usec;
fdata->cinfo = NULL;
- /* Apply the display filter */
- if (cf->dfcode) {
- protocol_tree = proto_tree_create_root();
- dissect_packet(buf, fdata, protocol_tree);
- fdata->passed_dfilter = dfilter_apply(cf->dfcode, protocol_tree, buf);
- }
- else {
- fdata->passed_dfilter = TRUE;
+ add_packet_to_packet_list(fdata, cf, buf);
+}
+
+static void
+filter_packets_cb(gpointer data, gpointer user_data)
+{
+ frame_data *fd = data;
+ capture_file *cf = user_data;
+
+ cf->cur = fd;
+ cf->count++;
+
+ fseek(cf->fh, fd->file_off, SEEK_SET);
+ fread(cf->pd, sizeof(guint8), fd->cap_len, cf->fh);
+
+ add_packet_to_packet_list(fd, cf, cf->pd);
+}
+
+void
+filter_packets(capture_file *cf)
+{
+ if (cf->dfilter != NULL) {
+ /*
+ * Compile the filter.
+ */
+ if (dfilter_compile(cf->dfilter, &cf->dfcode) != 0) {
+ simple_dialog(ESD_TYPE_WARN, NULL,
+ "Unable to parse filter string \"%s\".", cf->dfilter);
+ return;
+ }
}
- add_packet_to_packet_list(fdata, cf, buf);
+ /* Freeze the packet list while we redo it, so we don't get any
+ screen updates while it happens. */
+ gtk_clist_freeze(GTK_CLIST(packet_list));
+
+ /* Clear it out. */
+ gtk_clist_clear(GTK_CLIST(packet_list));
+
+ /*
+ * Iterate through the list of packets, calling a routine
+ * to run the filter on the packet, see if it matches, and
+ * put it in the display list if so.
+ */
+ firstsec = 0;
+ firstusec = 0;
+ lastsec = 0;
+ lastusec = 0;
+ cf->count = 0;
+ g_list_foreach(cf->plist, filter_packets_cb, cf);
+
+ /* Unfreeze the packet list. */
+ gtk_clist_thaw(GTK_CLIST(packet_list));
}
static void