frame user comments: move to epan, add support for user comments in sharkd.

Change-Id: Id15edc60177b160fd09cae99de1c9e01e17d9421
Reviewed-on: https://code.wireshark.org/review/24714
Petri-Dish: Jakub Zawadzki <darkjames-ws@darkjames.pl>
Tested-by: Petri Dish Buildbot
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Jakub Zawadzki 2017-12-06 19:51:18 +01:00 committed by Guy Harris
parent 038fe4c2d4
commit b59c39b271
6 changed files with 98 additions and 43 deletions

View File

@ -12,6 +12,17 @@
#include <epan/frame_set.h>
static int
frame_cmp(gconstpointer a, gconstpointer b, gpointer user_data _U_)
{
const frame_data *fdata1 = (const frame_data *) a;
const frame_data *fdata2 = (const frame_data *) b;
return (fdata1->num < fdata2->num) ? -1 :
(fdata1->num > fdata2->num) ? 1 :
0;
}
const char *
frame_set_get_interface_name(frame_set *fs, guint32 interface_id)
{
@ -55,3 +66,25 @@ frame_set_get_interface_description(frame_set *fs, guint32 interface_id)
}
return NULL;
}
const char *
frame_set_get_user_comment(frame_set *fs, const frame_data *fd)
{
if (fs->frames_user_comments)
return (const char *)g_tree_lookup(fs->frames_user_comments, fd);
/* g_warning? */
return NULL;
}
void
frame_set_set_user_comment(frame_set *fs, frame_data *fd, const char *new_comment)
{
if (!fs->frames_user_comments)
fs->frames_user_comments = g_tree_new_full(frame_cmp, NULL, NULL, g_free);
/* insert new packet comment */
g_tree_replace(fs->frames_user_comments, fd, g_strdup(new_comment));
fd->flags.has_user_comment = TRUE;
}

View File

@ -28,5 +28,7 @@ typedef struct {
WS_DLL_PUBLIC const char *frame_set_get_interface_name(frame_set *fs, guint32 interface_id);
WS_DLL_PUBLIC const char *frame_set_get_interface_description(frame_set *fs, guint32 interface_id);
WS_DLL_PUBLIC const char *frame_set_get_user_comment(frame_set *fs, const frame_data *fd);
WS_DLL_PUBLIC void frame_set_set_user_comment(frame_set *fs, frame_data *fd, const char *new_comment);
#endif /* frame_set.h */

43
file.c
View File

@ -111,8 +111,6 @@ static gboolean find_packet(capture_file *cf,
match_result (*match_function)(capture_file *, frame_data *, void *),
void *criterion, search_direction dir);
static const char *cf_get_user_packet_comment(frame_set *fs, const frame_data *fd);
static void cf_rename_failure_alert_box(const char *filename, int err);
static void ref_time_packets(capture_file *cf);
@ -242,12 +240,6 @@ ws_get_frame_ts(frame_set *fs, guint32 frame_num)
return NULL;
}
static const char *
ws_get_user_comment(frame_set *fs, const frame_data *fd)
{
return cf_get_user_packet_comment(fs, fd);
}
static epan_t *
ws_epan_new(capture_file *cf)
{
@ -257,7 +249,7 @@ ws_epan_new(capture_file *cf)
epan->get_frame_ts = ws_get_frame_ts;
epan->get_interface_name = frame_set_get_interface_name;
epan->get_interface_description = frame_set_get_interface_description;
epan->get_user_comment = ws_get_user_comment;
epan->get_user_comment = frame_set_get_user_comment;
return epan;
}
@ -3803,16 +3795,6 @@ cf_update_section_comment(capture_file *cf, gchar *comment)
cf->unsaved_changes = TRUE;
}
static const char *
cf_get_user_packet_comment(frame_set *fs, const frame_data *fd)
{
if (fs->frames_user_comments)
return (const char *)g_tree_lookup(fs->frames_user_comments, fd);
/* g_warning? */
return NULL;
}
/*
* Get the comment on a packet (record).
* If the comment has been edited, it returns the result of the edit,
@ -3825,7 +3807,7 @@ cf_get_packet_comment(capture_file *cf, const frame_data *fd)
/* fetch user comment */
if (fd->flags.has_user_comment)
return g_strdup(cf_get_user_packet_comment(&cf->frame_set_info, fd));
return g_strdup(frame_set_get_user_comment(&cf->frame_set_info, fd));
/* fetch phdr comment */
if (fd->flags.has_phdr_comment) {
@ -3846,17 +3828,6 @@ cf_get_packet_comment(capture_file *cf, const frame_data *fd)
return NULL;
}
static int
frame_cmp(gconstpointer a, gconstpointer b, gpointer user_data _U_)
{
const frame_data *fdata1 = (const frame_data *) a;
const frame_data *fdata2 = (const frame_data *) b;
return (fdata1->num < fdata2->num) ? -1 :
(fdata1->num > fdata2->num) ? 1 :
0;
}
/*
* Update(replace) the comment on a capture from a frame
*/
@ -3878,13 +3849,7 @@ cf_set_user_packet_comment(capture_file *cf, frame_data *fd, const gchar *new_co
if (new_comment)
cf->packet_comment_count++;
fd->flags.has_user_comment = TRUE;
if (!cf->frame_set_info.frames_user_comments)
cf->frame_set_info.frames_user_comments = g_tree_new_full(frame_cmp, NULL, NULL, g_free);
/* insert new packet comment */
g_tree_replace(cf->frame_set_info.frames_user_comments, fd, g_strdup(new_comment));
frame_set_set_user_comment(&cf->frame_set_info, fd, new_comment);
expert_update_comment_count(cf->packet_comment_count);
@ -3951,7 +3916,7 @@ save_record(capture_file *cf, frame_data *fdata,
const char *pkt_comment;
if (fdata->flags.has_user_comment)
pkt_comment = cf_get_user_packet_comment(&cf->frame_set_info, fdata);
pkt_comment = frame_set_get_user_comment(&cf->frame_set_info, fdata);
else
pkt_comment = phdr->opt_comment;

View File

@ -250,7 +250,7 @@ sharkd_epan_new(capture_file *cf)
epan->get_frame_ts = sharkd_get_frame_ts;
epan->get_interface_name = frame_set_get_interface_name;
epan->get_interface_description = frame_set_get_interface_description;
epan->get_user_comment = NULL;
epan->get_user_comment = frame_set_get_user_comment;
return epan;
}
@ -764,6 +764,19 @@ sharkd_filter(const char *dftext, guint8 **result)
return framenum;
}
const char *
sharkd_get_user_comment(const frame_data *fd)
{
return frame_set_get_user_comment(&cfile.frame_set_info, fd);
}
int
sharkd_set_user_comment(frame_data *fd, const gchar *new_comment)
{
frame_set_set_user_comment(&cfile.frame_set_info, fd, new_comment);
return 0;
}
#include "version.h"
const char *sharkd_version(void)
{

View File

@ -22,6 +22,8 @@ int sharkd_retap(void);
int sharkd_filter(const char *dftext, guint8 **result);
int sharkd_dissect_columns(int framenum, column_info *cinfo, gboolean dissect_color);
int sharkd_dissect_request(unsigned int framenum, void (*cb)(epan_dissect_t *, proto_tree *, struct epan_column_info *, const GSList *, void *), int dissect_bytes, int dissect_columns, int dissect_tree, void *data);
const char *sharkd_get_user_comment(const frame_data *fd);
int sharkd_set_user_comment(frame_data *fd, const gchar *new_comment);
const char *sharkd_version(void);
/* sharkd_daemon.c */

View File

@ -870,8 +870,11 @@ sharkd_session_process_frames(const char *buf, const jsmntok_t *tokens, int coun
}
printf("],\"num\":%u", framenum);
if (fdata->flags.has_phdr_comment)
printf(",\"ct\":true");
if (fdata->flags.has_user_comment || fdata->flags.has_phdr_comment)
{
if (!fdata->flags.has_user_comment || sharkd_get_user_comment(fdata) != NULL)
printf(",\"ct\":true");
}
if (fdata->flags.ignored)
printf(",\"i\":true");
@ -2768,7 +2771,9 @@ sharkd_session_process_frame_cb(epan_dissect_t *edt, proto_tree *tree, struct ep
printf("\"err\":0");
if (fdata->flags.has_phdr_comment)
if (fdata->flags.has_user_comment)
pkt_comment = sharkd_get_user_comment(fdata);
else if (fdata->flags.has_phdr_comment)
pkt_comment = pi->phdr->opt_comment;
if (pkt_comment)
@ -3279,6 +3284,39 @@ sharkd_session_process_complete(char *buf, const jsmntok_t *tokens, int count)
return 0;
}
/**
* sharkd_session_process_setcomment()
*
* Process setcomment request
*
* Input:
* (m) frame - frame number
* (o) comment - user comment
*
* Output object with attributes:
* (m) err - error code: 0 succeed
*/
static void
sharkd_session_process_setcomment(char *buf, const jsmntok_t *tokens, int count)
{
const char *tok_frame = json_find_attr(buf, tokens, count, "frame");
const char *tok_comment = json_find_attr(buf, tokens, count, "comment");
guint32 framenum;
frame_data *fdata;
int ret;
if (!tok_frame || !ws_strtou32(tok_frame, NULL, &framenum) || framenum == 0)
return;
fdata = frame_data_sequence_find(cfile.frame_set_info.frames, framenum);
if (!fdata)
return;
ret = sharkd_set_user_comment(fdata, tok_comment);
printf("{\"err\":%d}\n", ret);
}
/**
* sharkd_session_process_setconf()
*
@ -3911,6 +3949,8 @@ sharkd_session_process(char *buf, const jsmntok_t *tokens, int count)
sharkd_session_process_intervals(buf, tokens, count);
else if (!strcmp(tok_req, "frame"))
sharkd_session_process_frame(buf, tokens, count);
else if (!strcmp(tok_req, "setcomment"))
sharkd_session_process_setcomment(buf, tokens, count);
else if (!strcmp(tok_req, "setconf"))
sharkd_session_process_setconf(buf, tokens, count);
else if (!strcmp(tok_req, "dumpconf"))