summaryrefslogtreecommitdiff
path: root/epan/tap.c
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2015-08-19 09:00:54 +0200
committerStig Bjørlykke <stig@bjorlykke.org>2015-08-19 08:55:19 +0000
commitfa40025a7e2e9ddc5590515989074df1662dcc82 (patch)
treeb10a6eb7cda8c9f7a7742ebcf419fb9c35bebbe3 /epan/tap.c
parentb755a6687b57ea76bdacfcd8717e9b219129b1b6 (diff)
downloadwireshark-fa40025a7e2e9ddc5590515989074df1662dcc82.tar.gz
Recompile dfilter for all tap listeners when fields changed
When fields have changed the compiled display filter may be invalid or need a recompile to be valid. Filters which are not valid after a recompile is set to a filter matching no packets (frame.number == 0) to indicate that this does no longer match anything. We should probably have a better filter matching no packet for this purpose. Change-Id: Id27efa9f46e77e20df50d7366f26d5cada186f93 Reviewed-on: https://code.wireshark.org/review/10123 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'epan/tap.c')
-rw-r--r--epan/tap.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/epan/tap.c b/epan/tap.c
index c0b7f92c2f..d1e68fd73e 100644
--- a/epan/tap.c
+++ b/epan/tap.c
@@ -93,6 +93,7 @@ typedef struct _tap_listener_t {
int tap_id;
gboolean needs_redraw;
guint flags;
+ gchar *fstring;
dfilter_t *code;
void *tapdata;
tap_reset_cb reset;
@@ -529,6 +530,7 @@ register_tap_listener(const char *tapname, void *tapdata, const char *fstring,
return error_string;
}
}
+ tl->fstring=g_strdup(fstring);
tl->tap_id=tap_id;
tl->tapdata=tapdata;
@@ -573,8 +575,10 @@ set_tap_dfilter(void *tapdata, const char *fstring)
tl->code=NULL;
}
tl->needs_redraw=TRUE;
+ g_free(tl->fstring);
if(fstring){
if(!dfilter_compile(fstring, &tl->code, &err_msg)){
+ tl->fstring=NULL;
error_string = g_string_new("");
g_string_printf(error_string,
"Filter \"%s\" is invalid - %s",
@@ -583,11 +587,36 @@ set_tap_dfilter(void *tapdata, const char *fstring)
return error_string;
}
}
+ tl->fstring=g_strdup(fstring);
}
return NULL;
}
+/* this function recompiles dfilter for all registered tap listeners
+ */
+void
+tap_listeners_dfilter_recompile(void)
+{
+ tap_listener_t *tl;
+ gchar *err_msg;
+
+ for(tl=(tap_listener_t *)tap_listener_queue;tl;tl=tl->next){
+ if(tl->code){
+ dfilter_free(tl->code);
+ tl->code=NULL;
+ }
+ tl->needs_redraw=TRUE;
+ if(tl->fstring){
+ if(!dfilter_compile(tl->fstring, &tl->code, &err_msg)){
+ g_free(err_msg);
+ /* Not valid, make a dfilter matching no packets */
+ dfilter_compile("frame.number == 0", &tl->code, &err_msg);
+ }
+ }
+ }
+}
+
/* this function removes a tap listener
*/
void
@@ -617,6 +646,7 @@ remove_tap_listener(void *tapdata)
if(tl->code){
dfilter_free(tl->code);
}
+ g_free(tl->fstring);
g_free(tl);
}