diff options
Diffstat (limited to 'gtk/capture_dlg.c')
-rw-r--r-- | gtk/capture_dlg.c | 124 |
1 files changed, 109 insertions, 15 deletions
diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index e141456a9b..182b95c974 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.48 2001/11/09 07:44:49 guy Exp $ + * $Id: capture_dlg.c,v 1.49 2001/12/04 07:32:04 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -73,6 +73,8 @@ #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_FS_CALLER_PTR_KEY "fs_caller_ptr" #define E_FILE_SEL_DIALOG_PTR_KEY "file_sel_dialog_ptr" @@ -119,14 +121,18 @@ capture_prep_cb(GtkWidget *w, gpointer d) *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, - *m_resolv_cb, *n_resolv_cb, *t_resolv_cb; + *m_resolv_cb, *n_resolv_cb, *t_resolv_cb; GtkAccelGroup *accel_group; - GtkAdjustment *adj; - GList *if_list, *count_list = NULL; - gchar *count_item1 = "0 (Infinite)", count_item2[16]; + GtkAdjustment *snap_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]; int err; char err_str[PCAP_ERRBUF_SIZE]; @@ -181,8 +187,8 @@ 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 4 rows */ - table = gtk_table_new (4, 2, FALSE); + /* 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); @@ -226,34 +232,74 @@ capture_prep_cb(GtkWidget *w, gpointer d) 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, "%u", 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); + + while (filesize_list) + filesize_list = g_list_remove_link(filesize_list, filesize_list); + + /* 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); + + 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); + + while (duration_list) + duration_list = g_list_remove_link(duration_list, duration_list); + /* Filter row */ 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, 2, 3); + gtk_table_attach_defaults(GTK_TABLE(table), filter_bt, 0, 1, 4, 5); 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, 2, 3); + gtk_table_attach_defaults(GTK_TABLE(table), filter_te, 1, 2, 4, 5); gtk_widget_show(filter_te); /* File row */ file_bt = gtk_button_new_with_label("File:"); - gtk_table_attach_defaults(GTK_TABLE(table), file_bt, 0, 1, 3, 4); + gtk_table_attach_defaults(GTK_TABLE(table), file_bt, 0, 1, 5, 6); gtk_widget_show(file_bt); file_te = gtk_entry_new(); - gtk_table_attach_defaults(GTK_TABLE(table), file_te, 1, 2, 3, 4); + gtk_table_attach_defaults(GTK_TABLE(table), file_te, 1, 2, 5, 6); 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: Capture file checkbox and snap spinbutton */ + /* 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); @@ -263,9 +309,9 @@ capture_prep_cb(GtkWidget *w, gpointer d) gtk_box_pack_start(GTK_BOX(caplen_hb), snap_lb, FALSE, FALSE, 6); gtk_widget_show(snap_lb); - adj = (GtkAdjustment *) gtk_adjustment_new((float) cfile.snap, + 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 (adj, 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); @@ -277,6 +323,7 @@ capture_prep_cb(GtkWidget *w, gpointer d) gtk_container_add(GTK_CONTAINER(main_vb), promisc_cb); gtk_widget_show(promisc_cb); + /* Misc row: Capture file checkboxes */ 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), prefs.capture_real_time); @@ -344,6 +391,8 @@ capture_prep_cb(GtkWidget *w, gpointer d) 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); /* Catch the "activate" signal on the frame number and file name text entries, so that if the user types Return there, we act as if the @@ -462,14 +511,45 @@ cap_prep_fs_destroy_cb(GtkWidget *win, gpointer data) gtk_widget_destroy(GTK_WIDGET(win)); } +static int +get_positive_int(const char *string, const char *name) +{ + long number; + char *p; + + number = strtol(string, &p, 10); + /* + * XXX - we allow extra stuff after 0, so that we don't have + * problems with the "(Infinite)" value. + */ + if (p == string || (*p != '\0' && number != 0)) { + simple_dialog(ESD_TYPE_CRIT, NULL, + "The specified %s is not a decimal number.", name); + return -1; + } + if (number < 0) { + simple_dialog(ESD_TYPE_CRIT, NULL, + "The specified %s is a negative number.", name); + return -1; + } + if (number > INT_MAX) { + simple_dialog(ESD_TYPE_CRIT, NULL, + "The specified %s is too large (greater than %d).", name, INT_MAX); + return -1; + } + return number; +} + 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; + *sync_cb, *auto_scroll_cb, *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, + *filesize_cb, *duration_cb; gchar *if_text; gchar *if_name; gchar *filter_text; gchar *save_file; + int value; if_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_IFACE_KEY); filter_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_FILT_KEY); @@ -482,6 +562,8 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { 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); if_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(if_cb)->entry))); @@ -522,6 +604,18 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) { cfile.count = atoi(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(count_cb)->entry))); + 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; + cfile.snap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb)); if (cfile.snap < 1) cfile.snap = WTAP_MAX_PACKET_SIZE; |