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
This commit is contained in:
Stig Bjørlykke 2009-07-21 16:48:16 +00:00
parent 8300e59b2f
commit 8c4abdfb47
4 changed files with 29 additions and 52 deletions

View File

@ -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;

View File

@ -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;
/*

29
file.c
View File

@ -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);
}

View File

@ -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);
epan_dissect_t *edt;
gchar *buf=NULL;
int err;
gchar *err_info;
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
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