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