From 3b9013d39358c54611c8ba82595c3a4ff2f596eb Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Mon, 11 Oct 1999 06:39:26 +0000 Subject: [PATCH] When a new display filter is to be applied, don't set "cf.dfilter" or "cf.dfcode" if the new filter doesn't compile, because the filter currently in effect will be the one that was last applied - just free up the text of the new filter, and whatever memory was allocated for the new filter code. This means we allocate a new dfilter when a new filter is to be applied, rather than recycling stuff from the old filter, as we want the old filter code to remain around if the new filter doesn't compile. This means that "cf.dfilter" and "cf.dfcode" will be null if there's no filter in effect. svn path=/trunk/; revision=803 --- colors.c | 23 +++----- dfilter-grammar.y | 24 +------- dfilter-int.h | 3 +- dfilter.c | 139 ++++++++++++++-------------------------------- dfilter.h | 10 +--- file.c | 62 ++++++++++++++++----- file.h | 8 +-- gtk/file_dlg.c | 7 +-- gtk/main.c | 36 ++++-------- summary.c | 6 +- 10 files changed, 123 insertions(+), 195 deletions(-) diff --git a/colors.c b/colors.c index 323b7dc513..7cd4074e61 100644 --- a/colors.c +++ b/colors.c @@ -1,7 +1,7 @@ /* colors.c * Definitions for color structures and routines * - * $Id: colors.c,v 1.12 1999/10/07 22:50:44 guy Exp $ + * $Id: colors.c,v 1.13 1999/10/11 06:39:02 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -116,9 +116,8 @@ colors_init(capture_file *cf) new_color_filter(cf->colors, default_colors[i].proto, default_colors[i].proto); color_filter(cf,i)->bg_color = color; - color_filter(cf,i)->c_colorfilter = dfilter_new(); - if(dfilter_compile((color_filter(cf,i)->c_colorfilter), - default_colors[i].proto) != 0){ + color_filter(cf,i)->c_colorfilter = dfilter_compile(default_colors[i].proto); + if(color_filter(cf,i)->c_colorfilter == NULL){ simple_dialog(ESD_TYPE_WARN, NULL, "Cannot compile default filter %s.\n%s", default_colors[i].proto, dfilter_error_msg); @@ -244,14 +243,11 @@ read_filters(capture_file *cf) name, filter, &bg_r, &bg_g, &bg_b, &fg_r, &fg_g, &fg_b) == 8){ /* we got a filter */ - /* test the dfilter before putting it into the list of color dfilters */ - /*if(dfilter_compile((color_filter(cf,i)->c_colorfilter),filter) != 0){*/ - temp_dfilter = dfilter_new(); - if(dfilter_compile(temp_dfilter, filter) != 0){ + temp_dfilter = dfilter_compile(filter); + if(temp_dfilter == NULL){ simple_dialog(ESD_TYPE_WARN, NULL, "Could not compile filter %s from saved filters because\n%s", name, dfilter_error_msg); - dfilter_destroy(temp_dfilter); continue; } new_color_filter(cf->colors, name, filter); @@ -493,7 +489,7 @@ color_ok_cb (GtkButton *button, /* colorize list */ - filter_packets(&cf); + colorize_packets(&cf); gtk_container_remove(GTK_CONTAINER(GTK_WIDGET(cf.colors->color_filters)->parent), cf.colors->color_filters); gtk_widget_destroy(dialog); @@ -507,7 +503,7 @@ color_apply_cb (GtkButton *button, { capture_file *cf; cf = (capture_file *)user_data; - filter_packets(cf); + colorize_packets(cf); } /* Exit dialog and do not process list */ @@ -593,12 +589,11 @@ colorize_ok_cb (GtkButton *button, - compiled_filter = dfilter_new(); + compiled_filter = dfilter_compile(filter_text); - if( dfilter_compile( compiled_filter, filter_text) != 0 ){ + if(compiled_filter == NULL ){ simple_dialog(ESD_TYPE_WARN, NULL, "Filter \"%s\" did not compile correctly.\n" " Please try again. Filter unchanged.\n%s\n", filter_name,dfilter_error_msg); - dfilter_destroy(compiled_filter); } else { if( color_filter(&cf, cf.colors->row_selected)->c_colorfilter != NULL) diff --git a/dfilter-grammar.y b/dfilter-grammar.y index 0677cb5e13..0f298bd2a0 100644 --- a/dfilter-grammar.y +++ b/dfilter-grammar.y @@ -3,7 +3,7 @@ /* dfilter-grammar.y * Parser for display filters * - * $Id: dfilter-grammar.y,v 1.21 1999/10/11 03:03:10 guy Exp $ + * $Id: dfilter-grammar.y,v 1.22 1999/10/11 06:39:04 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -94,14 +94,7 @@ static int ether_str_to_guint8_array(const char *s, guint8 *mac); /* This is the dfilter we're currently processing. It's how * dfilter_compile communicates with us. */ -dfilter *global_df = NULL;; - -/* list of GNodes allocated during parsing. If the parsing fails, we'll - * use this list to free all the GNodes. If the parsing succeeds, we'll - * just clear this list since dfilter_clear_filter() will take care of - * freeing the GNodes when they're no longer needed. - */ -GSList *gnode_slist = NULL; +dfilter *global_df = NULL; %} @@ -369,7 +362,6 @@ dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2) g_node_append(gnode_root, n1); g_node_append(gnode_root, n2); - gnode_slist = g_slist_append(gnode_slist, gnode_root); return gnode_root; } @@ -389,7 +381,6 @@ dfilter_mknode_unary(int operand, GNode *n2) gnode_root = g_node_new(node_root); g_node_append(gnode_root, n2); - gnode_slist = g_slist_append(gnode_slist, gnode_root); return gnode_root; } @@ -408,7 +399,6 @@ dfilter_mknode_numeric_variable(gint id) node->value.variable = id; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -426,7 +416,6 @@ dfilter_mknode_ether_variable(gint id) node->value.variable = id; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -444,7 +433,6 @@ dfilter_mknode_ipxnet_variable(gint id) node->value.variable = id; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -462,7 +450,6 @@ dfilter_mknode_ipv4_variable(gint id) node->value.variable = id; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -482,7 +469,6 @@ dfilter_mknode_bytes_variable(gint id, gint offset, guint length) node->length = length; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -500,7 +486,6 @@ dfilter_mknode_numeric_value(guint32 val) node->value.numeric = val; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -528,7 +513,6 @@ dfilter_mknode_ether_value(gchar *byte_string) } gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -546,7 +530,6 @@ dfilter_mknode_ipxnet_value(guint32 ipx_net_val) node->value.numeric = ipx_net_val; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -570,7 +553,6 @@ dfilter_mknode_ipv4_value(char *host) node->value.numeric = htonl(node->value.numeric); gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -590,7 +572,6 @@ dfilter_mknode_bytes_value(GByteArray *barray) node->length = barray->len; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } @@ -620,7 +601,6 @@ dfilter_mknode_existence(gint id) node->value.variable = id; gnode = g_node_new(node); - gnode_slist = g_slist_append(gnode_slist, gnode); return gnode; } diff --git a/dfilter-int.h b/dfilter-int.h index 213d9ccba6..e447701d2e 100644 --- a/dfilter-int.h +++ b/dfilter-int.h @@ -2,7 +2,7 @@ * Definitions for routines common to multiple modules in the display * filter code, but not used outside that code. * - * $Id: dfilter-int.h,v 1.7 1999/10/11 03:03:11 guy Exp $ + * $Id: dfilter-int.h,v 1.8 1999/10/11 06:39:04 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -34,7 +34,6 @@ void dfilter_scanner_cleanup(void); /* in dfilter-grammar.y */ extern dfilter *global_df; -extern GSList *gnode_slist; /* Here we provide interfaces to make our scanner act and look like lex */ int dfilter_lex(void); diff --git a/dfilter.c b/dfilter.c index 5d162ccce4..9efbff124c 100644 --- a/dfilter.c +++ b/dfilter.c @@ -1,7 +1,7 @@ /* dfilter.c * Routines for display filters * - * $Id: dfilter.c,v 1.25 1999/10/11 03:03:10 guy Exp $ + * $Id: dfilter.c,v 1.26 1999/10/11 06:39:05 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -94,8 +94,6 @@ static GArray* get_values_from_ptree(dfilter_node *dnode, proto_tree *ptree, con static GArray* get_values_from_dfilter(dfilter_node *dnode, GNode *gnode); static gboolean check_existence_in_ptree(dfilter_node *dnode, proto_tree *ptree); static void clear_byte_array(gpointer data, gpointer user_data); -static void unlink_gnode_children(gpointer gnode_ptr, gpointer user_data); -static void destroy_gnode(gpointer gnode_ptr, gpointer user_data); /* this is not so pretty. I need my own g_array "function" (macro) to * retreive the pointer to the data stored in an array cell. I need this @@ -135,28 +133,28 @@ dfilter_cleanup(void) * display filter each time, without having to clear any memory used, since * dfilter_compile will take care of that automatically. * - * Returns 0 on success, non-zero on failure. + * Returns a pointer to a newly-allocated dfilter strucutre on success, + * NULL on failure. * If a failure, dfilter_error_msg points to an appropriate error message. * This error message is a global string, so another invocation of * dfilter_compile will clear it. If the caller needs is stored, he * needs to g_strdup it himself. */ -int -dfilter_compile(dfilter *df, gchar *dfilter_text) +dfilter* +dfilter_compile(gchar *dfilter_text) { + dfilter *df; int retval; g_assert(dfilter_text != NULL); - dfilter_clear_filter(df); - df->dftext = g_strdup(dfilter_text); + df = dfilter_new(); - /* tell the scanner to use this string as input */ - dfilter_scanner_text(df->dftext); + /* tell the scanner to use the filter string as input */ + dfilter_scanner_text(dfilter_text); /* Assign global variable so dfilter_parse knows which dfilter we're - * talking about. Reset the global error message. We don't have to set - * gnode_slist since it will always be NULL by the time we get here. + * talking about. Reset the global error message. */ global_df = df; dfilter_error_msg = NULL; @@ -183,42 +181,15 @@ dfilter_compile(dfilter *df, gchar *dfilter_text) } } - /* Clear the list of allocated nodes */ - if (gnode_slist) { - g_slist_free(gnode_slist); - gnode_slist = NULL; + /* Set global_df to NULL just to be tidy. */ + global_df = NULL; + + if (retval == 0) + return df; + else { + dfilter_destroy(df); + return NULL; } - - return retval; -} - -/* clear the current filter, w/o clearing memchunk area which is where we'll - * put new nodes in a future filter */ -void -dfilter_clear_filter(dfilter *df) -{ - if (!df) - return; - - if (df->dftext) - g_free(df->dftext); - - if (df->dftree != NULL) - g_node_destroy(df->dftree); - - /* clear the memory that the tree was using for nodes */ - if (df->node_memchunk) - g_mem_chunk_reset(df->node_memchunk); - - /* clear the memory that the tree was using for byte arrays */ - if (df->list_of_byte_arrays) { - g_slist_foreach(df->list_of_byte_arrays, clear_byte_array, NULL); - g_slist_free(df->list_of_byte_arrays); - } - - df->dftext = NULL; - df->dftree = NULL; - df->list_of_byte_arrays = NULL; } /* Allocates new dfilter, initializes values, and returns pointer to dfilter */ @@ -229,7 +200,6 @@ dfilter_new(void) df = g_malloc(sizeof(dfilter)); - df->dftext = NULL; df->dftree = NULL; df->node_memchunk = g_mem_chunk_new("df->node_memchunk", sizeof(dfilter_node), 20 * sizeof(dfilter_node), G_ALLOC_ONLY); @@ -245,7 +215,21 @@ dfilter_destroy(dfilter *df) if (!df) return; - dfilter_clear_filter(df); + if (df->dftree != NULL) + g_node_destroy(df->dftree); + + /* clear the memory that the tree was using for nodes */ + if (df->node_memchunk) + g_mem_chunk_reset(df->node_memchunk); + + /* clear the memory that the tree was using for byte arrays */ + if (df->list_of_byte_arrays) { + g_slist_foreach(df->list_of_byte_arrays, clear_byte_array, NULL); + g_slist_free(df->list_of_byte_arrays); + } + + df->dftree = NULL; + df->list_of_byte_arrays = NULL; /* Git rid of memchunk */ if (df->node_memchunk) @@ -267,64 +251,25 @@ clear_byte_array(gpointer data, gpointer user_data) void dfilter_error(char *s) { - /* The only data we have to worry about freeing is the - * data used by any GNodes that were allocated during - * parsing. The data in those Gnodes will be cleared - * later via df->node_memchunk. Use gnode_slist to - * clear the GNodes, and set global_df to NULL just - * to be tidy. - */ - global_df = NULL; - - /* I don't want to call g_node_destroy on each GNode ptr, - * since that function frees any children. That could - * mess me up later in the list if I try to free a GNode - * that has already been freed. So, I'll unlink the - * children firs,t then call g_node_destroy on each GNode ptr. - */ - if (!gnode_slist) - return; - - g_slist_foreach(gnode_slist, unlink_gnode_children, NULL); - g_slist_foreach(gnode_slist, destroy_gnode, NULL); - - /* notice we don't clear gnode_slist itself. dfilter_compile() - * will take care of that. - */ } /* Called when an error other than a parsing error occurs. */ void dfilter_fail(char *format, ...) { - va_list ap; + va_list ap; - /* If we've already reported one error, don't overwrite it with this - * one. */ - if (dfilter_error_msg != NULL) - return; + /* If we've already reported one error, don't overwrite it with this + * one. */ + if (dfilter_error_msg != NULL) + return; - va_start(ap, format); - vsnprintf(dfilter_error_msg_buf, sizeof dfilter_error_msg_buf, format, ap); - dfilter_error_msg = dfilter_error_msg_buf; - va_end(ap); + va_start(ap, format); + vsnprintf(dfilter_error_msg_buf, sizeof dfilter_error_msg_buf, format, ap); + dfilter_error_msg = dfilter_error_msg_buf; + va_end(ap); } -static void -unlink_gnode_children(gpointer gnode_ptr, gpointer user_data) -{ - if (gnode_ptr) - g_node_unlink((GNode*) gnode_ptr); -} - -static void -destroy_gnode(gpointer gnode_ptr, gpointer user_data) -{ - if (gnode_ptr) - g_node_destroy((GNode*) gnode_ptr); -} - - /* lookup an abbreviation in our token tree, returing the ID # * If the abbreviation doesn't exit, returns -1 */ int dfilter_lookup_token(char *abbrev) diff --git a/dfilter.h b/dfilter.h index c42676061a..f0c6f18a3b 100644 --- a/dfilter.h +++ b/dfilter.h @@ -1,7 +1,7 @@ /* dfilter.h * Definitions for display filters * - * $Id: dfilter.h,v 1.10 1999/08/26 06:20:49 gram Exp $ + * $Id: dfilter.h,v 1.11 1999/10/11 06:39:04 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -26,7 +26,7 @@ #ifndef __DFILTER_H__ #define __DFILTER_H__ -#define DFILTER_CONTAINS_FILTER(x) ((x)->dftree) +#define DFILTER_CONTAINS_FILTER(x) ((x) != NULL && (x)->dftree) /* dfilter_error_msg is NULL if there was no error during dfilter_compile, * otherwise it points to a displayable error message. */ @@ -36,7 +36,6 @@ extern gchar dfilter_error_msg_buf[1024]; typedef struct { GNode *dftree; - gchar *dftext; /* space for dfilter_nodes */ GMemChunk *node_memchunk; @@ -59,12 +58,9 @@ dfilter* dfilter_new(void); void dfilter_destroy(dfilter *df); /* Compile display filter text */ -int dfilter_compile(dfilter* df, gchar* dfilter_text); +dfilter* dfilter_compile(gchar* dfilter_text); /* Apply compiled dfilter to a proto_tree */ gboolean dfilter_apply(dfilter *df, proto_tree *ptree, const guint8* pd); -/* Clears the current filter int the dfilter */ -void dfilter_clear_filter(dfilter *df); - #endif /* ! __DFILTER_H__ */ diff --git a/file.c b/file.c index ccc84f2fba..cadd519754 100644 --- a/file.c +++ b/file.c @@ -1,7 +1,7 @@ /* file.c * File I/O routines * - * $Id: file.c,v 1.104 1999/10/10 11:50:38 sharpe Exp $ + * $Id: file.c,v 1.105 1999/10/11 06:39:06 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -771,25 +771,57 @@ wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset, } void -filter_packets(capture_file *cf) +filter_packets(capture_file *cf, gchar *dftext) +{ + dfilter *dfcode; + + if (dftext == NULL) { + /* The new filter is an empty filter (i.e., display all packets). */ + dfcode = NULL; + } else { + /* + * We have a filter; try to compile it. + */ + dfcode = dfilter_compile(dftext); + if (dfcode == NULL) { + simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg); + return; + } + + /* Was it empty? */ + if (dfcode->dftree == NULL) { + /* Yes - free the filter text and filter code, and set them to + NULL. */ + g_free(dftext); + dftext = NULL; + dfilter_destroy(dfcode); + dfcode = NULL; + } + } + + /* We have a valid filter. Replace the current filter. */ + if (cf->dfilter != NULL) + g_free(cf->dfilter); + cf->dfilter = dftext; + if (cf->dfcode != NULL) + dfilter_destroy(cf->dfcode); + cf->dfcode = dfcode; + + /* Now go through the list of packets we've read from the capture file, + applying the current display filter, and, if the packet passes the + display filter, add it to the summary display, appropriately + colored. (That's how we colorize the display - it's like filtering + the display, only we don't install a new filter.) */ + colorize_packets(cf); +} + +void +colorize_packets(capture_file *cf) { frame_data *fd; guint32 progbar_quantum; guint32 progbar_nextstep; - if (cf->dfilter == NULL) { - dfilter_clear_filter(cf->dfcode); - } - else { - /* - * Compile the filter. - */ - if (dfilter_compile(cf->dfcode, cf->dfilter) != 0) { - simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg); - return; - } - } - gtk_progress_set_activity_mode(GTK_PROGRESS(prog_bar), FALSE); /* Freeze the packet list while we redo it, so we don't get any diff --git a/file.h b/file.h index 031ed6aaa0..39ba7b0f2e 100644 --- a/file.h +++ b/file.h @@ -1,7 +1,7 @@ /* file.h * Definitions for file structures and routines * - * $Id: file.h,v 1.48 1999/10/02 20:23:53 guy Exp $ + * $Id: file.h,v 1.49 1999/10/11 06:39:03 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -104,9 +104,6 @@ typedef struct _capture_file { wtap *wth; /* Wiretap session */ dfilter *rfcode; /* Compiled read filter program */ gchar *dfilter; /* Display filter string */ -#if 0 - GNode *dfcode; /* Compiled display filter program */ -#endif colfilter *colors; /* Colors for colorizing packet window */ dfilter *dfcode; /* Compiled display filter program */ #ifdef HAVE_LIBPCAP @@ -130,8 +127,9 @@ int read_cap_file(capture_file *); int tail_cap_file(char *, capture_file *); /* size_t read_frame_header(capture_file *); */ +void filter_packets(capture_file *cf, gchar *dfilter); +void colorize_packets(capture_file *); int print_packets(capture_file *cf, print_args_t *print_args); -void filter_packets(capture_file *); void change_time_formats(capture_file *); void select_packet(capture_file *, int); void unselect_packet(capture_file *); diff --git a/gtk/file_dlg.c b/gtk/file_dlg.c index f7e8c7c3d4..571dd1c47f 100644 --- a/gtk/file_dlg.c +++ b/gtk/file_dlg.c @@ -1,7 +1,7 @@ /* file_dlg.c * Dialog boxes for handling files * - * $Id: file_dlg.c,v 1.8 1999/10/08 07:31:10 guy Exp $ + * $Id: file_dlg.c,v 1.9 1999/10/11 06:39:25 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -122,10 +122,9 @@ file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) { filter_te = gtk_object_get_data(GTK_OBJECT(w), E_RFILTER_TE_KEY); rfilter = gtk_entry_get_text(GTK_ENTRY(filter_te)); if (rfilter[0] != '\0') { - rfcode = dfilter_new(); - if (dfilter_compile(rfcode, rfilter) != 0) { + rfcode = dfilter_compile(rfilter); + if (rfcode != NULL) { simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg); - dfilter_destroy(rfcode); return; } } diff --git a/gtk/main.c b/gtk/main.c index 59a0a26f0f..14c219fdf4 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1,6 +1,6 @@ /* main.c * - * $Id: main.c,v 1.18 1999/10/09 14:05:04 deniel Exp $ + * $Id: main.c,v 1.19 1999/10/11 06:39:26 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -162,6 +162,7 @@ follow_stream_cb( GtkWidget *w, gpointer data ) { char filename1[128+1]; GtkWidget *streamwindow, *box, *text, *vscrollbar, *table; int tmp_fd; + gchar *follow_filter; if( pi.ipproto == 6 ) { /* we got tcp so we can follow */ @@ -191,10 +192,10 @@ follow_stream_cb( GtkWidget *w, gpointer data ) { /* Create a new filter that matches all packets in the TCP stream, and set the display filter entry accordingly */ reset_tcp_reassembly(); - cf.dfilter = build_follow_filter( &pi ); + follow_filter = build_follow_filter( &pi ); /* Run the display filter so it goes in effect. */ - filter_packets(&cf); + filter_packets(&cf, follow_filter); /* the data_out_file should now be full of the streams information */ fclose( data_out_file ); @@ -317,17 +318,12 @@ match_selected_cb(GtkWidget *w, gpointer data) } } - if( cf.dfilter != NULL ) { - /* get rid of this one */ - g_free( cf.dfilter ); - } /* create a new one and set the display filter entry accordingly */ - cf.dfilter = buf; if (filter_te) { - gtk_entry_set_text(GTK_ENTRY(filter_te), cf.dfilter); + gtk_entry_set_text(GTK_ENTRY(filter_te), buf); } /* Run the display filter so it goes in effect. */ - filter_packets(&cf); + filter_packets(&cf, buf); } /* Run the current display filter on the current packet set, and @@ -337,18 +333,7 @@ filter_activate_cb(GtkWidget *w, gpointer data) { char *s = gtk_entry_get_text(GTK_ENTRY(w)); - if (cf.dfilter) - g_free(cf.dfilter); - - /* simple check for empty string. XXX - need to modify to search for /^\s+$/ */ - if (s[0] == '\0' ) { - cf.dfilter = NULL; - } - else { - cf.dfilter = g_strdup(s); - } - - filter_packets(&cf); + filter_packets(&cf, g_strdup(s)); } /* What to do when a list item is selected/unselected */ @@ -522,7 +507,7 @@ main(int argc, char *argv[]) cf.fh = NULL; cf.rfcode = NULL; cf.dfilter = NULL; - cf.dfcode = dfilter_new(); + cf.dfcode = NULL; #ifdef HAVE_LIBPCAP cf.cfilter = NULL; #endif @@ -876,10 +861,9 @@ main(int argc, char *argv[]) up on top of us. */ if (cf_name) { if (rfilter != NULL) { - rfcode = dfilter_new(); - if (dfilter_compile(rfcode, rfilter) != 0) { + rfcode = dfilter_compile(rfilter); + if (rfcode == NULL) { simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg); - dfilter_destroy(rfcode); rfilter_parse_failed = TRUE; } } diff --git a/summary.c b/summary.c index 9375ce8bd1..77a0b23162 100644 --- a/summary.c +++ b/summary.c @@ -1,7 +1,7 @@ /* summary.c * Routines for capture file summary window * - * $Id: summary.c,v 1.12 1999/09/09 02:42:26 gram Exp $ + * $Id: summary.c,v 1.13 1999/10/11 06:39:01 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -249,8 +249,8 @@ traffic_bytes/seconds); add_string_to_box(string_buff, capture_box); /* Display filter */ - if (DFILTER_CONTAINS_FILTER(cf.dfcode)) { - snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfcode->dftext); + if (cf.dfilter) { + snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfilter); } else { sprintf(string_buff, "Display filter: none"); }