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 /* capture.c
* Routines for packet capture windows * 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 * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -440,12 +440,21 @@ capture(void) {
if (pcap_lookupnet (cf.iface, &netnum, &netmask, err_str) < 0) { if (pcap_lookupnet (cf.iface, &netnum, &netmask, err_str) < 0) {
simple_dialog(ESD_TYPE_WARN, NULL, simple_dialog(ESD_TYPE_WARN, NULL,
"Can't use filter: Couldn't obtain netmask info."); "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; return;
} else if (pcap_compile(pch, &cf.fcode, cf.cfilter, 1, netmask) < 0) { } else if (pcap_compile(pch, &cf.fcode, cf.cfilter, 1, netmask) < 0) {
simple_dialog(ESD_TYPE_WARN, NULL, "Unable to parse filter string."); 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; return;
} else if (pcap_setfilter(pch, &cf.fcode) < 0) { } else if (pcap_setfilter(pch, &cf.fcode) < 0) {
simple_dialog(ESD_TYPE_WARN, NULL, "Can't install filter."); 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; return;
} }
} }
@ -559,17 +568,18 @@ capture(void) {
gtk_exit(0); 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); err = load_cap_file(cf.save_file, &cf);
if (err != 0) { if (err != 0) {
simple_dialog(ESD_TYPE_WARN, NULL, simple_dialog(ESD_TYPE_WARN, NULL,
file_open_error_message(err, FALSE), cf.save_file); 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 static float

View File

@ -1,6 +1,6 @@
/* ethereal.c /* 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 * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -194,8 +194,6 @@ file_sel_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
g_free(cf_name); g_free(cf_name);
set_menu_sensitivity("/File/Save", FALSE); set_menu_sensitivity("/File/Save", FALSE);
set_menu_sensitivity("/File/Save As...", TRUE); set_menu_sensitivity("/File/Save As...", TRUE);
set_menu_sensitivity("/File/Print...", TRUE);
set_menu_sensitivity("/Tools/Summary", TRUE);
} }
/* Update the progress bar */ /* Update the progress bar */
@ -427,10 +425,6 @@ file_open_cmd_cb(GtkWidget *w, gpointer data) {
void void
file_close_cmd_cb(GtkWidget *widget, gpointer data) { file_close_cmd_cb(GtkWidget *widget, gpointer data) {
close_cap_file(&cf, info_bar, file_ctx); 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 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 */ /* get the frame data struct pointer for this frame */
fd = (frame_data *) gtk_clist_get_row_data(GTK_CLIST(w), row); 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); fseek(cf.fh, fd->file_off, SEEK_SET);
fread(cf.pd, sizeof(guint8), fd->cap_len, cf.fh); 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); proto_tree_draw(protocol_tree, tree_view);
packet_hex_print(GTK_TEXT(byte_view), cf.pd, fd->cap_len, -1, -1); packet_hex_print(GTK_TEXT(byte_view), cf.pd, fd->cap_len, -1, -1);
gtk_text_thaw(GTK_TEXT(byte_view)); 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 void
packet_list_unselect_cb(GtkWidget *w, gint row, gint col, gpointer evt) { packet_list_unselect_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
gtk_text_freeze(GTK_TEXT(byte_view)); unselect_packet(&cf);
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));
} }
void void
@ -1376,8 +1369,6 @@ main(int argc, char *argv[])
} }
cf_name[0] = '\0'; cf_name[0] = '\0';
set_menu_sensitivity("/File/Save As...", TRUE); 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; /* 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.c
* File I/O routines * 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 * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * 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); g_list_free(cf->plist);
cf->plist = NULL; cf->plist = NULL;
} }
gtk_text_freeze(GTK_TEXT(byte_view)); unselect_packet(cf); /* nothing to select */
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));
gtk_clist_freeze(GTK_CLIST(packet_list)); gtk_clist_freeze(GTK_CLIST(packet_list));
gtk_clist_clear(GTK_CLIST(packet_list)); gtk_clist_clear(GTK_CLIST(packet_list));
gtk_clist_thaw(GTK_CLIST(packet_list)); gtk_clist_thaw(GTK_CLIST(packet_list));
gtk_statusbar_pop(GTK_STATUSBAR(w), context); 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 int
@ -232,9 +235,12 @@ load_cap_file(char *fname, capture_file *cf) {
g_free(load_msg); g_free(load_msg);
/* name_ptr[-1] = '\0'; Why is this here? It causes problems with capture files */ /* 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/Close", TRUE);
set_menu_sensitivity("/File/Reload", TRUE); set_menu_sensitivity("/File/Reload", TRUE);
set_menu_sensitivity("/File/Print...", TRUE); set_menu_sensitivity("/File/Print...", TRUE);
set_menu_sensitivity("/Display/Options...", TRUE);
set_menu_sensitivity("/Tools/Summary", TRUE); set_menu_sensitivity("/Tools/Summary", TRUE);
} else { } else {
msg_len = strlen(name_ptr) + strlen(err_fmt) + 2; 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); snprintf(load_msg, msg_len, err_fmt, name_ptr);
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
g_free(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; return err;
} }
@ -359,12 +359,8 @@ tail_cap_file(char *fname, capture_file *cf) {
if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) { if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {
set_menu_sensitivity("/File/Open...", FALSE); 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("/Capture/Start...", FALSE);
set_menu_sensitivity("/Tools/Capture...", FALSE); set_menu_sensitivity("/Tools/Capture...", FALSE);
set_menu_sensitivity("/Tools/Summary", FALSE);
cf->fh = fopen(fname, "r"); cf->fh = fopen(fname, "r");
tail_timeout_id = -1; tail_timeout_id = -1;
@ -378,12 +374,6 @@ tail_cap_file(char *fname, capture_file *cf) {
" <live capture in progress>"); " <live capture in progress>");
} }
else { 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]); close(sync_pipe[0]);
} }
return err; 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) { if (fdata->passed_dfilter) {
row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data); row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data);
gtk_clist_set_row_data(GTK_CLIST(packet_list), row, fdata); 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; fdata->cinfo = NULL;
} }
@ -522,6 +518,10 @@ filter_packets(capture_file *cf)
/* Clear it out. */ /* Clear it out. */
gtk_clist_clear(GTK_CLIST(packet_list)); 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 * Iterate through the list of packets, calling a routine
* to run the filter on the packet, see if it matches, and * to run the filter on the packet, see if it matches, and
@ -534,6 +534,14 @@ filter_packets(capture_file *cf)
cf->count = 0; cf->count = 0;
g_list_foreach(cf->plist, filter_packets_cb, cf); 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. */ /* Unfreeze the packet list. */
gtk_clist_thaw(GTK_CLIST(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)); 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. /* Tries to mv a file. If unsuccessful, tries to cp the file.
* Returns 0 on failure to do either, 1 on success of either * Returns 0 on failure to do either, 1 on success of either
*/ */

5
file.h
View File

@ -1,7 +1,7 @@
/* file.h /* file.h
* Definitions for file structures and routines * 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 * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -76,6 +76,8 @@ typedef struct _capture_file {
guint8 pd[65536]; /* Packet data */ guint8 pd[65536]; /* Packet data */
GList *plist; /* Packet list */ GList *plist; /* Packet list */
column_info cinfo; /* Column formatting information */ 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 */ FILE *print_fh; /* File we're printing to */
} capture_file; } 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); int print_packets(capture_file *cf, int to_file, const char *dest);
void filter_packets(capture_file *); void filter_packets(capture_file *);
void change_time_formats(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 */ /* Moves or copies a file. Returns 0 on failure, 1 on success */
int file_mv(char *from, char *to); int file_mv(char *from, char *to);

3
menu.c
View File

@ -1,7 +1,7 @@
/* menu.c /* menu.c
* Menu routines * 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 * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -144,6 +144,7 @@ menus_init(void) {
set_menu_sensitivity("/File/Save As...", FALSE); set_menu_sensitivity("/File/Save As...", FALSE);
set_menu_sensitivity("/File/Reload", FALSE); set_menu_sensitivity("/File/Reload", FALSE);
set_menu_sensitivity("/File/Print...", FALSE); set_menu_sensitivity("/File/Print...", FALSE);
set_menu_sensitivity("/File/Print Packet", FALSE);
set_menu_sensitivity("/Edit/Cut", FALSE); set_menu_sensitivity("/Edit/Cut", FALSE);
set_menu_sensitivity("/Edit/Copy", FALSE); set_menu_sensitivity("/Edit/Copy", FALSE);
set_menu_sensitivity("/Edit/Paste", FALSE); set_menu_sensitivity("/Edit/Paste", FALSE);