Added "Capture" and "Display" menus; "Capture" has a "Start" item, which

is the same as "Tools/Capture", and "Display" has an "Options" item,
which pops up a dialog box to let you change the "default" time-stamp
column display format on the fly (the "default" is what the "-t"
command-line option sets), and have the display change when you do that.

Made infrastructure changes to make the immediate display update work.

Removed some unused functions, declared some functions used only in the
file in which they're defined "static", and removed some unnecessary
#includes.

svn path=/trunk/; revision=317
This commit is contained in:
Guy Harris 1999-06-19 01:14:51 +00:00
parent 6a971ea03c
commit 88e94a0186
13 changed files with 387 additions and 169 deletions

View File

@ -11,6 +11,8 @@ ethereal_SOURCES = \
column.c \
column.h \
config.h \
display.c \
display.h \
ethereal.c \
ethereal.h \
ethertype.c \

View File

@ -82,7 +82,7 @@ man_MANS = ethereal.1
sysconf_DATA = manuf
ethereal_SOURCES = alignment.h capture.c capture.h column.c column.h config.h ethereal.c ethereal.h ethertype.c etypes.h file.c file.h filter.c filter.h follow.c follow.h gtkpacket.c gtkpacket.h menu.c menu.h packet-aarp.c packet-arp.c packet-atalk.c packet-bootp.c packet-cdp.c packet-data.c packet-dns.c packet-dns.h packet-eth.c packet-fddi.c packet-ftp.c packet-giop.c packet-gre.c packet-http.c packet-icmpv6.c packet-ip.c packet-ip.h packet-ipsec.c packet-ipv6.c packet-ipv6.h packet-ipx.c packet-ipx.h packet-isakmp.c packet-llc.c packet-lpd.c packet-nbipx.c packet-nbns.c packet-ncp.c packet-ncp.h packet-nntp.c packet-null.c packet-osi.c packet-ospf.c packet-ospf.h packet-pop.c packet-ppp.c packet-pppoe.c packet-pptp.c packet-raw.c packet-rip.c packet-rip.h packet-rsvp.c packet-rsvp.h packet-smb.c packet-tcp.c packet-telnet.c packet-tftp.c packet-tr.c packet-trmac.c packet-udp.c packet-vines.c packet-vines.h packet.c packet.h prefs.c prefs.h print.c print.h ps.c ps.h resolv.c resolv.h smb.h util.c util.h
ethereal_SOURCES = alignment.h capture.c capture.h column.c column.h config.h display.c display.h ethereal.c ethereal.h ethertype.c etypes.h file.c file.h filter.c filter.h follow.c follow.h gtkpacket.c gtkpacket.h menu.c menu.h packet-aarp.c packet-arp.c packet-atalk.c packet-bootp.c packet-cdp.c packet-data.c packet-dns.c packet-dns.h packet-eth.c packet-fddi.c packet-ftp.c packet-giop.c packet-gre.c packet-http.c packet-icmpv6.c packet-ip.c packet-ip.h packet-ipsec.c packet-ipv6.c packet-ipv6.h packet-ipx.c packet-ipx.h packet-isakmp.c packet-llc.c packet-lpd.c packet-nbipx.c packet-nbns.c packet-ncp.c packet-ncp.h packet-nntp.c packet-null.c packet-osi.c packet-ospf.c packet-ospf.h packet-pop.c packet-ppp.c packet-pppoe.c packet-pptp.c packet-raw.c packet-rip.c packet-rip.h packet-rsvp.c packet-rsvp.h packet-smb.c packet-tcp.c packet-telnet.c packet-tftp.c packet-tr.c packet-trmac.c packet-udp.c packet-vines.c packet-vines.h packet.c packet.h prefs.c prefs.h print.c print.h ps.c ps.h resolv.c resolv.h smb.h util.c util.h
EXTRA_ethereal_SOURCES = packet-snmp.c snprintf.c snprintf.h snprintf-imp.h strerror.c strerror.h
@ -109,8 +109,8 @@ DEFS = @DEFS@ -I. -I$(srcdir) -I.
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
ethereal_OBJECTS = capture.o column.o ethereal.o ethertype.o file.o \
filter.o follow.o gtkpacket.o menu.o packet-aarp.o packet-arp.o \
ethereal_OBJECTS = capture.o column.o display.o ethereal.o ethertype.o \
file.o filter.o follow.o gtkpacket.o menu.o packet-aarp.o packet-arp.o \
packet-atalk.o packet-bootp.o packet-cdp.o packet-data.o packet-dns.o \
packet-eth.o packet-fddi.o packet-ftp.o packet-giop.o packet-gre.o \
packet-http.o packet-icmpv6.o packet-ip.o packet-ipsec.o packet-ipv6.o \
@ -141,25 +141,26 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP_ENV = --best
DEP_FILES = .deps/capture.P .deps/column.P .deps/ethereal.P \
.deps/ethertype.P .deps/file.P .deps/filter.P .deps/follow.P \
.deps/gtkpacket.P .deps/menu.P .deps/packet-aarp.P .deps/packet-arp.P \
.deps/packet-atalk.P .deps/packet-bootp.P .deps/packet-cdp.P \
.deps/packet-data.P .deps/packet-dns.P .deps/packet-eth.P \
.deps/packet-fddi.P .deps/packet-ftp.P .deps/packet-giop.P \
.deps/packet-gre.P .deps/packet-http.P .deps/packet-icmpv6.P \
.deps/packet-ip.P .deps/packet-ipsec.P .deps/packet-ipv6.P \
.deps/packet-ipx.P .deps/packet-isakmp.P .deps/packet-llc.P \
.deps/packet-lpd.P .deps/packet-nbipx.P .deps/packet-nbns.P \
.deps/packet-ncp.P .deps/packet-nntp.P .deps/packet-null.P \
.deps/packet-osi.P .deps/packet-ospf.P .deps/packet-pop.P \
.deps/packet-ppp.P .deps/packet-pppoe.P .deps/packet-pptp.P \
.deps/packet-raw.P .deps/packet-rip.P .deps/packet-rsvp.P \
.deps/packet-smb.P .deps/packet-snmp.P .deps/packet-tcp.P \
.deps/packet-telnet.P .deps/packet-tftp.P .deps/packet-tr.P \
.deps/packet-trmac.P .deps/packet-udp.P .deps/packet-vines.P \
.deps/packet.P .deps/prefs.P .deps/print.P .deps/ps.P .deps/resolv.P \
.deps/snprintf.P .deps/strerror.P .deps/util.P
DEP_FILES = .deps/capture.P .deps/column.P .deps/display.P \
.deps/ethereal.P .deps/ethertype.P .deps/file.P .deps/filter.P \
.deps/follow.P .deps/gtkpacket.P .deps/menu.P .deps/packet-aarp.P \
.deps/packet-arp.P .deps/packet-atalk.P .deps/packet-bootp.P \
.deps/packet-cdp.P .deps/packet-data.P .deps/packet-dns.P \
.deps/packet-eth.P .deps/packet-fddi.P .deps/packet-ftp.P \
.deps/packet-giop.P .deps/packet-gre.P .deps/packet-http.P \
.deps/packet-icmpv6.P .deps/packet-ip.P .deps/packet-ipsec.P \
.deps/packet-ipv6.P .deps/packet-ipx.P .deps/packet-isakmp.P \
.deps/packet-llc.P .deps/packet-lpd.P .deps/packet-nbipx.P \
.deps/packet-nbns.P .deps/packet-ncp.P .deps/packet-nntp.P \
.deps/packet-null.P .deps/packet-osi.P .deps/packet-ospf.P \
.deps/packet-pop.P .deps/packet-ppp.P .deps/packet-pppoe.P \
.deps/packet-pptp.P .deps/packet-raw.P .deps/packet-rip.P \
.deps/packet-rsvp.P .deps/packet-smb.P .deps/packet-snmp.P \
.deps/packet-tcp.P .deps/packet-telnet.P .deps/packet-tftp.P \
.deps/packet-tr.P .deps/packet-trmac.P .deps/packet-udp.P \
.deps/packet-vines.P .deps/packet.P .deps/prefs.P .deps/print.P \
.deps/ps.P .deps/resolv.P .deps/snprintf.P .deps/strerror.P \
.deps/util.P
SOURCES = $(ethereal_SOURCES) $(EXTRA_ethereal_SOURCES)
OBJECTS = $(ethereal_OBJECTS)

View File

@ -1,7 +1,7 @@
/* capture.c
* Routines for packet capture windows
*
* $Id: capture.c,v 1.26 1999/06/12 09:10:19 guy Exp $
* $Id: capture.c,v 1.27 1999/06/19 01:14:48 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -81,10 +81,6 @@ extern int sync_mode;
extern int sigusr2_received;
extern int quit_after_cap;
/* File selection data keys */
#define E_CAP_PREP_FS_KEY "cap_prep_fs"
#define E_CAP_PREP_TE_KEY "cap_prep_te"
/* Capture callback data keys */
#define E_CAP_IFACE_KEY "cap_iface"
#define E_CAP_FILT_KEY "cap_filter"
@ -95,7 +91,14 @@ extern int quit_after_cap;
/* Capture filter key */
#define E_CAP_FILT_TE_KEY "cap_filt_te"
GList *
static void capture_prep_ok_cb(GtkWidget *, gpointer);
static void capture_prep_close_cb(GtkWidget *, gpointer);
static float pct(gint, gint);
static void capture_stop_cb(GtkWidget *, gpointer);
static void capture_pcap_cb(u_char *, const struct pcap_pkthdr *,
const u_char *);
static GList *
get_interface_list() {
GList *il = NULL;
struct ifreq *ifr, *last;
@ -285,47 +288,7 @@ capture_prep_cb(GtkWidget *w, gpointer d) {
gtk_widget_show(cap_open_w);
}
void
capture_prep_file_cb(GtkWidget *w, gpointer te) {
GtkWidget *fs;
fs = gtk_file_selection_new ("Ethereal: Open Save File");
gtk_object_set_data(GTK_OBJECT(w), E_CAP_PREP_FS_KEY, fs);
gtk_object_set_data(GTK_OBJECT(w), E_CAP_PREP_TE_KEY, (GtkWidget *) te);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button),
"clicked", (GtkSignalFunc) cap_prep_fs_ok_cb, w);
/* Connect the cancel_button to destroy the widget */
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->cancel_button),
"clicked", (GtkSignalFunc) cap_prep_fs_cancel_cb, w);
gtk_widget_show(fs);
}
void
cap_prep_fs_ok_cb(GtkWidget *w, gpointer data) {
GtkWidget *fs, *te;
fs = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_PREP_FS_KEY);
te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_PREP_TE_KEY);
gtk_entry_set_text(GTK_ENTRY(te),
gtk_file_selection_get_filename (GTK_FILE_SELECTION(fs)));
cap_prep_fs_cancel_cb(w, data);
}
void
cap_prep_fs_cancel_cb(GtkWidget *w, gpointer data) {
GtkWidget *fs;
fs = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_PREP_FS_KEY);
gtk_widget_destroy(fs);
}
void
static void
capture_prep_ok_cb(GtkWidget *w, gpointer data) {
GtkWidget *if_cb, *filter_te, *count_cb, *snap_sb;
@ -428,7 +391,7 @@ capture_prep_ok_cb(GtkWidget *w, gpointer data) {
capture();
}
void
static void
capture_prep_close_cb(GtkWidget *w, gpointer win) {
#ifdef GTK_HAVE_FEATURES_1_1_0
@ -609,7 +572,7 @@ capture(void) {
#endif
}
float
static float
pct(gint num, gint denom) {
if (denom) {
return (float) num * 100.0 / (float) denom;
@ -618,14 +581,14 @@ pct(gint num, gint denom) {
}
}
void
static void
capture_stop_cb(GtkWidget *w, gpointer data) {
loop_data *ld = (loop_data *) data;
ld->go = FALSE;
}
void
static void
capture_pcap_cb(u_char *user, const struct pcap_pkthdr *phdr,
const u_char *pd) {

View File

@ -1,7 +1,7 @@
/* capture.h
* Definitions for packet capture windows
*
* $Id: capture.h,v 1.6 1999/05/11 18:51:09 deniel Exp $
* $Id: capture.h,v 1.7 1999/06/19 01:14:49 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -36,16 +36,7 @@ typedef struct _loop_data {
pcap_dumper_t *pdh;
} loop_data;
GList *get_interface_list();
void capture_prep_cb(GtkWidget *, gpointer);
void capture_prep_file_cb(GtkWidget *, gpointer);
void cap_prep_fs_ok_cb(GtkWidget *, gpointer);
void cap_prep_fs_cancel_cb(GtkWidget *, gpointer);
void capture_prep_ok_cb(GtkWidget *, gpointer);
void capture_prep_close_cb(GtkWidget *, gpointer);
void capture(void);
float pct(gint, gint);
void capture_stop_cb(GtkWidget *, gpointer);
void capture_pcap_cb(u_char *, const struct pcap_pkthdr *, const u_char *);
#endif /* capture.h */

View File

@ -1,7 +1,7 @@
/* column.c
* Routines for handling column preferences
*
* $Id: column.c,v 1.10 1999/03/23 03:14:32 gram Exp $
* $Id: column.c,v 1.11 1999/06/19 01:14:49 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -39,7 +39,7 @@
#include <unistd.h>
#include <sys/stat.h>
#include "ethereal.h"
#include "timestamp.h"
#include "prefs.h"
#include "column.h"
#include "packet.h"
@ -118,19 +118,6 @@ get_column_format_matches(gboolean *fmt_list, gint format) {
fmt_list[i] = TRUE;
/* Get any formats lower down on the chain */
switch (format) {
case COL_CLS_TIME:
switch (timestamp_type) {
case ABSOLUTE:
fmt_list[COL_ABS_TIME] = TRUE;
break;
case DELTA:
fmt_list[COL_DELTA_TIME] = TRUE;
break;
default:
fmt_list[COL_REL_TIME] = TRUE;
break;
}
break;
case COL_DEF_SRC:
fmt_list[COL_RES_DL_SRC] = TRUE;
fmt_list[COL_RES_NET_SRC] = TRUE;

177
display.c Normal file
View File

@ -0,0 +1,177 @@
/* display.c
* Routines for packet display windows
*
* $Id: display.c,v 1.1 1999/06/19 01:14:47 guy Exp $
*
* 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
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#include <gtk/gtk.h>
#include <pcap.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>
#include <errno.h>
#ifdef NEED_SNPRINTF_H
# ifdef HAVE_STDARG_H
# include <stdarg.h>
# else
# include <varargs.h>
# endif
# include "snprintf.h"
#endif
#ifdef HAVE_SYS_SOCKIO_H
# include <sys/sockio.h>
#endif
#include "timestamp.h"
#include "packet.h"
#include "file.h"
#include "display.h"
extern capture_file cf;
/* Display callback data keys */
#define E_DISPLAY_TIME_ABS_KEY "display_time_abs"
#define E_DISPLAY_TIME_REL_KEY "display_time_rel"
#define E_DISPLAY_TIME_DELTA_KEY "display_time_delta"
static void display_opt_ok_cb(GtkWidget *, gpointer);
static void display_opt_close_cb(GtkWidget *, gpointer);
void
display_opt_cb(GtkWidget *w, gpointer d) {
GtkWidget *display_opt_w, *button, *main_vb, *bbox, *ok_bt, *cancel_bt;
display_opt_w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(display_opt_w), "Ethereal: Display Options");
/* Container for each row of widgets */
main_vb = gtk_vbox_new(FALSE, 3);
gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
gtk_container_add(GTK_CONTAINER(display_opt_w), main_vb);
gtk_widget_show(main_vb);
button = gtk_radio_button_new_with_label(NULL, "Time of day");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
(timestamp_type == ABSOLUTE));
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_TIME_ABS_KEY,
button);
gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
gtk_widget_show(button);
button = gtk_radio_button_new_with_label(
gtk_radio_button_group(GTK_RADIO_BUTTON(button)),
"Seconds since beginning of capture");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
(timestamp_type == RELATIVE));
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_TIME_REL_KEY,
button);
gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
gtk_widget_show(button);
button = gtk_radio_button_new_with_label(
gtk_radio_button_group(GTK_RADIO_BUTTON(button)),
"Seconds since previous frame");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
(timestamp_type == DELTA));
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_TIME_DELTA_KEY,
button);
gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
gtk_widget_show(button);
/* Button row: OK and cancel buttons */
bbox = gtk_hbutton_box_new();
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
gtk_container_add(GTK_CONTAINER(main_vb), bbox);
gtk_widget_show(bbox);
ok_bt = gtk_button_new_with_label ("OK");
gtk_signal_connect_object(GTK_OBJECT(ok_bt), "clicked",
GTK_SIGNAL_FUNC(display_opt_ok_cb), GTK_OBJECT(display_opt_w));
GTK_WIDGET_SET_FLAGS(ok_bt, GTK_CAN_DEFAULT);
gtk_box_pack_start (GTK_BOX (bbox), ok_bt, TRUE, TRUE, 0);
gtk_widget_grab_default(ok_bt);
gtk_widget_show(ok_bt);
cancel_bt = gtk_button_new_with_label ("Cancel");
gtk_signal_connect_object(GTK_OBJECT(cancel_bt), "clicked",
GTK_SIGNAL_FUNC(display_opt_close_cb), GTK_OBJECT(display_opt_w));
GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT);
gtk_box_pack_start (GTK_BOX (bbox), cancel_bt, TRUE, TRUE, 0);
gtk_widget_show(cancel_bt);
gtk_widget_show(display_opt_w);
}
static void
display_opt_ok_cb(GtkWidget *w, gpointer data) {
GtkWidget *abs_rb, *rel_rb, *delta_rb;
#ifdef GTK_HAVE_FEATURES_1_1_0
data = w;
#endif
abs_rb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data),
E_DISPLAY_TIME_ABS_KEY);
rel_rb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data),
E_DISPLAY_TIME_REL_KEY);
delta_rb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data),
E_DISPLAY_TIME_DELTA_KEY);
if (GTK_TOGGLE_BUTTON (abs_rb)->active)
timestamp_type = ABSOLUTE;
if (GTK_TOGGLE_BUTTON (rel_rb)->active)
timestamp_type = RELATIVE;
if (GTK_TOGGLE_BUTTON (delta_rb)->active)
timestamp_type = DELTA;
gtk_widget_destroy(GTK_WIDGET(data));
redisplay_packets(&cf);
}
static void
display_opt_close_cb(GtkWidget *w, gpointer win) {
#ifdef GTK_HAVE_FEATURES_1_1_0
win = w;
#endif
gtk_grab_remove(GTK_WIDGET(win));
gtk_widget_destroy(GTK_WIDGET(win));
}

31
display.h Normal file
View File

@ -0,0 +1,31 @@
/* display.h
* Definitions for display option window
*
* $Id: display.h,v 1.1 1999/06/19 01:14:48 guy Exp $
*
* 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.
*/
#ifndef __DISPLAY_H__
#define __DISPLAY_H__
void display_opt_cb(GtkWidget *, gpointer);
#endif /* display.h */

View File

@ -1,6 +1,6 @@
/* ethereal.c
*
* $Id: ethereal.c,v 1.41 1999/06/15 04:48:56 guy Exp $
* $Id: ethereal.c,v 1.42 1999/06/19 01:14:49 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -72,6 +72,7 @@
#endif
#include "ethereal.h"
#include "timestamp.h"
#include "packet.h"
#include "capture.h"
#include "file.h"
@ -466,7 +467,7 @@ packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
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)));
l = g_list_nth(cf.plist_first, row);
l = g_list_nth(cf.plist, row);
if (l) {
fd = (frame_data *) l->data;
fseek(cf.fh, fd->file_off, SEEK_SET);
@ -601,7 +602,6 @@ main(int argc, char *argv[])
/* Initialize the capture file struct */
cf.plist = NULL;
cf.plist_first = NULL;
#ifdef WITH_WIRETAP
cf.wth = NULL;
#else

View File

@ -1,7 +1,7 @@
/* ethereal.h
* Global defines, etc.
*
* $Id: ethereal.h,v 1.13 1999/04/06 16:24:48 gram Exp $
* $Id: ethereal.h,v 1.14 1999/06/19 01:14:50 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -89,18 +89,6 @@ typedef struct _selection_info {
GtkWidget *text;
} selection_info;
/*
* Type of time-stamp shown in the summary display.
*/
typedef enum {
RELATIVE,
ABSOLUTE,
DELTA
} ts_type;
extern ts_type timestamp_type;
extern GtkStyle *item_style;
void about_ethereal( GtkWidget *, gpointer);

140
file.c
View File

@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
* $Id: file.c,v 1.28 1999/06/15 04:48:57 guy Exp $
* $Id: file.c,v 1.29 1999/06/19 01:14:50 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -135,13 +135,6 @@ open_cap_file(char *fname, capture_file *cf) {
cf->esec = 0;
cf->eusec = 0;
cf->snap = 0;
if (cf->plist == NULL) {
cf->plist = g_list_alloc();
cf->plist_first = cf->plist;
cf->plist->data = (frame_data *) g_malloc(sizeof(frame_data));
} else {
cf->plist = g_list_first(cf->plist);
}
firstsec = 0, firstusec = 0;
lastsec = 0, lastusec = 0;
@ -206,6 +199,12 @@ open_cap_file(char *fname, capture_file *cf) {
return (0);
}
static void
free_packets_cb(gpointer data, gpointer user_data)
{
g_free(data);
}
/* Reset everything to a pristine state */
void
close_cap_file(capture_file *cf, void *w, guint context) {
@ -215,15 +214,20 @@ close_cap_file(capture_file *cf, void *w, guint context) {
}
#ifdef WITH_WIRETAP
if (cf->wth) {
wtap_close(cf->wth);
cf->wth = NULL;
}
wtap_close(cf->wth);
cf->wth = NULL;
}
#else
if (cf->pfh) {
pcap_close(cf->pfh);
cf->pfh = NULL;
}
#endif
if (cf->plist) {
g_list_foreach(cf->plist, free_packets_cb, NULL);
g_list_free(cf->plist);
cf->plist = NULL;
}
gtk_text_freeze(GTK_TEXT(byte_view));
gtk_text_set_point(GTK_TEXT(byte_view), 0);
gtk_text_forward_delete(GTK_TEXT(byte_view),
@ -278,7 +282,6 @@ load_cap_file(char *fname, capture_file *cf) {
pcap_close(cf->pfh);
cf->pfh = NULL;
#endif
cf->plist = g_list_first(cf->plist);
cf->fh = fopen(fname, "r");
gtk_clist_thaw(GTK_CLIST(packet_list));
}
@ -357,18 +360,19 @@ cap_file_input_cb (gpointer data, gint source, GdkInputCondition condition) {
pcap_close(cf->pfh);
cf->pfh = NULL;
#endif
cf->plist = g_list_first(cf->plist);
#ifdef USE_ITEM
set_menu_sensitivity("/File/Open...", TRUE);
set_menu_sensitivity("/File/Close", TRUE);
set_menu_sensitivity("/File/Save As...", TRUE);
set_menu_sensitivity("/File/Reload", TRUE);
set_menu_sensitivity("/Capture/Start...", TRUE);
set_menu_sensitivity("/Tools/Capture...", TRUE);
#else
set_menu_sensitivity("<Main>/File/Open...", TRUE);
set_menu_sensitivity("<Main>/File/Close", TRUE);
set_menu_sensitivity("<Main>/File/Save As...", TRUE);
set_menu_sensitivity("<Main>/File/Reload", TRUE);
set_menu_sensitivity("<Main>/Capture/Start...", TRUE);
set_menu_sensitivity("<Main>/Tools/Capture...", TRUE);
#endif
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, " File: <none>");
@ -442,11 +446,13 @@ tail_cap_file(char *fname, capture_file *cf) {
set_menu_sensitivity("/File/Open...", FALSE);
set_menu_sensitivity("/File/Close", FALSE);
set_menu_sensitivity("/File/Reload", FALSE);
set_menu_sensitivity("/Capture/Start...", FALSE);
set_menu_sensitivity("/Tools/Capture...", FALSE);
#else
set_menu_sensitivity("<Main>/File/Open...", FALSE);
set_menu_sensitivity("<Main>/File/Close", FALSE);
set_menu_sensitivity("<Main>/File/Reload", FALSE);
set_menu_sensitivity("<Main>/Capture/Start...", FALSE);
set_menu_sensitivity("<Main>/Tools/Capture...", FALSE);
#endif
cf->fh = fopen(fname, "r");
@ -477,35 +483,10 @@ tail_cap_file(char *fname, capture_file *cf) {
return err;
}
static void
#ifdef WITH_WIRETAP
wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
#else
pcap_dispatch_cb(u_char *user, const struct pcap_pkthdr *phdr,
#endif
const u_char *buf) {
frame_data *fdata;
add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf)
{
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;
#ifdef WITH_WIRETAP
fdata->file_off = offset;
fdata->lnk_t = phdr->pkt_encap;
#else
fdata->file_off = ftell(pcap_file(cf->pfh)) - phdr->caplen;
#endif
fdata->abs_secs = phdr->ts.tv_sec;
fdata->abs_usecs = phdr->ts.tv_usec;
/* 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
@ -552,14 +533,81 @@ pcap_dispatch_cb(u_char *user, const struct pcap_pkthdr *phdr,
dissect_packet(buf, fdata, NULL);
row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data);
fdata->cinfo = NULL;
}
/* 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;
static void
#ifdef WITH_WIRETAP
wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
#else
pcap_dispatch_cb(u_char *user, const struct pcap_pkthdr *phdr,
#endif
const u_char *buf) {
frame_data *fdata;
capture_file *cf = (capture_file *) user;
while (gtk_events_pending())
gtk_main_iteration();
/* Allocate the next list entry, and add it to the list. */
fdata = (frame_data *) g_malloc(sizeof(frame_data));
cf->plist = g_list_append(cf->plist, (gpointer) fdata);
cf->cur = fdata;
cf->count++;
fdata->pkt_len = phdr->len;
fdata->cap_len = phdr->caplen;
#ifdef WITH_WIRETAP
fdata->file_off = offset;
fdata->lnk_t = phdr->pkt_encap;
#else
fdata->file_off = ftell(pcap_file(cf->pfh)) - phdr->caplen;
#endif
fdata->abs_secs = phdr->ts.tv_sec;
fdata->abs_usecs = phdr->ts.tv_usec;
add_packet_to_packet_list(fdata, cf, buf);
}
static void
redisplay_packets_cb(gpointer data, gpointer user_data)
{
frame_data *fd = data;
capture_file *cf = user_data;
cf->cur = fd;
cf->count++;
fseek(cf->fh, fd->file_off, SEEK_SET);
fread(cf->pd, sizeof(guint8), fd->cap_len, cf->fh);
add_packet_to_packet_list(fd, cf, cf->pd);
}
void
redisplay_packets(capture_file *cf)
{
/* Freeze the packet list while we redo it, so we don't get any
screen updates while it happens. */
gtk_clist_freeze(GTK_CLIST(packet_list));
/* Clear it out. */
gtk_clist_clear(GTK_CLIST(packet_list));
/*
* Iterate through the list of packets, calling a routine
* to run the filter on the packet, see if it matches, and
* put it in the display list if so.
*/
firstsec = 0;
firstusec = 0;
lastsec = 0;
lastusec = 0;
cf->count = 0;
g_list_foreach(cf->plist, redisplay_packets_cb, cf);
/* Unfreeze the packet list. */
gtk_clist_thaw(GTK_CLIST(packet_list));
}
/* Tries to mv a file. If unsuccessful, tries to cp the file.

7
file.h
View File

@ -1,7 +1,7 @@
/* file.h
* Definitions for file structures and routines
*
* $Id: file.h,v 1.14 1999/06/12 09:10:19 guy Exp $
* $Id: file.h,v 1.15 1999/06/19 01:14:51 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -92,9 +92,8 @@ typedef struct _capture_file {
*/
/*guint8 pd[MAX_PACKET_SIZE];*/ /* Packet data */
guint8 pd[65536]; /* Packet data */
GList *plist_first;/* First packet in list */
GList *plist; /* Packet list */
frame_data *cur; /* Current list item */
frame_data *cur; /* Frame data for current list item */
column_info cinfo; /* Column formatting information */
} capture_file;
@ -136,6 +135,8 @@ int load_cap_file(char *, capture_file *);
int tail_cap_file(char *, capture_file *);
/* size_t read_frame_header(capture_file *); */
void redisplay_packets(capture_file *cf);
/* Moves or copies a file. Returns 0 on failure, 1 on success */
int file_mv(char *from, char *to);

13
menu.c
View File

@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
* $Id: menu.c,v 1.19 1999/06/15 04:48:57 guy Exp $
* $Id: menu.c,v 1.20 1999/06/19 01:14:51 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -38,6 +38,7 @@
#include "menu.h"
#include "packet.h"
#include "capture.h"
#include "display.h"
#include "prefs.h"
#include "print.h"
#include "follow.h"
@ -93,8 +94,12 @@ static GtkItemFactoryEntry menu_items[] =
{"/Edit/Find", "<control>F", NULL, 0, NULL},
{"/Edit/<separator>", NULL, NULL, 0, "<Separator>"},
{"/Edit/_Preferences...", NULL, GTK_MENU_FUNC(prefs_cb), E_PR_PG_NONE, NULL},
{"/_Capture", NULL, NULL, 0, "<Branch>" },
{"/Capture/_Start...", "<control>K", GTK_MENU_FUNC(capture_prep_cb), 0, NULL},
{"/_Display", NULL, NULL, 0, "<Branch>" },
{"/Display/_Options...", NULL, GTK_MENU_FUNC(display_opt_cb), 0, NULL},
{"/_Tools", NULL, NULL, 0, "<Branch>" },
{"/Tools/_Capture...", "<control>K", GTK_MENU_FUNC(capture_prep_cb), 0, NULL},
{"/Tools/_Capture...", NULL, GTK_MENU_FUNC(capture_prep_cb), 0, NULL},
{"/Tools/_Follow TCP Stream", NULL, GTK_MENU_FUNC(follow_stream_cb), 0, NULL},
{"/Tools/Graph", NULL, NULL, 0, NULL},
{"/_Help", NULL, NULL, 0, "<LastBranch>" },
@ -126,7 +131,9 @@ static GtkMenuEntry menu_items[] =
{"<Main>/Edit/Find", "<control>F", NULL, NULL},
{"<Main>/Edit/<separator>", NULL, NULL, NULL},
{"<Main>/Edit/Preferences...", NULL, prefs_cb, (gpointer) E_PR_PG_NONE},
{"<Main>/Tools/Capture...", "<control>K", capture_prep_cb, NULL},
{"<Main>/Capture/Start...", "<control>K", capture_prep_cb, NULL},
{"<Main>/Display/Options...", NULL, display_opt_cb, NULL},
{"<Main>/Tools/Capture...", NULL, capture_prep_cb, NULL},
{"<Main>/Tools/Follow TCP Stream", NULL, follow_stream_cb, NULL},
{"<Main>/Tools/Graph", NULL, NULL, NULL},
{"<Main>/Help/About Ethereal...", NULL, about_ethereal, NULL}

View File

@ -1,7 +1,7 @@
/* packet.c
* Routines for packet disassembly
*
* $Id: packet.c,v 1.26 1999/06/12 04:21:08 guy Exp $
* $Id: packet.c,v 1.27 1999/06/19 01:14:51 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -50,6 +50,7 @@
#include "packet.h"
#include "file.h"
#include "timestamp.h"
extern capture_file cf;
@ -546,15 +547,36 @@ dissect_packet(const u_char *pd, frame_data *fd, proto_tree *tree)
time_t then;
/* Put in frame header information. */
if (check_col(fd, COL_CLS_TIME)) {
switch (timestamp_type) {
case ABSOLUTE:
then = fd->abs_secs;
tmp = localtime(&then);
col_add_fstr(fd, COL_CLS_TIME, "%02d:%02d:%02d.%04ld",
tmp->tm_hour,
tmp->tm_min,
tmp->tm_sec,
(long)fd->abs_usecs/100);
break;
case RELATIVE:
col_add_fstr(fd, COL_CLS_TIME, "%d.%06d", fd->rel_secs, fd->rel_usecs);
break;
case DELTA:
col_add_fstr(fd, COL_CLS_TIME, "%d.%06d", fd->del_secs, fd->del_usecs);
break;
}
}
if (check_col(fd, COL_ABS_TIME)) {
then = fd->abs_secs;
tmp = localtime(&then);
col_add_fstr(fd, COL_ABS_TIME, "%02d:%02d:%02d.%04ld",
tmp->tm_hour,
tmp->tm_min,
tmp->tm_min,
tmp->tm_sec,
(long)fd->abs_usecs/100);
}
}
if (check_col(fd, COL_REL_TIME)) {
col_add_fstr(fd, COL_REL_TIME, "%d.%06d", fd->rel_secs, fd->rel_usecs);
}