aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--capture.c22
-rw-r--r--ethereal.c23
-rw-r--r--file.c74
-rw-r--r--file.h5
-rw-r--r--menu.c3
5 files changed, 79 insertions, 48 deletions
diff --git a/capture.c b/capture.c
index 5d5db6197c..c87b499a51 100644
--- a/capture.c
+++ b/capture.c
@@ -1,7 +1,7 @@
/* capture.c
* Routines for packet capture windows
*
- * $Id: capture.c,v 1.34 1999/07/23 08:29:23 guy Exp $
+ * $Id: capture.c,v 1.35 1999/07/24 02:42:52 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -440,12 +440,21 @@ capture(void) {
if (pcap_lookupnet (cf.iface, &netnum, &netmask, err_str) < 0) {
simple_dialog(ESD_TYPE_WARN, NULL,
"Can't use filter: Couldn't obtain netmask info.");
+ pcap_dump_close(ld.pdh);
+ unlink(cf.save_file); /* silently ignore error */
+ pcap_close(pch);
return;
} else if (pcap_compile(pch, &cf.fcode, cf.cfilter, 1, netmask) < 0) {
simple_dialog(ESD_TYPE_WARN, NULL, "Unable to parse filter string.");
+ pcap_dump_close(ld.pdh);
+ unlink(cf.save_file); /* silently ignore error */
+ pcap_close(pch);
return;
} else if (pcap_setfilter(pch, &cf.fcode) < 0) {
simple_dialog(ESD_TYPE_WARN, NULL, "Can't install filter.");
+ pcap_dump_close(ld.pdh);
+ unlink(cf.save_file); /* silently ignore error */
+ pcap_close(pch);
return;
}
}
@@ -559,17 +568,18 @@ capture(void) {
gtk_exit(0);
}
- if (cf.save_file) {
+ if (pch) {
+ /* "pch" is non-NULL only if we successfully started a capture.
+ If we haven't, there's no capture file to load. */
err = load_cap_file(cf.save_file, &cf);
if (err != 0) {
simple_dialog(ESD_TYPE_WARN, NULL,
file_open_error_message(err, FALSE), cf.save_file);
+ } else {
+ set_menu_sensitivity("/File/Save", TRUE);
+ set_menu_sensitivity("/File/Save As...", FALSE);
}
}
- set_menu_sensitivity("/File/Save", TRUE);
- set_menu_sensitivity("/File/Save As...", FALSE);
- set_menu_sensitivity("/File/Print...", TRUE);
- set_menu_sensitivity("/Tools/Summary", TRUE);
}
static float
diff --git a/ethereal.c b/ethereal.c
index e014f2c74b..1b046d6e6b 100644
--- a/ethereal.c
+++ b/ethereal.c
@@ -1,6 +1,6 @@
/* ethereal.c
*
- * $Id: ethereal.c,v 1.60 1999/07/23 21:09:23 guy Exp $
+ * $Id: ethereal.c,v 1.61 1999/07/24 02:42:51 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -194,8 +194,6 @@ file_sel_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
g_free(cf_name);
set_menu_sensitivity("/File/Save", FALSE);
set_menu_sensitivity("/File/Save As...", TRUE);
- set_menu_sensitivity("/File/Print...", TRUE);
- set_menu_sensitivity("/Tools/Summary", TRUE);
}
/* Update the progress bar */
@@ -427,10 +425,6 @@ file_open_cmd_cb(GtkWidget *w, gpointer data) {
void
file_close_cmd_cb(GtkWidget *widget, gpointer data) {
close_cap_file(&cf, info_bar, file_ctx);
- set_menu_sensitivity("/File/Close", FALSE);
- set_menu_sensitivity("/File/Reload", FALSE);
- set_menu_sensitivity("/File/Print...", FALSE);
- set_menu_sensitivity("/Tools/Summary", FALSE);
}
void
@@ -892,6 +886,8 @@ packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
/* get the frame data struct pointer for this frame */
fd = (frame_data *) gtk_clist_get_row_data(GTK_CLIST(w), row);
+ cf.selected_packet = g_list_index(cf.plist, (gpointer)fd);
+ cf.selected_row = row;
fseek(cf.fh, fd->file_off, SEEK_SET);
fread(cf.pd, sizeof(guint8), fd->cap_len, cf.fh);
@@ -905,17 +901,14 @@ packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
proto_tree_draw(protocol_tree, tree_view);
packet_hex_print(GTK_TEXT(byte_view), cf.pd, fd->cap_len, -1, -1);
gtk_text_thaw(GTK_TEXT(byte_view));
+
+ /* A packet is selected, so "File/Print Packet" has something to print. */
+ set_menu_sensitivity("/File/Print Packet", TRUE);
}
void
packet_list_unselect_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
- gtk_text_freeze(GTK_TEXT(byte_view));
- gtk_text_set_point(GTK_TEXT(byte_view), 0);
- gtk_text_forward_delete(GTK_TEXT(byte_view),
- gtk_text_get_length(GTK_TEXT(byte_view)));
- gtk_text_thaw(GTK_TEXT(byte_view));
- gtk_tree_clear_items(GTK_TREE(tree_view), 0,
- g_list_length(GTK_TREE(tree_view)->children));
+ unselect_packet(&cf);
}
void
@@ -1376,8 +1369,6 @@ main(int argc, char *argv[])
}
cf_name[0] = '\0';
set_menu_sensitivity("/File/Save As...", TRUE);
- set_menu_sensitivity("/File/Print...", TRUE);
- set_menu_sensitivity("/Tools/Summary", TRUE);
}
/* If we failed to open the preferences file, pop up an alert box;
diff --git a/file.c b/file.c
index a68d2f9fd9..37e1830b02 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.42 1999/07/23 21:09:25 guy Exp $
+ * $Id: file.c,v 1.43 1999/07/24 02:42:50 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -166,18 +166,21 @@ close_cap_file(capture_file *cf, void *w, guint context) {
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),
- gtk_text_get_length(GTK_TEXT(byte_view)));
- gtk_text_thaw(GTK_TEXT(byte_view));
- gtk_tree_clear_items(GTK_TREE(tree_view), 0,
- g_list_length(GTK_TREE(tree_view)->children));
+ unselect_packet(cf); /* nothing to select */
gtk_clist_freeze(GTK_CLIST(packet_list));
gtk_clist_clear(GTK_CLIST(packet_list));
gtk_clist_thaw(GTK_CLIST(packet_list));
gtk_statusbar_pop(GTK_STATUSBAR(w), context);
+
+ /* Disable all menu items that make sense only if you have a capture. */
+ set_menu_sensitivity("/File/Save", FALSE);
+ set_menu_sensitivity("/File/Save As...", FALSE);
+ set_menu_sensitivity("/File/Close", FALSE);
+ set_menu_sensitivity("/File/Reload", FALSE);
+ set_menu_sensitivity("/File/Print...", FALSE);
+ set_menu_sensitivity("/Display/Options...", FALSE);
+ set_menu_sensitivity("/Tools/Summary", FALSE);
}
int
@@ -232,9 +235,12 @@ load_cap_file(char *fname, capture_file *cf) {
g_free(load_msg);
/* name_ptr[-1] = '\0'; Why is this here? It causes problems with capture files */
+
+ /* Enable menu items that make sense if you have a capture. */
set_menu_sensitivity("/File/Close", TRUE);
set_menu_sensitivity("/File/Reload", TRUE);
set_menu_sensitivity("/File/Print...", TRUE);
+ set_menu_sensitivity("/Display/Options...", TRUE);
set_menu_sensitivity("/Tools/Summary", TRUE);
} else {
msg_len = strlen(name_ptr) + strlen(err_fmt) + 2;
@@ -242,12 +248,6 @@ load_cap_file(char *fname, capture_file *cf) {
snprintf(load_msg, msg_len, err_fmt, name_ptr);
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
g_free(load_msg);
- set_menu_sensitivity("/File/Close", FALSE);
- set_menu_sensitivity("/File/Save", FALSE);
- set_menu_sensitivity("/File/Save As...", FALSE);
- set_menu_sensitivity("/File/Print...", FALSE);
- set_menu_sensitivity("/File/Reload", FALSE);
- set_menu_sensitivity("/Tools/Summary", FALSE);
}
return err;
}
@@ -359,12 +359,8 @@ tail_cap_file(char *fname, capture_file *cf) {
if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {
set_menu_sensitivity("/File/Open...", FALSE);
- set_menu_sensitivity("/File/Close", FALSE);
- set_menu_sensitivity("/File/Reload", FALSE);
- set_menu_sensitivity("/File/Print...", FALSE);
set_menu_sensitivity("/Capture/Start...", FALSE);
set_menu_sensitivity("/Tools/Capture...", FALSE);
- set_menu_sensitivity("/Tools/Summary", FALSE);
cf->fh = fopen(fname, "r");
tail_timeout_id = -1;
@@ -378,12 +374,6 @@ tail_cap_file(char *fname, capture_file *cf) {
" <live capture in progress>");
}
else {
- set_menu_sensitivity("/File/Close", FALSE);
- set_menu_sensitivity("/File/Save", FALSE);
- set_menu_sensitivity("/File/Save As...", FALSE);
- set_menu_sensitivity("/File/Reload", FALSE);
- set_menu_sensitivity("/File/Print...", FALSE);
- set_menu_sensitivity("/Tools/Summary", FALSE);
close(sync_pipe[0]);
}
return err;
@@ -457,6 +447,12 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf
if (fdata->passed_dfilter) {
row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data);
gtk_clist_set_row_data(GTK_CLIST(packet_list), row, fdata);
+
+ /* If this was the selected packet, remember the row it's in, so
+ we can re-select it. ("selected_packet" is 0-origin, as it's
+ a GList index; "count", however, is 1-origin.) */
+ if (cf->selected_packet == cf->count - 1)
+ cf->selected_row = row;
}
fdata->cinfo = NULL;
}
@@ -522,6 +518,10 @@ filter_packets(capture_file *cf)
/* Clear it out. */
gtk_clist_clear(GTK_CLIST(packet_list));
+ /* If a packet was selected, we don't know yet what row, if any, it'll
+ get. */
+ cf->selected_row = -1;
+
/*
* Iterate through the list of packets, calling a routine
* to run the filter on the packet, see if it matches, and
@@ -534,6 +534,14 @@ filter_packets(capture_file *cf)
cf->count = 0;
g_list_foreach(cf->plist, filter_packets_cb, cf);
+ if (cf->selected_row != -1) {
+ /* We had a selected packet and it passed the filter. */
+ gtk_clist_select_row(GTK_CLIST(packet_list), cf->selected_row, -1);
+ } else {
+ /* If we had one, it didn't pass the filter. */
+ unselect_packet(cf);
+ }
+
/* Unfreeze the packet list. */
gtk_clist_thaw(GTK_CLIST(packet_list));
}
@@ -667,6 +675,24 @@ change_time_formats(capture_file *cf)
gtk_clist_thaw(GTK_CLIST(packet_list));
}
+/* Unselect the selected packet, if any. */
+void
+unselect_packet(capture_file *cf)
+{
+ cf->selected_packet = -1; /* nothing there to be selected */
+ cf->selected_row = -1;
+ gtk_text_freeze(GTK_TEXT(byte_view));
+ gtk_text_set_point(GTK_TEXT(byte_view), 0);
+ gtk_text_forward_delete(GTK_TEXT(byte_view),
+ gtk_text_get_length(GTK_TEXT(byte_view)));
+ gtk_text_thaw(GTK_TEXT(byte_view));
+ gtk_tree_clear_items(GTK_TREE(tree_view), 0,
+ g_list_length(GTK_TREE(tree_view)->children));
+
+ /* No packet is selected, so "File/Print Packet" has nothing to print. */
+ set_menu_sensitivity("/File/Print Packet", FALSE);
+}
+
/* Tries to mv a file. If unsuccessful, tries to cp the file.
* Returns 0 on failure to do either, 1 on success of either
*/
diff --git a/file.h b/file.h
index 54cd456431..cebe6911a0 100644
--- a/file.h
+++ b/file.h
@@ -1,7 +1,7 @@
/* file.h
* Definitions for file structures and routines
*
- * $Id: file.h,v 1.21 1999/07/23 08:29:22 guy Exp $
+ * $Id: file.h,v 1.22 1999/07/24 02:42:50 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -76,6 +76,8 @@ typedef struct _capture_file {
guint8 pd[65536]; /* Packet data */
GList *plist; /* Packet list */
column_info cinfo; /* Column formatting information */
+ int selected_packet; /* Index in packet list of currently selected packet, if any */
+ int selected_row; /* Row in packet display of currently selected packet, if any */
FILE *print_fh; /* File we're printing to */
} capture_file;
@@ -101,6 +103,7 @@ int tail_cap_file(char *, capture_file *);
int print_packets(capture_file *cf, int to_file, const char *dest);
void filter_packets(capture_file *);
void change_time_formats(capture_file *);
+void unselect_packet(capture_file *);
/* 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 f0a55b788d..40405f38a4 100644
--- a/menu.c
+++ b/menu.c
@@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
- * $Id: menu.c,v 1.27 1999/07/23 08:29:23 guy Exp $
+ * $Id: menu.c,v 1.28 1999/07/24 02:42:52 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -144,6 +144,7 @@ menus_init(void) {
set_menu_sensitivity("/File/Save As...", FALSE);
set_menu_sensitivity("/File/Reload", FALSE);
set_menu_sensitivity("/File/Print...", FALSE);
+ set_menu_sensitivity("/File/Print Packet", FALSE);
set_menu_sensitivity("/Edit/Cut", FALSE);
set_menu_sensitivity("/Edit/Copy", FALSE);
set_menu_sensitivity("/Edit/Paste", FALSE);