diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2009-07-21 16:48:16 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2009-07-21 16:48:16 +0000 |
commit | 8c4abdfb470c35587495e1cfade183e591e6cd51 (patch) | |
tree | 82ec061a0425f20b0d3aeb3fec2a23a1925c7c29 | |
parent | 8300e59b2fd133e761c90f26686f15fbfd5803f0 (diff) | |
download | wireshark-8c4abdfb470c35587495e1cfade183e591e6cd51.tar.gz |
From didier gautheron via bug 3762:
This patch removes col_expr in frame_data structure,
it can be recomputed when needed.
svn path=/trunk/; revision=29159
-rw-r--r-- | epan/column-utils.c | 16 | ||||
-rw-r--r-- | epan/frame_data.h | 1 | ||||
-rw-r--r-- | file.c | 29 | ||||
-rw-r--r-- | gtk/main.c | 37 |
4 files changed, 30 insertions, 53 deletions
diff --git a/epan/column-utils.c b/epan/column-utils.c index 0105ad423c..a465aaa3fd 100644 --- a/epan/column-utils.c +++ b/epan/column-utils.c @@ -1206,7 +1206,6 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "tcp.dstport", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "%u", port); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case PT_UDP: @@ -1221,7 +1220,6 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "udp.dstport", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "%u", port); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case PT_DDP: @@ -1233,7 +1231,6 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "%u", port); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case PT_IPX: @@ -1246,7 +1243,6 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "ipx.dst.socket", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "0x%04x", port); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case PT_IDP: @@ -1259,7 +1255,6 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "idp.dst.socket", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "0x%04x", port); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case PT_USB: @@ -1272,13 +1267,11 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src) g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "usb.dst.endpoint", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "0x%08x", port); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; default: break; } - pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col]; } @@ -1332,7 +1325,6 @@ col_set_circuit_id(packet_info *pinfo, int col) g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", pinfo->circuit_id); g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "fr.dlci", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "%u", pinfo->circuit_id); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case CT_ISDN: @@ -1341,7 +1333,6 @@ col_set_circuit_id(packet_info *pinfo, int col) g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "isdn.channel", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "%u", pinfo->circuit_id); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; case CT_X25: @@ -1352,13 +1343,11 @@ col_set_circuit_id(packet_info *pinfo, int col) g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", pinfo->circuit_id); g_strlcpy(pinfo->cinfo->col_expr.col_expr[col], "isup.cic", COL_MAX_LEN); g_snprintf(pinfo->cinfo->col_expr.col_expr_val[col], COL_MAX_LEN, "%u", pinfo->circuit_id); - pinfo->cinfo->col_expr.col_expr_val[col][COL_MAX_LEN - 1] = '\0'; break; default: break; } - pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col]; } @@ -1497,13 +1486,11 @@ col_fill_in(packet_info *pinfo) case COL_OXID: g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->oxid); - pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i]; break; case COL_RXID: g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->rxid); - pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i]; break; @@ -1516,19 +1503,16 @@ col_fill_in(packet_info *pinfo) case COL_SRCIDX: g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->src_idx); - pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i]; break; case COL_DSTIDX: g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->dst_idx); - pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i]; break; case COL_VSAN: g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->vsan); - pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0'; pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i]; break; diff --git a/epan/frame_data.h b/epan/frame_data.h index 197cf332bf..4f94f94dbd 100644 --- a/epan/frame_data.h +++ b/epan/frame_data.h @@ -58,7 +58,6 @@ typedef struct _frame_data { unsigned int ref_time : 1; /* 1 = marked as a reference time frame, 0 = normal */ } flags; void *color_filter; /* Per-packet matching color_filter_t object */ - col_expr_t col_expr; /* Column expressions & values */ } frame_data; /* @@ -330,12 +330,6 @@ cf_reset_state(capture_file *cf) cf->user_saved = FALSE; if (cf->plist_chunk != NULL) { - frame_data *fdata = cf->plist; - while (fdata) { - g_strfreev(fdata->col_expr.col_expr); - g_strfreev(fdata->col_expr.col_expr_val); - fdata = fdata->next; - } g_mem_chunk_destroy(cf->plist_chunk); cf->plist_chunk = NULL; } @@ -1111,25 +1105,6 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, /* This is the last frame we've seen so far. */ cf->last_displayed = fdata; - /* XXX - GLIB1 implementation provided to support backport of this feature. */ -#if (GLIB_MAJOR_VERSION >= 2) - fdata->col_expr.col_expr = g_strdupv(cf->cinfo.col_expr.col_expr); - fdata->col_expr.col_expr_val = g_strdupv(cf->cinfo.col_expr.col_expr_val); -#else - { - gint i; - - fdata->col_expr.col_expr = (gchar **) g_malloc(sizeof(gchar *) * (cf->cinfo.num_cols + 1)); - fdata->col_expr.col_expr_val = (gchar **) g_malloc(sizeof(gchar *) * (cf->cinfo.num_cols + 1)); - - for (i=0; i <= cf->cinfo.num_cols; i++) - { - fdata->col_expr.col_expr[i] = g_strdup(cf->cinfo.col_expr.col_expr[i]); - fdata->col_expr.col_expr_val[i] = g_strdup(cf->cinfo.col_expr.col_expr_val[i]); - } - } -#endif - #ifdef NEW_PACKET_LIST /* This function returns the color_t that was applied to the packet (in * the old packet list). Applying the color to the packet is only done @@ -1196,8 +1171,6 @@ read_packet(capture_file *cf, dfilter_t *dfcode, fdata->flags.marked = 0; fdata->flags.ref_time = 0; fdata->color_filter = NULL; - fdata->col_expr.col_expr = NULL; - fdata->col_expr.col_expr_val = NULL; fdata->abs_ts.secs = phdr->ts.secs; fdata->abs_ts.nsecs = phdr->ts.nsecs; @@ -1241,8 +1214,6 @@ read_packet(capture_file *cf, dfilter_t *dfcode, ...but, at least in one test I did, where I just made the chunk a G_ALLOC_ONLY chunk and read in a huge capture file, it didn't seem to save a noticeable amount of time or space. */ - g_strfreev(fdata->col_expr.col_expr); - g_strfreev(fdata->col_expr.col_expr_val); g_mem_chunk_free(cf->plist_chunk, fdata); } diff --git a/gtk/main.c b/gtk/main.c index cc1020a3e0..04299b68fe 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -501,14 +501,37 @@ get_filter_from_packet_list_row_and_column(gpointer data) gint row = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_ROW_KEY)); gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_COL_KEY)); frame_data *fdata = (frame_data *)packet_list_get_row_data(row); - - if(strlen(fdata->col_expr.col_expr[column]) != 0 && - strlen(fdata->col_expr.col_expr_val[column]) != 0) - return ep_strdup_printf("%s == %s", - fdata->col_expr.col_expr[column], - fdata->col_expr.col_expr_val[column]); - else + epan_dissect_t *edt; + gchar *buf=NULL; + int err; + gchar *err_info; + + if (fdata != NULL) { + if (!wtap_seek_read(cfile.wth, fdata->file_off, &cfile.pseudo_header, + cfile.pd, fdata->cap_len, &err, &err_info)) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, + cf_read_error_message(err, err_info), cfile.filename); return NULL; + } + /* proto tree, visible. We need a proto tree if there's custom columns */ + edt = epan_dissect_new(have_custom_cols(&cfile.cinfo), FALSE); + col_custom_prime_edt(edt, &cfile.cinfo); + + epan_dissect_run(edt, &cfile.pseudo_header, cfile.pd, fdata, + &cfile.cinfo); + epan_dissect_fill_in_columns(edt); + + if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 && + strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) { + /* leak a little but safer than ep_ here*/ + buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column], + cfile.cinfo.col_expr.col_expr_val[column]); + } + + epan_dissect_free(edt); + } + + return buf; } void |