sharkd: keep filtered data in GHashTable.

Change-Id: Ica0d953d93e35eab88b27a4d6bb8fbb75edb7e27
Reviewed-on: https://code.wireshark.org/review/25312
Petri-Dish: Jakub Zawadzki <darkjames-ws@darkjames.pl>
Tested-by: Petri Dish Buildbot
Reviewed-by: Jakub Zawadzki <darkjames-ws@darkjames.pl>
This commit is contained in:
Jakub Zawadzki 2018-01-14 16:38:55 +01:00
parent 2c3c49cd37
commit 2cfceb2700

View File

@ -73,6 +73,13 @@
#include "sharkd.h" #include "sharkd.h"
struct sharkd_filter_item
{
guint8 *filtered;
};
static GHashTable *filter_table = NULL;
static gboolean static gboolean
json_unescape_str(char *input) json_unescape_str(char *input)
{ {
@ -164,27 +171,22 @@ json_print_base64(const guint8 *data, size_t len)
putchar('"'); putchar('"');
} }
struct filter_item static void
sharkd_session_filter_free(gpointer data)
{ {
struct filter_item *next; struct sharkd_filter_item *l = (struct sharkd_filter_item *) data;
char *filter; g_free(l->filtered);
guint8 *filtered; g_free(l);
}; }
static struct filter_item *filter_list = NULL;
static const guint8 * static const guint8 *
sharkd_session_filter_data(const char *filter) sharkd_session_filter_data(const char *filter)
{ {
struct filter_item *l; struct sharkd_filter_item *l;
for (l = filter_list; l; l = l->next)
{
if (!strcmp(l->filter, filter))
return l->filtered;
}
l = (struct sharkd_filter_item *) g_hash_table_lookup(filter_table, filter);
if (!l)
{ {
guint8 *filtered = NULL; guint8 *filtered = NULL;
@ -193,15 +195,13 @@ sharkd_session_filter_data(const char *filter)
if (ret == -1) if (ret == -1)
return NULL; return NULL;
l = (struct filter_item *) g_malloc(sizeof(struct filter_item)); l = (struct sharkd_filter_item *) g_malloc(sizeof(struct sharkd_filter_item));
l->filter = g_strdup(filter);
l->filtered = filtered; l->filtered = filtered;
l->next = filter_list; g_hash_table_insert(filter_table, g_strdup(filter), l);
filter_list = l;
return filtered;
} }
return l->filtered;
} }
struct sharkd_rtp_match struct sharkd_rtp_match
@ -4048,6 +4048,8 @@ sharkd_session_main(void)
fprintf(stderr, "Hello in child.\n"); fprintf(stderr, "Hello in child.\n");
filter_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, sharkd_session_filter_free);
while (fgets(buf, sizeof(buf), stdin)) while (fgets(buf, sizeof(buf), stdin))
{ {
/* every command is line seperated JSON */ /* every command is line seperated JSON */
@ -4081,6 +4083,7 @@ sharkd_session_main(void)
sharkd_session_process(buf, tokens, ret); sharkd_session_process(buf, tokens, ret);
} }
g_hash_table_destroy(filter_table);
g_free(tokens); g_free(tokens);
return 0; return 0;