diff options
author | Guy Harris <guy@alum.mit.edu> | 1999-06-19 01:14:51 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 1999-06-19 01:14:51 +0000 |
commit | 88e94a01867460d7c9bb9fd124daf0e0ee118e7f (patch) | |
tree | 6244acb9dd3df334b8eb9e094912181a00de33e4 | |
parent | 6a971ea03c4d73bcf28ade8d63cd6879e662dfeb (diff) | |
download | wireshark-88e94a01867460d7c9bb9fd124daf0e0ee118e7f.tar.gz wireshark-88e94a01867460d7c9bb9fd124daf0e0ee118e7f.tar.bz2 wireshark-88e94a01867460d7c9bb9fd124daf0e0ee118e7f.zip |
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
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | Makefile.in | 45 | ||||
-rw-r--r-- | capture.c | 65 | ||||
-rw-r--r-- | capture.h | 11 | ||||
-rw-r--r-- | column.c | 17 | ||||
-rw-r--r-- | display.c | 177 | ||||
-rw-r--r-- | display.h | 31 | ||||
-rw-r--r-- | ethereal.c | 6 | ||||
-rw-r--r-- | ethereal.h | 14 | ||||
-rw-r--r-- | file.c | 140 | ||||
-rw-r--r-- | file.h | 7 | ||||
-rw-r--r-- | menu.c | 13 | ||||
-rw-r--r-- | packet.c | 28 |
13 files changed, 387 insertions, 169 deletions
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) @@ -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) { @@ -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 */ @@ -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; 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 <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)); +} 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 <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 */ 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 <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 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 <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); @@ -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. @@ -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); @@ -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} @@ -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); } |