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 @@ -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 @@ -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 @@ -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) { " "); } 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 @@ -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 @@ -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);