From de23d92163d8739d69b082f0439cc3222ad7330e Mon Sep 17 00:00:00 2001 From: Kovarththanan Rajaratnam Date: Tue, 8 Sep 2009 19:00:54 +0000 Subject: [PATCH] Add an option to col_fill_in() to allow us to disable column expression processing. This is rarely needed. It's only needed when the user right clicks on the packet list view to generate a display filter. svn path=/trunk/; revision=29806 --- epan/column-utils.c | 83 ++++++++++++++++++++++++++++------------- epan/column-utils.h | 14 +++---- epan/epan.c | 4 +- epan/epan.h | 2 +- file.c | 8 ++-- gtk/main.c | 2 +- gtk/new_packet_list.c | 4 +- gtk/packet_list_store.c | 4 +- gtk/packet_win.c | 2 +- tshark.c | 2 +- 10 files changed, 79 insertions(+), 46 deletions(-) diff --git a/epan/column-utils.c b/epan/column-utils.c index 8b6bbe80ac..3a86252e2a 100644 --- a/epan/column-utils.c +++ b/epan/column-utils.c @@ -1153,7 +1153,7 @@ col_set_time(column_info *cinfo, gint el, nstime_t *ts, char *fieldname) } static void -col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src) +col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src, gboolean fill_col_exprs) { struct e_in6_addr ipv6_addr; @@ -1168,6 +1168,9 @@ col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src) pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col]; #endif + if (!fill_col_exprs) + return; + switch (addr->type) { case AT_ETHER: @@ -1226,7 +1229,7 @@ col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src) /* ------------------------ */ static void -col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) +col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src, gboolean fill_col_exprs _U_) { guint32 port; @@ -1235,6 +1238,8 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) else port = pinfo->destport; + /* TODO: Use fill_col_exprs */ + switch (pinfo->ptype) { case PT_SCTP: if (is_res) @@ -1334,15 +1339,13 @@ col_based_on_frame_data(column_info *cinfo, gint col) } void -col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col) +col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col, gboolean fill_col_exprs) { switch (cinfo->col_fmt[col]) { case COL_NUMBER: g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%u", fd->num); cinfo->col_data[col] = cinfo->col_buf[col]; - cinfo->col_expr.col_expr[col] = "frame.number"; - g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN); break; case COL_CLS_TIME: @@ -1351,14 +1354,13 @@ col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col) case COL_REL_TIME: case COL_DELTA_TIME: case COL_DELTA_TIME_DIS: + /* TODO: Pass on fill_col_exprs */ col_set_fmt_time(fd, cinfo, cinfo->col_fmt[col], col); break; case COL_PACKET_LENGTH: g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%u", fd->pkt_len); cinfo->col_data[col] = cinfo->col_buf[col]; - cinfo->col_expr.col_expr[col] = "frame.len"; - g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN); break; case COL_CUMULATIVE_BYTES: @@ -1369,10 +1371,41 @@ col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col) default: break; } + + if (!fill_col_exprs) + return; + + switch (cinfo->col_fmt[col]) { + + case COL_NUMBER: + cinfo->col_expr.col_expr[col] = "frame.number"; + g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN); + break; + + case COL_CLS_TIME: + case COL_ABS_TIME: + case COL_ABS_DATE_TIME: + case COL_REL_TIME: + case COL_DELTA_TIME: + case COL_DELTA_TIME_DIS: + /* Already handled above */ + break; + + case COL_PACKET_LENGTH: + cinfo->col_expr.col_expr[col] = "frame.len"; + g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN); + break; + + case COL_CUMULATIVE_BYTES: + break; + + default: + break; + } } void -col_fill_in(packet_info *pinfo, gboolean fill_fd_colums) +col_fill_in(packet_info *pinfo, gboolean fill_col_exprs, gboolean fill_fd_colums) { int i; @@ -1392,79 +1425,79 @@ col_fill_in(packet_info *pinfo, gboolean fill_fd_colums) case COL_PACKET_LENGTH: case COL_CUMULATIVE_BYTES: if (fill_fd_colums) - col_fill_in_frame_data(pinfo->fd, pinfo->cinfo, i); + col_fill_in_frame_data(pinfo->fd, pinfo->cinfo, i, fill_col_exprs); break; case COL_DEF_SRC: case COL_RES_SRC: /* COL_DEF_SRC is currently just like COL_RES_SRC */ - col_set_addr(pinfo, i, &pinfo->src, TRUE); + col_set_addr(pinfo, i, &pinfo->src, TRUE, fill_col_exprs); break; case COL_UNRES_SRC: - col_set_addr(pinfo, i, &pinfo->src, TRUE); + col_set_addr(pinfo, i, &pinfo->src, TRUE, fill_col_exprs); break; case COL_DEF_DL_SRC: case COL_RES_DL_SRC: - col_set_addr(pinfo, i, &pinfo->dl_src, TRUE); + col_set_addr(pinfo, i, &pinfo->dl_src, TRUE, fill_col_exprs); break; case COL_UNRES_DL_SRC: - col_set_addr(pinfo, i, &pinfo->dl_src, TRUE); + col_set_addr(pinfo, i, &pinfo->dl_src, TRUE, fill_col_exprs); break; case COL_DEF_NET_SRC: case COL_RES_NET_SRC: - col_set_addr(pinfo, i, &pinfo->net_src, TRUE); + col_set_addr(pinfo, i, &pinfo->net_src, TRUE, fill_col_exprs); break; case COL_UNRES_NET_SRC: - col_set_addr(pinfo, i, &pinfo->net_src, TRUE); + col_set_addr(pinfo, i, &pinfo->net_src, TRUE, fill_col_exprs); break; case COL_DEF_DST: case COL_RES_DST: /* COL_DEF_DST is currently just like COL_RES_DST */ - col_set_addr(pinfo, i, &pinfo->dst, FALSE); + col_set_addr(pinfo, i, &pinfo->dst, FALSE, fill_col_exprs); break; case COL_UNRES_DST: - col_set_addr(pinfo, i, &pinfo->dst, FALSE); + col_set_addr(pinfo, i, &pinfo->dst, FALSE, fill_col_exprs); break; case COL_DEF_DL_DST: case COL_RES_DL_DST: - col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE); + col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE, fill_col_exprs); break; case COL_UNRES_DL_DST: - col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE); + col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE, fill_col_exprs); break; case COL_DEF_NET_DST: case COL_RES_NET_DST: - col_set_addr(pinfo, i, &pinfo->net_dst, FALSE); + col_set_addr(pinfo, i, &pinfo->net_dst, FALSE, fill_col_exprs); break; case COL_UNRES_NET_DST: - col_set_addr(pinfo, i, &pinfo->net_dst, FALSE); + col_set_addr(pinfo, i, &pinfo->net_dst, FALSE, fill_col_exprs); break; case COL_DEF_SRC_PORT: case COL_RES_SRC_PORT: /* COL_DEF_SRC_PORT is currently just like COL_RES_SRC_PORT */ - col_set_port(pinfo, i, TRUE, TRUE); + col_set_port(pinfo, i, TRUE, TRUE, fill_col_exprs); break; case COL_UNRES_SRC_PORT: - col_set_port(pinfo, i, FALSE, TRUE); + col_set_port(pinfo, i, FALSE, TRUE, fill_col_exprs); break; case COL_DEF_DST_PORT: case COL_RES_DST_PORT: /* COL_DEF_DST_PORT is currently just like COL_RES_DST_PORT */ - col_set_port(pinfo, i, TRUE, FALSE); + col_set_port(pinfo, i, TRUE, FALSE, fill_col_exprs); break; case COL_UNRES_DST_PORT: - col_set_port(pinfo, i, FALSE, FALSE); + col_set_port(pinfo, i, FALSE, FALSE, fill_col_exprs); break; case COL_VSAN: diff --git a/epan/column-utils.h b/epan/column-utils.h index 50a4cdd268..deb7135720 100644 --- a/epan/column-utils.h +++ b/epan/column-utils.h @@ -70,13 +70,13 @@ extern void col_set_fmt_time(frame_data *fd, column_info *cinfo, gint fmt, gint * * Internal, don't use this in dissectors! */ -extern void col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col); +extern void col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col, gboolean fill_col_exprs); /** Fill in all columns of the given packet. * * Internal, don't use this in dissectors! */ -extern void col_fill_in(packet_info *pinfo, gboolean fill_fd_colums); +extern void col_fill_in(packet_info *pinfo, gboolean fill_col_exprs, gboolean fill_fd_colums); /* Utility routines used by packet*.c */ @@ -87,7 +87,7 @@ extern void col_fill_in(packet_info *pinfo, gboolean fill_fd_colums); */ extern gboolean col_get_writable(column_info *cinfo); -/** Set the columns writable. +/** Set the columns writable. * * @param cinfo the current packet row * @param writable TRUE if it's writable, FALSE if not @@ -101,8 +101,8 @@ extern void col_set_writable(column_info *cinfo, gboolean writable); */ extern gint check_col(column_info *cinfo, gint col); -/** Sets a fence for the current column content, - * so this content won't be affected by further col_... function calls. +/** Sets a fence for the current column content, + * so this content won't be affected by further col_... function calls. * * This can be useful if a protocol is more than once in a single packet, * e.g. multiple HTTP calls in a single TCP packet. @@ -231,11 +231,11 @@ extern void col_append_sep_fstr(column_info *cinfo, gint col, const gchar *sep, * * Used by multiple dissectors to set the time in the column * COL_DELTA_CONV_TIME - * + * * @param cinfo the current packet row * @param col the column to use, e.g. COL_INFO * @param ts the time to set in the column - * @param fieldname the fieldname to use for creating a filter (when + * @param fieldname the fieldname to use for creating a filter (when * applying/preparing/copying as filter) */ extern void col_set_time(column_info *cinfo, int col, diff --git a/epan/epan.c b/epan/epan.c index b4d64a3dd1..5d159852d1 100644 --- a/epan/epan.c +++ b/epan/epan.c @@ -239,9 +239,9 @@ epan_custom_set(epan_dissect_t *edt, int field_id, } void -epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_fd_colums) +epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_col_exprs, gboolean fill_fd_colums) { col_custom_set_edt(edt, edt->pi.cinfo); - col_fill_in(&edt->pi, fill_fd_colums); + col_fill_in(&edt->pi, fill_col_exprs, fill_fd_colums); } diff --git a/epan/epan.h b/epan/epan.h index 82391b146d..65f3ef8436 100644 --- a/epan/epan.h +++ b/epan/epan.h @@ -111,7 +111,7 @@ epan_dissect_prime_dfilter(epan_dissect_t *edt, const dfilter_t *dfcode); /* fill the dissect run output into the packet list columns */ void -epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_fd_colums); +epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_col_exprs, gboolean fill_fd_colums); /* releases resources attached to the packet dissection. DOES NOT free the actual pointer */ void diff --git a/file.c b/file.c index f10920e52a..9712da84f3 100644 --- a/file.c +++ b/file.c @@ -1190,7 +1190,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, } #ifndef NEW_PACKET_LIST - epan_dissect_fill_in_columns(&edt, TRUE); + epan_dissect_fill_in_columns(&edt, FALSE, TRUE); #endif /* If we haven't yet seen the first frame, this is it. @@ -2298,7 +2298,7 @@ print_packet(capture_file *cf, frame_data *fdata, information. */ if (args->print_args->print_summary) { epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo); - epan_dissect_fill_in_columns(&edt, TRUE); + epan_dissect_fill_in_columns(&edt, FALSE, TRUE); } else epan_dissect_run(&edt, pseudo_header, pd, fdata, NULL); @@ -2630,7 +2630,7 @@ write_psml_packet(capture_file *cf, frame_data *fdata, proto_tree_needed = have_custom_cols(&cf->cinfo); epan_dissect_init(&edt, proto_tree_needed, proto_tree_needed); epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo); - epan_dissect_fill_in_columns(&edt, TRUE); + epan_dissect_fill_in_columns(&edt, FALSE, TRUE); /* Write out the information in that tree. */ proto_tree_write_psml(&edt, fh); @@ -2704,7 +2704,7 @@ write_csv_packet(capture_file *cf, frame_data *fdata, proto_tree_needed = have_custom_cols(&cf->cinfo); epan_dissect_init(&edt, proto_tree_needed, proto_tree_needed); epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo); - epan_dissect_fill_in_columns(&edt, TRUE); + epan_dissect_fill_in_columns(&edt, FALSE, TRUE); /* Write out the information in that tree. */ proto_tree_write_csv(&edt, fh); diff --git a/gtk/main.c b/gtk/main.c index 3cab4f65db..472e7c728c 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -526,7 +526,7 @@ get_filter_from_packet_list_row_and_column(gpointer data) epan_dissect_run(&edt, &cfile.pseudo_header, cfile.pd, fdata, &cfile.cinfo); - epan_dissect_fill_in_columns(&edt, TRUE); + epan_dissect_fill_in_columns(&edt, TRUE, TRUE); if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 && strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) { diff --git a/gtk/new_packet_list.c b/gtk/new_packet_list.c index 7e61217f77..c0f22591fb 100644 --- a/gtk/new_packet_list.c +++ b/gtk/new_packet_list.c @@ -642,7 +642,7 @@ show_cell_data_func(GtkTreeViewColumn *col _U_, GtkCellRenderer *renderer, g_assert(fdata->col_text); if (col_based_on_frame_data(&cfile.cinfo, col_num)) { - col_fill_in_frame_data(fdata, &cfile.cinfo, col_num); + col_fill_in_frame_data(fdata, &cfile.cinfo, col_num, FALSE); cell_text = cfile.cinfo.col_data[col_num]; }else cell_text = fdata->col_text[col_num]; @@ -757,7 +757,7 @@ static gboolean get_col_text_from_record( PacketListRecord *record, gint col_num, gchar** cell_text){ if (col_based_on_frame_data(&cfile.cinfo, col_num)) { - col_fill_in_frame_data(record->fdata, &cfile.cinfo, col_num); + col_fill_in_frame_data(record->fdata, &cfile.cinfo, col_num, FALSE); *cell_text = g_strdup(cfile.cinfo.col_data[col_num]); }else *cell_text = g_strdup(record->fdata->col_text[col_num]); diff --git a/gtk/packet_list_store.c b/gtk/packet_list_store.c index 3cf041f3b5..7fe7954830 100644 --- a/gtk/packet_list_store.c +++ b/gtk/packet_list_store.c @@ -1085,7 +1085,7 @@ packet_list_dissect_and_cache_record(PacketList *packet_list, PacketListRecord * if (dissect_columns) { /* "Stringify" non frame_data vals */ - epan_dissect_fill_in_columns(&edt, FALSE /* fill_fd_colums */); + epan_dissect_fill_in_columns(&edt, FALSE, FALSE /* fill_fd_colums */); for(col = 0; col < cinfo->num_cols; ++col) { /* Skip columns based om frame_data because we already store those. */ @@ -1216,7 +1216,7 @@ packet_list_get_widest_column_string(PacketList *packet_list, gint col) } } - col_fill_in_frame_data(&fdata, &cfile.cinfo, col); + col_fill_in_frame_data(&fdata, &cfile.cinfo, col, FALSE); return cfile.cinfo.col_buf[col]; } diff --git a/gtk/packet_win.c b/gtk/packet_win.c index e2865b7934..7a8a6a8a5b 100644 --- a/gtk/packet_win.c +++ b/gtk/packet_win.c @@ -141,7 +141,7 @@ void new_window_cb(GtkWidget *w _U_) DataPtr->edt = epan_dissect_new(TRUE, TRUE); epan_dissect_run(DataPtr->edt, &DataPtr->pseudo_header, DataPtr->pd, DataPtr->frame, &cfile.cinfo); - epan_dissect_fill_in_columns(DataPtr->edt, TRUE); + epan_dissect_fill_in_columns(DataPtr->edt, FALSE, TRUE); /* * Build title of window by getting column data constructed when the diff --git a/tshark.c b/tshark.c index 01b46b9de7..ee7a53ad05 100644 --- a/tshark.c +++ b/tshark.c @@ -2909,7 +2909,7 @@ print_packet(capture_file *cf, epan_dissect_t *edt) } } else { /* Just fill in the columns. */ - epan_dissect_fill_in_columns(edt, TRUE); + epan_dissect_fill_in_columns(edt, FALSE, TRUE); /* Now print them. */ switch (output_action) {