aboutsummaryrefslogtreecommitdiffstats
path: root/sharkd_session.c
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2017-09-27 22:24:54 +0200
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2017-10-04 04:51:12 +0000
commitea6e4b577f08f88e0d5cabb7cb38e17b236e513a (patch)
tree81ada5d1d08348c39468959667f0a8e619c4a7f8 /sharkd_session.c
parent70996dc669305da1c5f7a305d67b5976fde75073 (diff)
sharkd: support for user column-set in "frames" request.
Change-Id: If6a10cc252f2ad362ba3a91318cedd15d954db2b Reviewed-on: https://code.wireshark.org/review/23768 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Jakub Zawadzki <darkjames-ws@darkjames.pl>
Diffstat (limited to 'sharkd_session.c')
-rw-r--r--sharkd_session.c82
1 files changed, 82 insertions, 0 deletions
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 <dfilter>:<occurence>).
+ * 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)
{