From ea6e4b577f08f88e0d5cabb7cb38e17b236e513a Mon Sep 17 00:00:00 2001 From: Jakub Zawadzki Date: Wed, 27 Sep 2017 22:24:54 +0200 Subject: [PATCH] sharkd: support for user column-set in "frames" request. Change-Id: If6a10cc252f2ad362ba3a91318cedd15d954db2b Reviewed-on: https://code.wireshark.org/review/23768 Petri-Dish: Anders Broman Tested-by: Petri Dish Buildbot Reviewed-by: Jakub Zawadzki --- sharkd_session.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/sharkd_session.c b/sharkd_session.c index e960fdfefb..ee71e168de 100644 --- a/sharkd_session.c +++ b/sharkd_session.c @@ -712,12 +712,84 @@ sharkd_session_process_analyse(void) g_hash_table_destroy(analyser.protocols_set); } +static column_info * +sharkd_session_create_columns(column_info *cinfo, const char *buf, const jsmntok_t *tokens, int count) +{ + const char *columns_custom[32]; + guint16 columns_fmt[32]; + gint16 columns_occur[32]; + + int i, cols; + + for (i = 0; i < 32; i++) + { + const char *tok_column; + char tok_column_name[64]; + char *custom_sepa; + + ws_snprintf(tok_column_name, sizeof(tok_column_name), "column%d", i); + tok_column = json_find_attr(buf, tokens, count, tok_column_name); + if (tok_column == NULL) + break; + + if ((custom_sepa = strchr(tok_column, ':'))) + { + *custom_sepa = '\0'; /* XXX, C abuse: discarding-const */ + + columns_fmt[i] = COL_CUSTOM; + columns_custom[i] = tok_column; + columns_occur[i] = 0; + + if (!ws_strtoi16(custom_sepa + 1, NULL, &columns_occur[i])) + return NULL; + } + else + { + if (!ws_strtou16(tok_column, NULL, &columns_fmt[i])) + return NULL; + + if (columns_fmt[i] >= NUM_COL_FMTS) + return NULL; + + /* if custom, that it shouldn't be just custom number -> error */ + if (columns_fmt[i] == COL_CUSTOM) + return NULL; + } + } + + cols = i; + + col_setup(cinfo, cols); + + for (i = 0; i < cols; i++) + { + col_item_t *col_item = &cinfo->columns[i]; + + col_item->col_fmt = columns_fmt[i]; + col_item->col_title = NULL; /* no need for title */ + + if (col_item->col_fmt == COL_CUSTOM) + { + col_item->col_custom_fields = g_strdup(columns_custom[i]); + col_item->col_custom_occurrence = columns_occur[i]; + } + + col_item->col_fence = 0; + } + + col_finalize(cinfo); + + return cinfo; +} + /** * sharkd_session_process_frames() * * Process frames request * * Input: + * (o) column0...columnXX - requested columns either number in range [0..NUM_COL_FMTS), or custom (syntax :). + * If column0 is not specified default column set will be used. * (o) filter - filter to be used * (o) skip=N - skip N frames * (o) limit=N - show only N frames @@ -735,6 +807,7 @@ static void sharkd_session_process_frames(const char *buf, const jsmntok_t *tokens, int count) { const char *tok_filter = json_find_attr(buf, tokens, count, "filter"); + const char *tok_column = json_find_attr(buf, tokens, count, "column0"); const char *tok_skip = json_find_attr(buf, tokens, count, "skip"); const char *tok_limit = json_find_attr(buf, tokens, count, "limit"); @@ -748,6 +821,15 @@ sharkd_session_process_frames(const char *buf, const jsmntok_t *tokens, int coun guint32 limit; column_info *cinfo = &cfile.cinfo; + column_info user_cinfo; + + if (tok_column) + { + memset(&user_cinfo, 0, sizeof(user_cinfo)); + cinfo = sharkd_session_create_columns(&user_cinfo, buf, tokens, count); + if (!cinfo) + return; + } if (tok_filter) {