1998-09-16 02:39:15 +00:00
|
|
|
/* file.c
|
|
|
|
* File I/O routines
|
|
|
|
*
|
1999-01-03 01:57:24 +00:00
|
|
|
* $Id: file.c,v 1.17 1999/01/03 01:57:24 guy Exp $
|
1998-09-16 03:22:19 +00:00
|
|
|
*
|
1998-09-16 02:39:15 +00:00
|
|
|
* Ethereal - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@zing.org>
|
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <gtk/gtk.h>
|
1998-11-12 00:06:47 +00:00
|
|
|
|
|
|
|
#ifdef WITH_WIRETAP
|
1998-09-16 02:39:15 +00:00
|
|
|
#include <pcap.h>
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <unistd.h>
|
1998-09-27 22:12:47 +00:00
|
|
|
#include <string.h>
|
1998-09-16 02:39:15 +00:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
1998-10-10 03:32:20 +00:00
|
|
|
#ifdef NEED_SNPRINTF_H
|
1998-10-13 07:03:37 +00:00
|
|
|
# ifdef HAVE_STDARG_H
|
|
|
|
# include <stdarg.h>
|
|
|
|
# else
|
|
|
|
# include <varargs.h>
|
|
|
|
# endif
|
1998-10-10 03:32:20 +00:00
|
|
|
# include "snprintf.h"
|
|
|
|
#endif
|
|
|
|
|
1998-09-16 02:39:15 +00:00
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
|
|
# include <sys/types.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_NETINET_IN_H
|
|
|
|
# include <netinet/in.h>
|
|
|
|
#endif
|
|
|
|
|
1998-09-27 22:12:47 +00:00
|
|
|
#include "ethereal.h"
|
1998-12-17 05:42:33 +00:00
|
|
|
#include "menu.h"
|
1998-09-16 02:39:15 +00:00
|
|
|
#include "packet.h"
|
|
|
|
#include "file.h"
|
|
|
|
#include "util.h"
|
|
|
|
|
|
|
|
extern GtkWidget *packet_list, *prog_bar, *info_bar, *byte_view, *tree_view;
|
|
|
|
extern guint file_ctx;
|
|
|
|
|
1998-12-29 04:05:38 +00:00
|
|
|
static guint32 firstsec, firstusec;
|
1998-09-27 22:12:47 +00:00
|
|
|
static guint32 lastsec, lastusec;
|
1998-09-16 02:39:15 +00:00
|
|
|
|
1998-11-15 05:29:17 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
|
|
|
static void wtap_dispatch_cb(u_char *, const struct wtap_pkthdr *, int,
|
|
|
|
const u_char *);
|
|
|
|
#else
|
|
|
|
static void pcap_dispatch_cb(u_char *, const struct pcap_pkthdr *,
|
|
|
|
const u_char *);
|
|
|
|
#endif
|
|
|
|
|
1998-09-16 02:39:15 +00:00
|
|
|
int
|
|
|
|
open_cap_file(char *fname, capture_file *cf) {
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifndef WITH_WIRETAP
|
1998-09-16 02:39:15 +00:00
|
|
|
guint32 magic[2];
|
|
|
|
char err_str[PCAP_ERRBUF_SIZE];
|
1998-11-15 05:29:17 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
struct stat cf_stat;
|
|
|
|
|
|
|
|
/* First, make sure the file is valid */
|
|
|
|
if (stat(fname, &cf_stat)) {
|
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "File does not exist.");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (! S_ISREG(cf_stat.st_mode) && ! S_ISFIFO(cf_stat.st_mode)) {
|
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "The file you have chosen is invalid.");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Next, try to open the file */
|
|
|
|
cf->fh = fopen(fname, "r");
|
|
|
|
if (cf->fh == NULL)
|
|
|
|
return (errno);
|
|
|
|
|
|
|
|
fseek(cf->fh, 0L, SEEK_END);
|
|
|
|
cf->f_len = ftell(cf->fh);
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifndef WITH_WIRETAP
|
1998-09-16 02:39:15 +00:00
|
|
|
fseek(cf->fh, 0L, SEEK_SET);
|
|
|
|
fread(magic, sizeof(guint32), 2, cf->fh);
|
|
|
|
fseek(cf->fh, 0L, SEEK_SET);
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
fclose(cf->fh);
|
|
|
|
cf->fh = NULL;
|
1998-09-17 03:12:28 +00:00
|
|
|
/* set the file name beacuse we need it to set the follow stream filter */
|
1998-09-25 23:24:07 +00:00
|
|
|
cf->filename = g_strdup( fname );
|
1998-09-17 03:12:28 +00:00
|
|
|
|
1998-09-16 02:39:15 +00:00
|
|
|
/* Next, find out what type of file we're dealing with */
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
|
|
|
cf->cd_t = WTAP_FILE_UNKNOWN;
|
|
|
|
cf->lnk_t = WTAP_ENCAP_NONE;
|
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
cf->cd_t = CD_UNKNOWN;
|
|
|
|
cf->lnk_t = DLT_NULL;
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
cf->swap = 0;
|
|
|
|
cf->count = 0;
|
|
|
|
cf->drops = 0;
|
|
|
|
cf->esec = 0;
|
|
|
|
cf->eusec = 0;
|
|
|
|
cf->snap = 0;
|
|
|
|
if (cf->plist == NULL) {
|
|
|
|
cf->plist = g_list_alloc();
|
|
|
|
cf->plist->data = (frame_data *) g_malloc(sizeof(frame_data));
|
|
|
|
} else {
|
|
|
|
cf->plist = g_list_first(cf->plist);
|
|
|
|
}
|
1998-12-29 04:05:38 +00:00
|
|
|
firstsec = 0, firstusec = 0;
|
1998-09-27 22:12:47 +00:00
|
|
|
lastsec = 0, lastusec = 0;
|
1998-11-12 00:06:47 +00:00
|
|
|
|
|
|
|
#ifndef WITH_WIRETAP
|
1998-09-16 02:39:15 +00:00
|
|
|
if (magic[0] == PCAP_MAGIC || magic[0] == SWAP32(PCAP_MAGIC)) {
|
|
|
|
|
|
|
|
/* Pcap/Tcpdump file */
|
|
|
|
cf->pfh = pcap_open_offline(fname, err_str);
|
|
|
|
if (cf->pfh == NULL) {
|
1998-11-12 00:06:47 +00:00
|
|
|
#else
|
|
|
|
cf->wth = wtap_open_offline(fname, WTAP_FILE_UNKNOWN);
|
|
|
|
if (cf->wth == NULL) {
|
|
|
|
#endif
|
|
|
|
|
1998-09-16 02:39:15 +00:00
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "Could not open file.");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifndef WITH_WIRETAP
|
1998-10-12 01:40:57 +00:00
|
|
|
if (cf->dfilter) {
|
|
|
|
if (pcap_compile(cf->pfh, &cf->fcode, cf->dfilter, 1, 0) < 0) {
|
1998-10-13 02:10:57 +00:00
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "Unable to parse filter string "
|
1998-10-12 01:40:57 +00:00
|
|
|
"\"%s\".", cf->dfilter);
|
1998-09-16 02:39:15 +00:00
|
|
|
} else if (pcap_setfilter(cf->pfh, &cf->fcode) < 0) {
|
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "Can't install filter.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cf->fh = pcap_file(cf->pfh);
|
|
|
|
cf->swap = pcap_is_swapped(cf->pfh);
|
|
|
|
if ((cf->swap && BYTE_ORDER == BIG_ENDIAN) ||
|
|
|
|
(!cf->swap && BYTE_ORDER == LITTLE_ENDIAN)) {
|
|
|
|
/* Data is big-endian */
|
|
|
|
cf->cd_t = CD_PCAP_BE;
|
|
|
|
} else {
|
|
|
|
cf->cd_t = CD_PCAP_LE;
|
|
|
|
}
|
|
|
|
cf->vers = ( ((pcap_major_version(cf->pfh) & 0x0000ffff) << 16) |
|
|
|
|
pcap_minor_version(cf->pfh) );
|
|
|
|
cf->snap = pcap_snapshot(cf->pfh);
|
|
|
|
cf->lnk_t = pcap_datalink(cf->pfh);
|
|
|
|
} else if (ntohl(magic[0]) == SNOOP_MAGIC_1 && ntohl(magic[1]) == SNOOP_MAGIC_2) {
|
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "The snoop format is not yet supported.");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cf->cd_t == CD_UNKNOWN) {
|
|
|
|
simple_dialog(ESD_TYPE_WARN, NULL, "Can't determine file type.");
|
|
|
|
return 1;
|
|
|
|
}
|
1998-11-12 00:06:47 +00:00
|
|
|
#else
|
|
|
|
cf->fh = wtap_file(cf->wth);
|
|
|
|
cf->cd_t = wtap_file_type(cf->wth);
|
|
|
|
cf->snap = wtap_snapshot_length(cf->wth);
|
|
|
|
cf->lnk_t = wtap_encapsulation(cf->wth);
|
|
|
|
#endif
|
|
|
|
|
1998-09-16 02:39:15 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reset everything to a pristine state */
|
|
|
|
void
|
|
|
|
close_cap_file(capture_file *cf, GtkWidget *w, guint context) {
|
|
|
|
if (cf->fh) {
|
|
|
|
fclose(cf->fh);
|
|
|
|
cf->fh = NULL;
|
|
|
|
}
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
|
|
|
if (cf->wth) {
|
|
|
|
wtap_close(cf->wth);
|
|
|
|
cf->wth = NULL;
|
|
|
|
}
|
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
if (cf->pfh) {
|
|
|
|
pcap_close(cf->pfh);
|
|
|
|
cf->pfh = NULL;
|
|
|
|
}
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
gtk_text_freeze(GTK_TEXT(byte_view));
|
|
|
|
gtk_text_set_point(GTK_TEXT(byte_view), 0);
|
|
|
|
gtk_text_forward_delete(GTK_TEXT(byte_view),
|
|
|
|
gtk_text_get_length(GTK_TEXT(byte_view)));
|
|
|
|
gtk_text_thaw(GTK_TEXT(byte_view));
|
|
|
|
gtk_tree_clear_items(GTK_TREE(tree_view), 0,
|
|
|
|
g_list_length(GTK_TREE(tree_view)->children));
|
|
|
|
|
|
|
|
gtk_clist_freeze(GTK_CLIST(packet_list));
|
|
|
|
gtk_clist_clear(GTK_CLIST(packet_list));
|
|
|
|
gtk_clist_thaw(GTK_CLIST(packet_list));
|
|
|
|
gtk_statusbar_pop(GTK_STATUSBAR(w), context);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
load_cap_file(char *fname, capture_file *cf) {
|
|
|
|
gchar *name_ptr, *load_msg, *load_fmt = " Loading: %s...";
|
1998-10-12 01:40:57 +00:00
|
|
|
gchar *done_fmt = " File: %s Drops: %d";
|
1998-09-16 02:39:15 +00:00
|
|
|
gchar *err_fmt = " Error: Could not load '%s'";
|
|
|
|
gint timeout;
|
|
|
|
size_t msg_len;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
close_cap_file(cf, info_bar, file_ctx);
|
|
|
|
|
|
|
|
if ((name_ptr = (gchar *) strrchr(fname, '/')) == NULL)
|
|
|
|
name_ptr = fname;
|
|
|
|
else
|
|
|
|
name_ptr++;
|
|
|
|
load_msg = g_malloc(strlen(name_ptr) + strlen(load_fmt) + 2);
|
|
|
|
sprintf(load_msg, load_fmt, name_ptr);
|
|
|
|
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
|
|
|
|
|
|
|
|
timeout = gtk_timeout_add(250, file_progress_cb, (gpointer) &cf);
|
|
|
|
|
|
|
|
err = open_cap_file(fname, cf);
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
|
|
|
if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {
|
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
if ((err == 0) && (cf->cd_t != CD_UNKNOWN)) {
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
gtk_clist_freeze(GTK_CLIST(packet_list));
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
1998-11-15 05:29:17 +00:00
|
|
|
wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf);
|
|
|
|
wtap_close(cf->wth);
|
|
|
|
cf->wth = NULL;
|
1998-11-12 00:06:47 +00:00
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
pcap_loop(cf->pfh, 0, pcap_dispatch_cb, (u_char *) cf);
|
|
|
|
pcap_close(cf->pfh);
|
|
|
|
cf->pfh = NULL;
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
cf->plist = g_list_first(cf->plist);
|
|
|
|
cf->fh = fopen(fname, "r");
|
|
|
|
gtk_clist_thaw(GTK_CLIST(packet_list));
|
|
|
|
}
|
|
|
|
|
|
|
|
gtk_timeout_remove(timeout);
|
|
|
|
gtk_progress_bar_update(GTK_PROGRESS_BAR(prog_bar), 0);
|
|
|
|
|
|
|
|
gtk_statusbar_pop(GTK_STATUSBAR(info_bar), file_ctx);
|
|
|
|
|
|
|
|
if (err == 0) {
|
1998-10-12 01:40:57 +00:00
|
|
|
msg_len = strlen(name_ptr) + strlen(done_fmt) + 64;
|
1998-09-16 02:39:15 +00:00
|
|
|
load_msg = g_realloc(load_msg, msg_len);
|
1998-10-12 01:45:17 +00:00
|
|
|
snprintf(load_msg, msg_len, done_fmt, name_ptr, cf->drops);
|
1998-09-16 02:39:15 +00:00
|
|
|
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
|
|
|
|
g_free(load_msg);
|
|
|
|
|
|
|
|
name_ptr[-1] = '\0';
|
1998-12-17 05:42:33 +00:00
|
|
|
#ifdef USE_ITEM
|
|
|
|
set_menu_sensitivity("/File/Close", TRUE);
|
|
|
|
set_menu_sensitivity("/File/Reload", TRUE);
|
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
set_menu_sensitivity("<Main>/File/Close", TRUE);
|
1998-10-12 01:40:57 +00:00
|
|
|
set_menu_sensitivity("<Main>/File/Reload", TRUE);
|
1998-12-17 05:42:33 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
} else {
|
|
|
|
msg_len = strlen(name_ptr) + strlen(err_fmt) + 2;
|
|
|
|
load_msg = g_realloc(load_msg, msg_len);
|
|
|
|
snprintf(load_msg, msg_len, err_fmt, name_ptr);
|
|
|
|
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
|
|
|
|
g_free(load_msg);
|
1998-12-17 05:42:33 +00:00
|
|
|
#ifdef USE_ITEM
|
1998-09-16 02:39:15 +00:00
|
|
|
set_menu_sensitivity("<Main>/File/Close", FALSE);
|
1998-10-12 01:40:57 +00:00
|
|
|
set_menu_sensitivity("<Main>/File/Reload", FALSE);
|
1998-12-17 05:42:33 +00:00
|
|
|
#else
|
|
|
|
set_menu_sensitivity("<Main>/File/Close", FALSE);
|
|
|
|
set_menu_sensitivity("<Main>/File/Reload", FALSE);
|
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
1998-11-15 05:29:17 +00:00
|
|
|
static void
|
1998-11-12 00:06:47 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
1998-11-15 05:29:17 +00:00
|
|
|
wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
|
1998-11-12 00:06:47 +00:00
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
pcap_dispatch_cb(u_char *user, const struct pcap_pkthdr *phdr,
|
1998-11-12 00:06:47 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
const u_char *buf) {
|
|
|
|
frame_data *fdata;
|
|
|
|
gint i, row;
|
|
|
|
capture_file *cf = (capture_file *) user;
|
|
|
|
|
|
|
|
while (gtk_events_pending())
|
|
|
|
gtk_main_iteration();
|
|
|
|
|
|
|
|
fdata = cf->plist->data;
|
|
|
|
cf->cur = fdata;
|
|
|
|
cf->count++;
|
|
|
|
|
|
|
|
fdata->pkt_len = phdr->len;
|
|
|
|
fdata->cap_len = phdr->caplen;
|
1998-11-15 05:29:17 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
|
|
|
fdata->file_off = offset;
|
|
|
|
#else
|
1998-09-16 02:39:15 +00:00
|
|
|
fdata->file_off = ftell(cf->fh) - phdr->caplen;
|
1998-11-15 05:29:17 +00:00
|
|
|
#endif
|
1998-12-29 04:05:38 +00:00
|
|
|
fdata->abs_secs = phdr->ts.tv_sec;
|
|
|
|
fdata->abs_usecs = phdr->ts.tv_usec;
|
1999-01-03 01:57:24 +00:00
|
|
|
#ifdef WITH_WIRETAP
|
1999-01-02 06:10:55 +00:00
|
|
|
fdata->lnk_t = phdr->pkt_encap;
|
1999-01-03 01:57:24 +00:00
|
|
|
#endif
|
1998-09-16 02:39:15 +00:00
|
|
|
|
1998-09-27 22:12:47 +00:00
|
|
|
/* If we don't have the time stamp of the first packet, it's because this
|
|
|
|
is the first packet. Save the time stamp of this packet as the time
|
|
|
|
stamp of the first packet. */
|
1998-12-29 04:05:38 +00:00
|
|
|
if (!firstsec && !firstusec) {
|
|
|
|
firstsec = fdata->abs_secs;
|
|
|
|
firstusec = fdata->abs_usecs;
|
1998-09-16 02:39:15 +00:00
|
|
|
}
|
1998-09-27 22:12:47 +00:00
|
|
|
|
|
|
|
/* Do the same for the time stamp of the previous packet. */
|
|
|
|
if (!lastsec && !lastusec) {
|
1998-12-29 04:05:38 +00:00
|
|
|
lastsec = fdata->abs_secs;
|
|
|
|
lastusec = fdata->abs_usecs;
|
1998-09-27 22:12:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Get the time elapsed between the first packet and this packet. */
|
1998-12-29 04:05:38 +00:00
|
|
|
cf->esec = fdata->abs_secs - firstsec;
|
|
|
|
if (firstusec <= fdata->abs_usecs) {
|
|
|
|
cf->eusec = fdata->abs_usecs - firstusec;
|
1998-09-16 02:39:15 +00:00
|
|
|
} else {
|
1998-12-29 04:05:38 +00:00
|
|
|
cf->eusec = (fdata->abs_usecs + 1000000) - firstusec;
|
1998-09-16 02:39:15 +00:00
|
|
|
cf->esec--;
|
|
|
|
}
|
1998-12-29 04:05:38 +00:00
|
|
|
fdata->rel_secs = cf->esec;
|
|
|
|
fdata->rel_usecs = cf->eusec;
|
|
|
|
|
|
|
|
/* Do the same for the previous packet */
|
|
|
|
fdata->del_secs = fdata->abs_secs - lastsec;
|
|
|
|
if (lastusec <= fdata->abs_usecs) {
|
|
|
|
fdata->del_usecs = fdata->abs_usecs - lastusec;
|
|
|
|
} else {
|
|
|
|
fdata->del_usecs = (fdata->abs_usecs + 1000000) - lastusec;
|
|
|
|
fdata->del_secs--;
|
1998-09-27 22:12:47 +00:00
|
|
|
}
|
1998-12-29 04:05:38 +00:00
|
|
|
lastsec = fdata->abs_secs;
|
|
|
|
lastusec = fdata->abs_usecs;
|
|
|
|
|
1998-11-17 04:29:13 +00:00
|
|
|
fdata->cinfo = &cf->cinfo;
|
|
|
|
for (i = 0; i < fdata->cinfo->num_cols; i++) {
|
|
|
|
fdata->cinfo->col_data[i][0] = '\0';
|
|
|
|
}
|
|
|
|
if (check_col(fdata, COL_NUMBER))
|
|
|
|
col_add_fstr(fdata, COL_NUMBER, "%d", cf->count);
|
1998-12-29 04:05:38 +00:00
|
|
|
dissect_packet(buf, fdata, NULL);
|
1998-11-17 04:29:13 +00:00
|
|
|
row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data);
|
|
|
|
fdata->cinfo = NULL;
|
1998-09-27 22:12:47 +00:00
|
|
|
|
1998-09-16 02:39:15 +00:00
|
|
|
/* Make sure we always have an available list entry */
|
|
|
|
if (cf->plist->next == NULL) {
|
|
|
|
fdata = (frame_data *) g_malloc(sizeof(frame_data));
|
|
|
|
g_list_append(cf->plist, (gpointer) fdata);
|
|
|
|
}
|
|
|
|
cf->plist = cf->plist->next;
|
|
|
|
}
|