diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-19 09:00:54 +0200 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-19 08:55:19 +0000 |
commit | fa40025a7e2e9ddc5590515989074df1662dcc82 (patch) | |
tree | b10a6eb7cda8c9f7a7742ebcf419fb9c35bebbe3 /epan | |
parent | b755a6687b57ea76bdacfcd8717e9b219129b1b6 (diff) |
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')
-rw-r--r-- | epan/tap.c | 30 | ||||
-rw-r--r-- | epan/tap.h | 3 |
2 files changed, 33 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); } diff --git a/epan/tap.h b/epan/tap.h index 7f2002af17..c3b427f008 100644 --- a/epan/tap.h +++ b/epan/tap.h @@ -218,6 +218,9 @@ WS_DLL_PUBLIC GString *register_tap_listener(const char *tapname, void *tapdata, /** This function sets a new dfilter to a tap listener */ WS_DLL_PUBLIC GString *set_tap_dfilter(void *tapdata, const char *fstring); +/** This function recompiles dfilter for all registered tap listeners */ +WS_DLL_PUBLIC void tap_listeners_dfilter_recompile(void); + /** this function removes a tap listener */ WS_DLL_PUBLIC void remove_tap_listener(void *tapdata); |