diff options
Diffstat (limited to 'gtk/capture_dlg.c')
-rw-r--r-- | gtk/capture_dlg.c | 510 |
1 files changed, 330 insertions, 180 deletions
diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index 49eabe85e6..c8227ac13a 100644 --- a/gtk/capture_dlg.c +++ b/gtk/capture_dlg.c @@ -1,7 +1,7 @@ /* capture_dlg.c * Routines for packet capture windows * - * $Id: capture_dlg.c,v 1.57 2002/01/21 07:37:41 guy Exp $ + * $Id: capture_dlg.c,v 1.58 2002/02/08 10:07:38 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -64,21 +64,26 @@ /* Capture callback data keys */ #define E_CAP_IFACE_KEY "cap_iface" +#define E_CAP_SNAP_CB_KEY "cap_snap_cb" +#define E_CAP_SNAP_SB_KEY "cap_snap_sb" +#define E_CAP_PROMISC_KEY "cap_promisc" #define E_CAP_FILT_KEY "cap_filter_te" #define E_CAP_FILE_TE_KEY "cap_file_te" -#define E_CAP_COUNT_KEY "cap_count" -#define E_CAP_SNAP_KEY "cap_snap" -#define E_CAP_PROMISC_KEY "cap_promisc" +#define E_CAP_RING_ON_TB_KEY "cap_ringbuffer_on_tb" +#define E_CAP_RING_NBF_LB_KEY "cap_ringbuffer_nbf_lb" +#define E_CAP_RING_NBF_SB_KEY "cap_ringbuffer_nbf_sb" #define E_CAP_SYNC_KEY "cap_sync" #define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll" +#define E_CAP_COUNT_CB_KEY "cap_count_cb" +#define E_CAP_COUNT_SB_KEY "cap_count_sb" +#define E_CAP_FILESIZE_CB_KEY "cap_filesize_cb" +#define E_CAP_FILESIZE_SB_KEY "cap_filesize_sb" +#define E_CAP_FILESIZE_LB_KEY "cap_filesize_lb" +#define E_CAP_DURATION_CB_KEY "cap_duration_cb" +#define E_CAP_DURATION_SB_KEY "cap_duration_sb" #define E_CAP_M_RESOLVE_KEY "cap_m_resolve" #define E_CAP_N_RESOLVE_KEY "cap_n_resolve" #define E_CAP_T_RESOLVE_KEY "cap_t_resolve" -#define E_CAP_FILESIZE_KEY "cap_filesize" -#define E_CAP_DURATION_KEY "cap_duration" -#define E_CAP_RING_ON_TB_KEY "cap_ringbuffer_on_tb" -#define E_CAP_RING_NBF_LB_KEY "cap_ringbuffer_nbf_lb" -#define E_CAP_RING_NBF_SB_KEY "cap_ringbuffer_nbf_sb" #define E_FS_CALLER_PTR_KEY "fs_caller_ptr" #define E_FILE_SEL_DIALOG_PTR_KEY "file_sel_dialog_ptr" @@ -124,23 +129,28 @@ static GtkWidget *cap_open_w; void capture_prep_cb(GtkWidget *w, gpointer d) { - GtkWidget *if_cb, *if_lb, - *count_lb, *count_cb, *main_vb, - *filter_bt, *filter_te, - *file_bt, *file_te, - *filesize_lb, *filesize_cb, - *duration_lb, *duration_cb, - *caplen_hb, *table, - *bbox, *ok_bt, *cancel_bt, *snap_lb, - *snap_sb, *promisc_cb, *sync_cb, *auto_scroll_cb, + GtkWidget *main_vb, + *capture_fr, *capture_vb, + *if_hb, *if_cb, *if_lb, + *snap_hb, *snap_cb, *snap_sb, *snap_lb, + *promisc_cb, + *filter_hb, *filter_bt, *filter_te, + *file_fr, *file_vb, + *file_hb, *file_bt, *file_te, + *ringbuffer_hb, *ringbuffer_on_tb, *ringbuffer_nbf_lb, *ringbuffer_nbf_sb, + *display_fr, *display_vb, + *sync_cb, *auto_scroll_cb, + *limit_fr, *limit_vb, + *count_hb, *count_cb, *count_sb, *count_lb, + *filesize_hb, *filesize_cb, *filesize_sb, *filesize_lb, + *duration_hb, *duration_cb, *duration_sb, *duration_lb, + *resolv_fr, *resolv_vb, *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, - *ringbuffer_hb, *ringbuffer_on_tb, *ringbuffer_nbf_lb, *ringbuffer_nbf_sb; + *bbox, *ok_bt, *cancel_bt; GtkAccelGroup *accel_group; - GtkAdjustment *snap_adj, *ringbuffer_nbf_adj; - GList *if_list, *count_list = NULL, *filesize_list = NULL, *duration_list = NULL; - gchar *count_item1 = "0 (Infinite)", count_item2[16], - *filesize_item1 = "0 (Infinite)", filesize_item2[16], - *duration_item1 = "0 (Infinite)", duration_item2[16]; + GtkAdjustment *snap_adj, *ringbuffer_nbf_adj, + *count_adj, *filesize_adj, *duration_adj; + GList *if_list; int err; char err_str[PCAP_ERRBUF_SIZE]; @@ -195,17 +205,22 @@ capture_prep_cb(GtkWidget *w, gpointer d) gtk_container_add(GTK_CONTAINER(cap_open_w), main_vb); gtk_widget_show(main_vb); - /* Table : container of the first 6 rows */ - table = gtk_table_new (6, 2, FALSE); - gtk_table_set_row_spacings(GTK_TABLE (table), 5); - gtk_table_set_col_spacings(GTK_TABLE (table), 5); - gtk_container_add(GTK_CONTAINER(main_vb), table); - gtk_widget_show(table); + /* Capture-related options frame */ + capture_fr = gtk_frame_new("Capture"); + gtk_container_add(GTK_CONTAINER(main_vb), capture_fr); + gtk_widget_show(capture_fr); + + capture_vb = gtk_vbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb); + gtk_widget_show(capture_vb); /* Interface row */ - + if_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(capture_vb), if_hb); + gtk_widget_show(if_hb); + if_lb = gtk_label_new("Interface:"); - gtk_table_attach_defaults(GTK_TABLE(table), if_lb, 0, 1, 0, 1); + gtk_box_pack_start(GTK_BOX(if_hb), if_lb, FALSE, FALSE, 6); gtk_widget_show(if_lb); if_cb = gtk_combo_new(); @@ -221,125 +236,89 @@ capture_prep_cb(GtkWidget *w, gpointer d) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(if_cb)->entry), cfile.iface); else if (if_list != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(if_cb)->entry), if_list->data); - gtk_table_attach_defaults(GTK_TABLE(table), if_cb, 1, 2, 0, 1); + gtk_box_pack_start(GTK_BOX(if_hb), if_cb, TRUE, TRUE, 6); gtk_widget_show(if_cb); free_interface_list(if_list); - /* Count row */ - - count_lb = gtk_label_new("Count:"); - gtk_table_attach_defaults(GTK_TABLE(table), count_lb, 0, 1, 1, 2); - gtk_widget_show(count_lb); - - count_list = g_list_append(count_list, count_item1); - if (cfile.count) { - snprintf(count_item2, 15, "%d", cfile.count); - count_list = g_list_append(count_list, count_item2); - } - - count_cb = gtk_combo_new(); - gtk_combo_set_popdown_strings(GTK_COMBO(count_cb), count_list); - gtk_table_attach_defaults(GTK_TABLE(table), count_cb, 1, 2, 1, 2); - gtk_widget_show(count_cb); - - while (count_list) - count_list = g_list_remove_link(count_list, count_list); - - /* Filesize row */ - - filesize_lb = gtk_label_new("File size:"); - gtk_table_attach_defaults(GTK_TABLE(table), filesize_lb, 0, 1, 2, 3); - gtk_widget_show(filesize_lb); - - filesize_list = g_list_append(filesize_list, filesize_item1); - if (cfile.autostop_filesize) { - snprintf(filesize_item2, 15, "%d", cfile.autostop_filesize); - filesize_list = g_list_append(filesize_list, filesize_item2); - } - - filesize_cb = gtk_combo_new(); - gtk_combo_set_popdown_strings(GTK_COMBO(filesize_cb), filesize_list); - gtk_table_attach_defaults(GTK_TABLE(table), filesize_cb, 1, 2, 2, 3); - gtk_widget_show(filesize_cb); + /* Capture length row */ + snap_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(capture_vb), snap_hb); + gtk_widget_show(snap_hb); - while (filesize_list) - filesize_list = g_list_remove_link(filesize_list, filesize_list); + snap_cb = dlg_check_button_new_with_label_with_mnemonic( + "_Limit each packet to", accel_group); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(snap_cb), has_snaplen); + gtk_signal_connect(GTK_OBJECT(snap_cb), "toggled", + GTK_SIGNAL_FUNC(capture_prep_adjust_sensitivity), GTK_OBJECT(cap_open_w)); + gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0); + gtk_widget_show(snap_cb); - /* Duration row */ - - duration_lb = gtk_label_new("Duration:"); - gtk_table_attach_defaults(GTK_TABLE(table), duration_lb, 0, 1, 3, 4); - gtk_widget_show(duration_lb); + snap_adj = (GtkAdjustment *) gtk_adjustment_new((float) snaplen, + MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE, 1.0, 10.0, 0.0); + snap_sb = gtk_spin_button_new (snap_adj, 0, 0); + gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE); + gtk_widget_set_usize (snap_sb, 80, 0); + gtk_box_pack_start (GTK_BOX(snap_hb), snap_sb, FALSE, FALSE, 0); + gtk_widget_show(snap_sb); - duration_list = g_list_append(duration_list, duration_item1); - if (cfile.autostop_duration) { - snprintf(duration_item2, 15, "%d", cfile.autostop_duration); - duration_list = g_list_append(duration_list, duration_item2); - } - - duration_cb = gtk_combo_new(); - gtk_combo_set_popdown_strings(GTK_COMBO(duration_cb), duration_list); - gtk_table_attach_defaults(GTK_TABLE(table), duration_cb, 1, 2, 3, 4); - gtk_widget_show(duration_cb); + snap_lb = gtk_label_new("bytes"); + gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5); + gtk_box_pack_start(GTK_BOX(snap_hb), snap_lb, FALSE, FALSE, 0); + gtk_widget_show(snap_lb); - while (duration_list) - duration_list = g_list_remove_link(duration_list, duration_list); + /* Promiscuous mode row */ + promisc_cb = dlg_check_button_new_with_label_with_mnemonic( + "Capture packets in _promiscuous mode", accel_group); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(promisc_cb), promisc_mode); + gtk_container_add(GTK_CONTAINER(capture_vb), promisc_cb); + gtk_widget_show(promisc_cb); /* Filter row */ - + filter_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(capture_vb), filter_hb); + gtk_widget_show(filter_hb); + filter_bt = gtk_button_new_with_label("Filter:"); gtk_signal_connect(GTK_OBJECT(filter_bt), "clicked", GTK_SIGNAL_FUNC(capture_filter_construct_cb), NULL); - gtk_table_attach_defaults(GTK_TABLE(table), filter_bt, 0, 1, 4, 5); + gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, FALSE, 3); gtk_widget_show(filter_bt); filter_te = gtk_entry_new(); if (cfile.cfilter) gtk_entry_set_text(GTK_ENTRY(filter_te), cfile.cfilter); gtk_object_set_data(GTK_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te); - gtk_table_attach_defaults(GTK_TABLE(table), filter_te, 1, 2, 4, 5); + gtk_box_pack_start(GTK_BOX(filter_hb), filter_te, TRUE, TRUE, 3); gtk_widget_show(filter_te); + /* File-related options frame */ + file_fr = gtk_frame_new("Capture file(s)"); + gtk_container_add(GTK_CONTAINER(main_vb), file_fr); + gtk_widget_show(file_fr); + + file_vb = gtk_vbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(file_fr), file_vb); + gtk_widget_show(file_vb); + /* File row */ - + file_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(file_vb), file_hb); + gtk_widget_show(file_hb); + file_bt = gtk_button_new_with_label("File:"); - gtk_table_attach_defaults(GTK_TABLE(table), file_bt, 0, 1, 5, 6); + gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 3); gtk_widget_show(file_bt); file_te = gtk_entry_new(); - gtk_table_attach_defaults(GTK_TABLE(table), file_te, 1, 2, 5, 6); + gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 3); gtk_widget_show(file_te); gtk_signal_connect(GTK_OBJECT(file_bt), "clicked", GTK_SIGNAL_FUNC(capture_prep_file_cb), GTK_OBJECT(file_te)); - /* Misc row: Snap spinbutton */ - caplen_hb = gtk_hbox_new(FALSE, 3); - gtk_container_add(GTK_CONTAINER(main_vb), caplen_hb); - gtk_widget_show(caplen_hb); - - snap_lb = gtk_label_new("Capture length"); - gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5); - gtk_box_pack_start(GTK_BOX(caplen_hb), snap_lb, FALSE, FALSE, 6); - gtk_widget_show(snap_lb); - - snap_adj = (GtkAdjustment *) gtk_adjustment_new((float) cfile.snap, - MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE, 1.0, 10.0, 0.0); - snap_sb = gtk_spin_button_new (snap_adj, 0, 0); - gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE); - gtk_widget_set_usize (snap_sb, 80, 0); - gtk_box_pack_start (GTK_BOX(caplen_hb), snap_sb, FALSE, FALSE, 3); - gtk_widget_show(snap_sb); - - promisc_cb = dlg_check_button_new_with_label_with_mnemonic( - "Capture packets in _promiscuous mode", accel_group); - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(promisc_cb), promisc_mode); - gtk_container_add(GTK_CONTAINER(main_vb), promisc_cb); - gtk_widget_show(promisc_cb); - - /* Misc row: Ring buffer toggle button and Ring buffer spinbutton */ + /* Ring buffer row */ ringbuffer_hb = gtk_hbox_new(FALSE, 3); - gtk_container_add(GTK_CONTAINER(main_vb), ringbuffer_hb); + gtk_container_add(GTK_CONTAINER(file_vb), ringbuffer_hb); gtk_widget_show(ringbuffer_hb); ringbuffer_on_tb = dlg_check_button_new_with_label_with_mnemonic( @@ -368,40 +347,143 @@ capture_prep_cb(GtkWidget *w, gpointer d) gtk_box_pack_start (GTK_BOX(ringbuffer_hb), ringbuffer_nbf_sb, TRUE, TRUE, 0); gtk_widget_show(ringbuffer_nbf_sb); - /* Misc row: Capture file checkboxes */ + /* Display-related options frame */ + display_fr = gtk_frame_new("Display options"); + gtk_container_add(GTK_CONTAINER(main_vb), display_fr); + gtk_widget_show(display_fr); + + display_vb = gtk_vbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(display_fr), display_vb); + gtk_widget_show(display_vb); + + /* "Update display in real time" row */ sync_cb = dlg_check_button_new_with_label_with_mnemonic( "_Update list of packets in real time", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(sync_cb), sync_mode); gtk_signal_connect(GTK_OBJECT(sync_cb), "toggled", GTK_SIGNAL_FUNC(capture_prep_adjust_sensitivity), GTK_OBJECT(cap_open_w)); - gtk_container_add(GTK_CONTAINER(main_vb), sync_cb); + gtk_container_add(GTK_CONTAINER(display_vb), sync_cb); gtk_widget_show(sync_cb); + /* "Auto-scroll live update" row */ auto_scroll_cb = dlg_check_button_new_with_label_with_mnemonic( "_Automatic scrolling in live capture", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(auto_scroll_cb), auto_scroll_live); - gtk_container_add(GTK_CONTAINER(main_vb), auto_scroll_cb); + gtk_container_add(GTK_CONTAINER(display_vb), auto_scroll_cb); gtk_widget_show(auto_scroll_cb); + /* Capture limits frame */ + limit_fr = gtk_frame_new("Capture limits"); + gtk_container_add(GTK_CONTAINER(main_vb), limit_fr); + gtk_widget_show(limit_fr); + + limit_vb = gtk_vbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(limit_fr), limit_vb); + gtk_widget_show(limit_vb); + + /* Count row */ + count_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(limit_vb), count_hb); + gtk_widget_show(count_hb); + + count_cb = gtk_check_button_new_with_label("Stop capture after"); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(count_cb), FALSE); + gtk_signal_connect(GTK_OBJECT(count_cb), "toggled", + GTK_SIGNAL_FUNC(capture_prep_adjust_sensitivity), GTK_OBJECT(cap_open_w)); + gtk_box_pack_start(GTK_BOX(count_hb), count_cb, FALSE, FALSE, 0); + gtk_widget_show(count_cb); + + count_adj = (GtkAdjustment *) gtk_adjustment_new(1, + 1, INT_MAX, 1.0, 10.0, 0.0); + count_sb = gtk_spin_button_new (count_adj, 0, 0); + gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (count_sb), TRUE); + gtk_widget_set_usize (count_sb, 80, 0); + gtk_box_pack_start (GTK_BOX(count_hb), count_sb, FALSE, FALSE, 0); + gtk_widget_show(count_sb); + + count_lb = gtk_label_new("packet(s) captured"); + gtk_misc_set_alignment(GTK_MISC(count_lb), 0, 0.5); + gtk_box_pack_start(GTK_BOX(count_hb), count_lb, FALSE, FALSE, 0); + gtk_widget_show(count_lb); + + /* Filesize row */ + filesize_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(limit_vb), filesize_hb); + gtk_widget_show(filesize_hb); + + filesize_cb = gtk_check_button_new_with_label(""); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(filesize_cb), FALSE); + gtk_signal_connect(GTK_OBJECT(filesize_cb), "toggled", + GTK_SIGNAL_FUNC(capture_prep_adjust_sensitivity), GTK_OBJECT(cap_open_w)); + gtk_box_pack_start(GTK_BOX(filesize_hb), filesize_cb, FALSE, FALSE, 0); + gtk_widget_show(filesize_cb); + + filesize_adj = (GtkAdjustment *) gtk_adjustment_new(1, + 1, INT_MAX, 1.0, 10.0, 0.0); + filesize_sb = gtk_spin_button_new (filesize_adj, 0, 0); + gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (filesize_sb), TRUE); + gtk_widget_set_usize (filesize_sb, 80, 0); + gtk_box_pack_start (GTK_BOX(filesize_hb), filesize_sb, FALSE, FALSE, 0); + gtk_widget_show(filesize_sb); + + filesize_lb = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(filesize_lb), 0, 0.5); + gtk_box_pack_start(GTK_BOX(filesize_hb), filesize_lb, FALSE, FALSE, 0); + gtk_widget_show(filesize_lb); + + /* Duration row */ + duration_hb = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(limit_vb), duration_hb); + gtk_widget_show(duration_hb); + + duration_cb = gtk_check_button_new_with_label("Stop capture after"); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(duration_cb), FALSE); + gtk_signal_connect(GTK_OBJECT(duration_cb), "toggled", + GTK_SIGNAL_FUNC(capture_prep_adjust_sensitivity), GTK_OBJECT(cap_open_w)); + gtk_box_pack_start(GTK_BOX(duration_hb), duration_cb, FALSE, FALSE, 0); + gtk_widget_show(duration_cb); + + duration_adj = (GtkAdjustment *) gtk_adjustment_new(1, + 1, INT_MAX, 1.0, 10.0, 0.0); + duration_sb = gtk_spin_button_new (duration_adj, 0, 0); + gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (duration_sb), TRUE); + gtk_widget_set_usize (duration_sb, 80, 0); + gtk_box_pack_start (GTK_BOX(duration_hb), duration_sb, FALSE, FALSE, 0); + gtk_widget_show(duration_sb); + + duration_lb = gtk_label_new("second(s)"); + gtk_misc_set_alignment(GTK_MISC(duration_lb), 0, 0.5); + gtk_box_pack_start(GTK_BOX(duration_hb), duration_lb, FALSE, FALSE, 0); + gtk_widget_show(duration_lb); + + /* Resolution options frame */ + resolv_fr = gtk_frame_new("Name resolution"); + gtk_container_add(GTK_CONTAINER(main_vb), resolv_fr); + gtk_widget_show(resolv_fr); + + resolv_vb = gtk_vbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(resolv_fr), resolv_vb); + gtk_widget_show(resolv_vb); + m_resolv_cb = dlg_check_button_new_with_label_with_mnemonic( "Enable _MAC name resolution", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_resolv_cb), g_resolv_flags & RESOLV_MAC); - gtk_container_add(GTK_CONTAINER(main_vb), m_resolv_cb); + gtk_container_add(GTK_CONTAINER(resolv_vb), m_resolv_cb); gtk_widget_show(m_resolv_cb); n_resolv_cb = dlg_check_button_new_with_label_with_mnemonic( "Enable _network name resolution", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(n_resolv_cb), g_resolv_flags & RESOLV_NETWORK); - gtk_container_add(GTK_CONTAINER(main_vb), n_resolv_cb); + gtk_container_add(GTK_CONTAINER(resolv_vb), n_resolv_cb); gtk_widget_show(n_resolv_cb); t_resolv_cb = dlg_check_button_new_with_label_with_mnemonic( "Enable _transport name resolution", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(t_resolv_cb), g_resolv_flags & RESOLV_TRANSPORT); - gtk_container_add(GTK_CONTAINER(main_vb), t_resolv_cb); + gtk_container_add(GTK_CONTAINER(resolv_vb), t_resolv_cb); gtk_widget_show(t_resolv_cb); /* Button row: OK and cancel buttons */ @@ -428,21 +510,26 @@ capture_prep_cb(GtkWidget *w, gpointer d) /* Attach pointers to needed widgets to the capture prefs window/object */ gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_IFACE_KEY, if_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_SNAP_CB_KEY, snap_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_SNAP_SB_KEY, snap_sb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_PROMISC_KEY, promisc_cb); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILT_KEY, filter_te); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILE_TE_KEY, file_te); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_COUNT_KEY, count_cb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_SNAP_KEY, snap_sb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_PROMISC_KEY, promisc_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RING_ON_TB_KEY, ringbuffer_on_tb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_COUNT_CB_KEY, count_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_COUNT_SB_KEY, count_sb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILESIZE_CB_KEY, filesize_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILESIZE_SB_KEY, filesize_sb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILESIZE_LB_KEY, filesize_lb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_DURATION_CB_KEY, duration_cb); + gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_DURATION_SB_KEY, duration_sb); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb); gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILESIZE_KEY, filesize_cb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_DURATION_KEY, duration_cb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RING_ON_TB_KEY, ringbuffer_on_tb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb); - gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb); /* Set the sensitivity of various widgets as per the settings of other widgets. */ @@ -596,9 +683,13 @@ get_positive_int(const char *string, const char *name) static void capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { - GtkWidget *if_cb, *filter_te, *file_te, *count_cb, *snap_sb, *promisc_cb, - *sync_cb, *auto_scroll_cb, *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, - *filesize_cb, *duration_cb, *ringbuffer_on_tb, *ringbuffer_nbf_sb; + GtkWidget *if_cb, *snap_cb, *snap_sb, *promisc_cb, *filter_te, + *file_te, *ringbuffer_on_tb, *ringbuffer_nbf_sb, + *sync_cb, *auto_scroll_cb, + *count_cb, *count_sb, + *filesize_cb, *filesize_sb, + *duration_cb, *duration_sb, + *m_resolv_cb, *n_resolv_cb, *t_resolv_cb; gchar *if_text; gchar *if_name; gchar *filter_text; @@ -606,20 +697,24 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { int value; if_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_IFACE_KEY); + snap_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SNAP_CB_KEY); + snap_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SNAP_SB_KEY); + promisc_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_PROMISC_KEY); filter_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILT_KEY); file_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILE_TE_KEY); - count_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_COUNT_KEY); - snap_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SNAP_KEY); - promisc_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_PROMISC_KEY); + ringbuffer_on_tb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_ON_TB_KEY); + ringbuffer_nbf_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY); sync_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SYNC_KEY); auto_scroll_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY); + count_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_COUNT_CB_KEY); + count_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_COUNT_SB_KEY); + filesize_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILESIZE_CB_KEY); + filesize_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILESIZE_SB_KEY); + duration_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_DURATION_CB_KEY); + duration_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_DURATION_SB_KEY); m_resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY); n_resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY); t_resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY); - filesize_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILESIZE_KEY); - duration_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_DURATION_KEY); - ringbuffer_on_tb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_ON_TB_KEY); - ringbuffer_nbf_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY); if_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(if_cb)->entry))); @@ -635,6 +730,17 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { cfile.iface = g_strdup(if_name); g_free(if_text); + has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)); + if (has_snaplen) { + has_snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb)); + if (has_snaplen < 1) + has_snaplen = WTAP_MAX_PACKET_SIZE; + else if (has_snaplen < MIN_PACKET_SIZE) + has_snaplen = MIN_PACKET_SIZE; + } + + promisc_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb)); + /* XXX - don't try to get clever and set "cfile.filter" to NULL if the filter string is empty, as an indication that we don't have a filter and thus don't have to set a filter when capturing - the version of @@ -658,42 +764,38 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { save_file = NULL; } - value = get_positive_int(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(count_cb)->entry)), - "maximum packet count"); - if (value == -1) - return; /* error */ - cfile.count = value; - - value = get_positive_int(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(filesize_cb)->entry)), - "maximum capture file size"); - if (value == -1) - return; /* error */ - cfile.autostop_filesize = value; - - value = get_positive_int(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(duration_cb)->entry)), - "capture duration"); - if (value == -1) - return; /* error */ - cfile.autostop_duration = value; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(count_cb))) + cfile.count = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(count_sb)); + else + cfile.count = 0; /* no limit */ - cfile.snap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb)); - if (cfile.snap < 1) - cfile.snap = WTAP_MAX_PACKET_SIZE; - else if (cfile.snap < MIN_PACKET_SIZE) - cfile.snap = MIN_PACKET_SIZE; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filesize_cb))) { + cfile.autostop_filesize = + gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(filesize_sb)); + } else + cfile.autostop_filesize = 0; /* no limit */ - promisc_mode = GTK_TOGGLE_BUTTON (promisc_cb)->active; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(duration_cb))) { + cfile.autostop_duration = + gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(duration_sb)); + } else + cfile.autostop_duration = 0; /* no limit */ - sync_mode = GTK_TOGGLE_BUTTON (sync_cb)->active; + sync_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb)); - auto_scroll_live = GTK_TOGGLE_BUTTON (auto_scroll_cb)->active; + auto_scroll_live = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb)); g_resolv_flags = RESOLV_NONE; - g_resolv_flags |= (GTK_TOGGLE_BUTTON (m_resolv_cb)->active ? RESOLV_MAC : RESOLV_NONE); - g_resolv_flags |= (GTK_TOGGLE_BUTTON (n_resolv_cb)->active ? RESOLV_NETWORK : RESOLV_NONE); - g_resolv_flags |= (GTK_TOGGLE_BUTTON (t_resolv_cb)->active ? RESOLV_TRANSPORT : RESOLV_NONE); - - cfile.ringbuffer_on = GTK_TOGGLE_BUTTON (ringbuffer_on_tb)->active && !(sync_mode); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_resolv_cb))) + g_resolv_flags |= RESOLV_MAC; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(n_resolv_cb))) + g_resolv_flags |= RESOLV_NETWORK; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t_resolv_cb))) + g_resolv_flags |= RESOLV_TRANSPORT; + + cfile.ringbuffer_on = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_on_tb)) && !(sync_mode); if (cfile.ringbuffer_on == TRUE) { if (save_file == NULL) { simple_dialog(ESD_TYPE_CRIT, NULL, @@ -701,7 +803,8 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { return; } else if (cfile.autostop_filesize == 0) { simple_dialog(ESD_TYPE_CRIT, NULL, - "You must specify a maximum save file size other \nthan 0 (infinite) if you want to use the ring buffer."); + "You must specify a file size at which to rotate the capture files\n" + "if you want to use the ring buffer."); return; } } @@ -759,14 +862,32 @@ capture_prep_destroy_cb(GtkWidget *win, gpointer user_data) static void capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w) { - GtkWidget *sync_cb, *auto_scroll_cb, *ringbuffer_on_tb; - GtkWidget *ringbuffer_nbf_lb, *ringbuffer_nbf_sb; - - sync_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SYNC_KEY); - auto_scroll_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY); + GtkWidget *snap_cb, *snap_sb, + *ringbuffer_on_tb, *ringbuffer_nbf_lb, *ringbuffer_nbf_sb, + *sync_cb, *auto_scroll_cb, + *count_cb, *count_sb, + *filesize_cb, *filesize_sb, *filesize_lb, + *duration_cb, *duration_sb; + + snap_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SNAP_CB_KEY); + snap_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SNAP_SB_KEY); ringbuffer_on_tb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_ON_TB_KEY); ringbuffer_nbf_lb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_NBF_LB_KEY); ringbuffer_nbf_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY); + sync_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SYNC_KEY); + auto_scroll_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY); + count_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_COUNT_CB_KEY); + count_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_COUNT_SB_KEY); + filesize_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILESIZE_CB_KEY); + filesize_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILESIZE_SB_KEY); + filesize_lb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILESIZE_LB_KEY); + duration_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_DURATION_CB_KEY); + duration_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_DURATION_SB_KEY); + + /* The snapshot length spinbox is sensitive iff the "Limit each packet + to" checkbox is on. */ + gtk_widget_set_sensitive(GTK_WIDGET(snap_sb), + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb))); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb))) { /* "Update list of packets in real time" captures enabled; we don't @@ -798,12 +919,41 @@ capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w) of ring buffer files, and its label, sensitive. */ gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), TRUE); + + /* Also, indicate that the file size is a size at which to switch + ring buffer files, not a size at which to stop the capture, + turn its button on. */ + gtk_label_set_text(GTK_LABEL(GTK_BIN(filesize_cb)->child), + "Rotate capture file every"); + gtk_label_set_text(GTK_LABEL(filesize_lb), "kilobyte(s)"); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(filesize_cb), TRUE); } else { /* Ring buffer mode disabled. Make the spin button for the number of ring buffer files, and its label insensitive. */ gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), FALSE); + + /* Also, indicate that the file size is a size at which to stop the + capture, not a size at which to switch ring buffer files. */ + gtk_label_set_text(GTK_LABEL(GTK_BIN(filesize_cb)->child), + "Stop capture after"); + gtk_label_set_text(GTK_LABEL(filesize_lb), "kilobyte(s) captured"); } + + /* The maximum packet count spinbox is sensitive iff the "Stop capture + after N packets captured" checkbox is on. */ + gtk_widget_set_sensitive(GTK_WIDGET(count_sb), + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(count_cb))); + + /* The maximum file size spinbox is sensitive iff the "Stop capture + after N kilobytes captured" checkbox is on. */ + gtk_widget_set_sensitive(GTK_WIDGET(filesize_sb), + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filesize_cb))); + + /* The capture duration spinbox is sensitive iff the "Stop capture + after N seconds" checkbox is on. */ + gtk_widget_set_sensitive(GTK_WIDGET(duration_sb), + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(duration_cb))); } #endif /* HAVE_LIBPCAP */ |