From 88e94a01867460d7c9bb9fd124daf0e0ee118e7f Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sat, 19 Jun 1999 01:14:51 +0000 Subject: [PATCH] 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 --- Makefile.am | 2 + Makefile.in | 45 ++++++------- capture.c | 65 +++++-------------- capture.h | 11 +--- column.c | 17 +---- display.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++++++++ display.h | 31 +++++++++ ethereal.c | 6 +- ethereal.h | 14 +---- file.c | 140 +++++++++++++++++++++++++++-------------- file.h | 7 ++- menu.c | 13 +++- packet.c | 28 ++++++++- 13 files changed, 387 insertions(+), 169 deletions(-) create mode 100644 display.c create mode 100644 display.h diff --git a/Makefile.am b/Makefile.am index 40000f686c..99004846ea 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,6 +11,8 @@ ethereal_SOURCES = \ column.c \ column.h \ config.h \ + display.c \ + display.h \ ethereal.c \ ethereal.h \ ethertype.c \ diff --git a/Makefile.in b/Makefile.in index 22f1d45332..b8922fbfa1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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) diff --git a/capture.c b/capture.c index 58af109b1c..9d503083c8 100644 --- a/capture.c +++ b/capture.c @@ -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 @@ -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) { diff --git a/capture.h b/capture.h index 3ac4f9ae11..0a91971b30 100644 --- a/capture.h +++ b/capture.h @@ -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 @@ -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 */ diff --git a/column.c b/column.c index bb3d78a744..6ed6b5d8a5 100644 --- a/column.c +++ b/column.c @@ -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 @@ -39,7 +39,7 @@ #include #include -#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; diff --git a/display.c b/display.c new file mode 100644 index 0000000000..5c45a76de4 --- /dev/null +++ b/display.c @@ -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 + * 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 +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef NEED_SNPRINTF_H +# ifdef HAVE_STDARG_H +# include +# else +# include +# endif +# include "snprintf.h" +#endif + +#ifdef HAVE_SYS_SOCKIO_H +# include +#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)); +} diff --git a/display.h b/display.h new file mode 100644 index 0000000000..6d1a122bd7 --- /dev/null +++ b/display.h @@ -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 + * 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 */ diff --git a/ethereal.c b/ethereal.c index 1403a21ae0..9e7ffc03c1 100644 --- a/ethereal.c +++ b/ethereal.c @@ -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 @@ -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 diff --git a/ethereal.h b/ethereal.h index a5e8956164..f08ce534d8 100644 --- a/ethereal.h +++ b/ethereal.h @@ -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 @@ -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); diff --git a/file.c b/file.c index 49c5bf3b65..1dbd5ff565 100644 --- a/file.c +++ b/file.c @@ -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 @@ -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("
/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); #endif gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, " File: "); @@ -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("
/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); #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. diff --git a/file.h b/file.h index 0b96caa3e0..f80958a1a0 100644 --- a/file.h +++ b/file.h @@ -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 @@ -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); diff --git a/menu.c b/menu.c index c8f50f47aa..5fa7f395c7 100644 --- a/menu.c +++ b/menu.c @@ -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 @@ -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", "F", NULL, 0, NULL}, {"/Edit/", NULL, NULL, 0, ""}, {"/Edit/_Preferences...", NULL, GTK_MENU_FUNC(prefs_cb), E_PR_PG_NONE, NULL}, + {"/_Capture", NULL, NULL, 0, "" }, + {"/Capture/_Start...", "K", GTK_MENU_FUNC(capture_prep_cb), 0, NULL}, + {"/_Display", NULL, NULL, 0, "" }, + {"/Display/_Options...", NULL, GTK_MENU_FUNC(display_opt_cb), 0, NULL}, {"/_Tools", NULL, NULL, 0, "" }, - {"/Tools/_Capture...", "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, "" }, @@ -126,7 +131,9 @@ static GtkMenuEntry menu_items[] = {"
/Edit/Find", "F", NULL, NULL}, {"
/Edit/", NULL, NULL, NULL}, {"
/Edit/Preferences...", NULL, prefs_cb, (gpointer) E_PR_PG_NONE}, - {"
/Tools/Capture...", "K", capture_prep_cb, NULL}, + {"
/Capture/Start...", "K", capture_prep_cb, NULL}, + {"
/Display/Options...", NULL, display_opt_cb, NULL}, + {"
/Tools/Capture...", NULL, capture_prep_cb, NULL}, {"
/Tools/Follow TCP Stream", NULL, follow_stream_cb, NULL}, {"
/Tools/Graph", NULL, NULL, NULL}, {"
/Help/About Ethereal...", NULL, about_ethereal, NULL} diff --git a/packet.c b/packet.c index 22b838fbb0..1af50603a0 100644 --- a/packet.c +++ b/packet.c @@ -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 @@ -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); }