Have "close_cap_file()" disable all menu items that make sense only if

you have a capture.

Leave the job of enabling and disabling menu items that make sense only
if you have a capture (except for "File/Save" and "File/Save As...", for
now) up to "load_cap_file()", "close_cap_file()", and the like - don't
scatter that stuff throughout the code.

Disable "File/Print Packet" if no packet is selected; enable it only if
a packet is selected.

If there's a selected packet, and a display filter is run:

	if the selected packet passed the filter, re-select it;

	if the selected packet didn't pass the filter, un-select it.

If we've opened a live "pcap" capture, but can't do the capture because
we can't get the netmask info, or can't parse the capture filter string,
or can't install the filter, close the live capture and the dump and
delete the dump file.

If we failed to open a live "pcap" capture, don't try to read the
capture file - it doesn't exist.

svn path=/trunk/; revision=384
This commit is contained in:
Guy Harris 1999-07-24 02:42:52 +00:00
parent 22c9ec90c8
commit 520e977a5b
5 changed files with 79 additions and 48 deletions

View File

@ -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

View File

@ -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;

74
file.c
View File

@ -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
*/

5
file.h
View File

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

3
menu.c
View File

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