2 * Routines for the "Capture Options" dialog and dialog windows popped
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
36 #include <epan/packet.h>
37 #include <epan/addr_resolv.h>
38 #include <epan/prefs.h>
39 #include <epan/filesystem.h>
41 #include "../capture.h"
42 #include "../capture_ifinfo.h"
43 #include "../capture-pcap-util.h"
44 #include "../capture_ui_utils.h"
45 #include "../ringbuffer.h"
47 #include "ui/capture_globals.h"
48 #include "ui/iface_lists.h"
49 #include "ui/preference_utils.h"
50 #include "ui/recent.h"
51 #include "ui/recent_utils.h"
52 #include "ui/simple_dialog.h"
54 #include "ui/gtk/main.h"
55 #include "ui/gtk/gui_utils.h"
56 #include "ui/gtk/capture_dlg.h"
57 #include "ui/gtk/filter_dlg.h"
58 #include "ui/gtk/dlg_utils.h"
59 #include "ui/gtk/file_dlg.h"
60 #include "ui/gtk/stock_icons.h"
61 #include "ui/gtk/capture_file_dlg.h"
62 #include "ui/gtk/help_dlg.h"
63 #include "ui/gtk/gtkglobals.h"
64 #include "ui/gtk/cfilter_combo_utils.h"
65 #include "ui/gtk/capture_if_dlg.h"
66 #include "ui/gtk/main_welcome.h"
67 #include "ui/gtk/network_icons.h"
68 #include "ui/gtk/menus.h"
69 #include "ui/gtk/prefs_dlg.h"
70 #include "ui/gtk/main_80211_toolbar.h"
72 #include "ui/gtk/keys.h"
74 #include "ui/gtk/old-gtk-compat.h"
75 #include "ui/gtk/expert_indicators.h"
79 #include "airpcap_loader.h"
80 #include "airpcap_gui_utils.h"
81 #include "airpcap_dlg.h"
85 * Symbolic names for column indices.
95 #if defined(HAVE_PCAP_CREATE)
98 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
113 #define LOCAL_OFFSET 1
115 #define LOCAL_OFFSET 0
118 /* Capture callback data keys */
119 #define E_CAP_IFACE_KEY "cap_iface"
120 #define E_CAP_IFACE_IP_KEY "cap_iface_ip"
121 #define E_CAP_SNAP_CB_KEY "cap_snap_cb"
122 #define E_CAP_LT_CBX_KEY "cap_lt_cbx"
123 #define E_CAP_LT_CBX_LABEL_KEY "cap_lt_cbx_label"
124 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
125 #define E_CAP_BUFFER_SIZE_SB_KEY "cap_buffer_size_sb"
127 #define E_CAP_SNAP_SB_KEY "cap_snap_sb"
128 #define E_CAP_PROMISC_KEY "cap_promisc"
129 #define E_CAP_PROMISC_KEY_ALL "cap_promisc_all"
130 #define E_CAP_KEY_ALL "cap_all"
131 #ifdef HAVE_PCAP_CREATE
132 #define E_CAP_MONITOR_KEY "cap_monitor"
134 #define E_CAP_PCAP_NG_KEY "cap_pcap_ng"
135 #define E_CAP_FILT_KEY "cap_filter_te"
136 #define E_OPT_EDIT_DIALOG_PTR_KEY "cap_edit_opt_dialog"
137 #define E_OPT_EDIT_CALLER_PTR_KEY "cap_edit_opt_caller"
138 #define E_CAP_FILE_TE_KEY "cap_file_te"
139 #define E_CAP_MULTI_FILES_ON_CB_KEY "cap_multi_files_on_cb"
140 #define E_CAP_RING_FILESIZE_CB_KEY "cap_ring_filesize_cb"
141 #define E_CAP_RING_FILESIZE_SB_KEY "cap_ring_filesize_sb"
142 #define E_CAP_RING_FILESIZE_CBX_KEY "cap_ring_filesize_cbx"
143 #define E_CAP_FILE_DURATION_CB_KEY "cap_file_duration_cb"
144 #define E_CAP_FILE_DURATION_SB_KEY "cap_file_duration_sb"
145 #define E_CAP_FILE_DURATION_CBX_KEY "cap_file_duration_cbx"
146 #define E_CAP_RING_NBF_CB_KEY "cap_ring_nbf_cb"
147 #define E_CAP_RING_NBF_SB_KEY "cap_ring_nbf_sb"
148 #define E_CAP_RING_NBF_LB_KEY "cap_ring_nbf_lb"
149 #define E_CAP_STOP_FILES_CB_KEY "cap_stop_files_cb"
150 #define E_CAP_STOP_FILES_SB_KEY "cap_stop_files_sb"
151 #define E_CAP_STOP_FILES_LB_KEY "cap_stop_files_lb"
152 #define E_CAP_SYNC_KEY "cap_sync"
153 #define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll"
154 #define E_CAP_HIDE_INFO_KEY "cap_hide_info"
155 #define E_CAP_STOP_PACKETS_CB_KEY "cap_stop_packets_cb"
156 #define E_CAP_STOP_PACKETS_SB_KEY "cap_stop_packets_sb"
157 #define E_CAP_STOP_PACKETS_LB_KEY "cap_stop_packets_lb"
158 #define E_CAP_STOP_FILESIZE_CB_KEY "cap_stop_filesize_cb"
159 #define E_CAP_STOP_FILESIZE_SB_KEY "cap_stop_filesize_sb"
160 #define E_CAP_STOP_FILESIZE_CBX_KEY "cap_stop_filesize_cbx"
161 #define E_CAP_STOP_DURATION_CB_KEY "cap_stop_duration_cb"
162 #define E_CAP_STOP_DURATION_SB_KEY "cap_stop_duration_sb"
163 #define E_CAP_STOP_DURATION_CBX_KEY "cap_stop_duration_cbx"
164 #define E_CAP_M_RESOLVE_KEY "cap_m_resolve"
165 #define E_CAP_N_RESOLVE_KEY "cap_n_resolve"
166 #define E_CAP_T_RESOLVE_KEY "cap_t_resolve"
167 #define E_CAP_E_RESOLVE_KEY "cap_e_resolve"
169 #define E_CAP_IFTYPE_CBX_KEY "cap_iftype_cbx"
170 #ifdef HAVE_PCAP_REMOTE
171 #define E_CAP_IF_LIST_KEY "cap_if_list"
172 #define E_CAP_DATATX_UDP_CB_KEY "cap_datatx_udp_cb"
173 #define E_CAP_NOCAP_RPCAP_CB_KEY "cap_nocap_rpcap_cb"
174 #define E_CAP_REMOTE_DIALOG_PTR_KEY "cap_remote_dialog"
175 #define E_CAP_REMOTE_CALLER_PTR_KEY "cap_remote_caller"
176 #define E_REMOTE_HOST_TE_KEY "cap_remote_host"
177 #define E_REMOTE_PORT_TE_KEY "cap_remote_port"
178 #define E_REMOTE_AUTH_NULL_KEY "cap_remote_auth_null"
179 #define E_REMOTE_AUTH_PASSWD_KEY "cap_remote_auth_passwd"
180 #define E_REMOTE_USERNAME_LB_KEY "cap_remote_username_lb"
181 #define E_REMOTE_USERNAME_TE_KEY "cap_remote_username_te"
182 #define E_REMOTE_PASSWD_LB_KEY "cap_remote_passwd_lb"
183 #define E_REMOTE_PASSWD_TE_KEY "cap_remote_passwd_te"
184 #define E_REMOTE_OK_BT_KEY "cap_remote_ok_bt"
185 #define E_REMOTE_DEL_BT_KEY "cap_remote_delete_bt"
186 #define E_CAP_CBX_IFTYPE_NOUPDATE_KEY "cap_cbx_iftype_noupdate"
187 #define E_OPT_REMOTE_DIALOG_PTR_KEY "cap_remote_opt_dialog"
188 #define E_OPT_REMOTE_CALLER_PTR_KEY "cap_remote_opt_caller"
190 #ifdef HAVE_PCAP_SETSAMPLING
191 #define E_CAP_SAMP_NONE_RB_KEY "cap_samp_none_rb"
192 #define E_CAP_SAMP_COUNT_RB_KEY "cap_samp_count_rb"
193 #define E_CAP_SAMP_COUNT_SB_KEY "cap_samp_count_sb"
194 #define E_CAP_SAMP_TIMER_RB_KEY "cap_samp_timer_rb"
195 #define E_CAP_SAMP_TIMER_SB_KEY "cap_samp_timer_sb"
197 #define E_CAP_PIPE_TE_KEY "cap_pipe_te"
198 #define E_CAP_PIPE_L_KEY "cap_pipe_list"
199 #define E_CAP_PIPE_DEL_KEY "cap_pipe_delete_key"
200 #define E_CAP_LOCAL_L_KEY "cap_local_list"
201 #define E_CAP_REMOTE_L_KEY "cap_remote_list"
203 #define E_COMPILE_SW_SCROLLW_KEY "compileScrolledWindowInterfaces"
204 #define E_COMPILE_TREE_VIEW_INTERFACES "compileTreeViewInterfaces"
206 #define DUMMY_SNAPLENGTH 65535
207 #define DUMMY_NETMASK 0xFF000000
217 * Keep a static pointer to the current "Capture Options" window, if
218 * any, so that if somebody tries to do "Capture:Options" while there's
219 * already a "Capture Options" window up, we just pop up the existing
220 * one, rather than creating a new one.
221 * Also: Capture:Start obtains info from the "Capture Options" window
222 * if it exists and if its creation is complete.
224 static GtkWidget *cap_open_w = NULL, *opt_edit_w = NULL, *ok_bt, *interface_management_w = NULL;
225 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
226 static GtkWidget *compile_bpf_w = NULL;
228 static gboolean cap_open_complete; /* valid only if cap_open_w != NULL */
229 static const gchar *pipe_name;
230 static const gchar *selected_name;
231 static GtkWidget *columns_menu_object;
232 static GtkUIManager *ui_manager_columns = NULL;
233 static GSList *popup_menu_list = NULL;
234 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
235 static GHashTable *compile_results = NULL;
236 static GtkWidget *all_compile_bt;
239 static gint marked_interface;
240 static gint marked_row;
242 #ifdef HAVE_PCAP_REMOTE
243 static GHashTable *remote_host_list=NULL;
244 static remote_options global_remote_opts;
245 static guint num_selected = 0;
249 capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te);
252 capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te);
255 select_link_type_cb(GtkWidget *w, gpointer data);
257 #ifdef HAVE_PCAP_REMOTE
259 capture_remote_cb(GtkWidget *w, gboolean focus_username);
262 select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data);
265 fill_remote_list(void);
269 capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w);
272 capture_prep_destroy_cb(GtkWidget *win, gpointer user_data);
274 #ifdef HAVE_PCAP_CREATE
276 capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp);
280 capture_dlg_prep(gpointer parent_w);
283 create_and_fill_model(GtkTreeView *view);
286 update_options_table(gint indx);
289 update_properties_all(void);
292 query_tooltip_tree_view_cb (GtkWidget *widget,
295 gboolean keyboard_tip,
300 gchar *col_index_to_name(gint indx)
306 case INTERFACE: col_name = g_strdup("INTERFACE");
308 case LINK: col_name = g_strdup("LINK");
310 case PMODE: col_name = g_strdup("PMODE");
312 case SNAPLEN: col_name = g_strdup("SNAPLEN");
314 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
315 case BUFFER: col_name = g_strdup("BUFFER");
318 #if defined (HAVE_PCAP_CREATE)
319 case MONITOR: col_name = g_strdup("MONITOR");
322 case FILTER: col_name = g_strdup("FILTER");
324 default: return NULL;
330 gint col_title_to_index(const gchar *name)
332 if (strcmp(name, "Capture") == 0) return CAPTURE;
333 if (strcmp(name, "Interface") == 0) return INTERFACE;
334 if (strcmp(name, "Link-layer header") == 0) return LINK;
335 if (strcmp(name, "Prom. Mode") == 0) return PMODE;
336 if (strcmp(name, "Snaplen [B]") == 0) return SNAPLEN;
337 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
338 if (strcmp(name, "Buffer [MB]") == 0) return BUFFER;
340 #if defined (HAVE_PCAP_CREATE)
341 if (strcmp(name, "Mon. Mode") == 0) return MONITOR;
343 if (strcmp(name, "Capture Filter") == 0) return FILTER;
348 set_capture_column_visible(gchar *col, gboolean visible _U_)
353 if (visible && !prefs_capture_options_dialog_column_is_visible(col)) {
354 prefs.capture_columns = g_list_append(prefs.capture_columns, col);
355 } else if (!visible && prefs_capture_options_dialog_column_is_visible(col)) {
356 for (curr = g_list_first(prefs.capture_columns); curr; curr = g_list_next(curr)) {
357 col_name = (gchar *)curr->data;
358 if (col_name && (g_ascii_strcasecmp(col_name, col) == 0)) {
359 prefs.capture_columns = g_list_remove(prefs.capture_columns, curr->data);
367 toggle_visible_column_cb (GtkWidget *w _U_, gpointer data)
370 GtkTreeViewColumn *col;
374 col_id = GPOINTER_TO_INT(data);
375 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
376 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
377 col_name = col_index_to_name(col_id);
378 gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
379 set_capture_column_visible(col_name, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
384 set_all_columns_visible (void)
386 GtkTreeViewColumn *col;
391 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
392 for (col_id = 2; col_id < NUM_COLUMNS; col_id++) {
393 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
394 gtk_tree_view_column_set_visible(col, TRUE);
395 if ((name = col_index_to_name(col_id)) != NULL) {
396 set_capture_column_visible(name, TRUE);
400 if (!prefs.gui_use_pref_save) {
404 update_visible_columns_menu ();
408 columns_activate_all_columns_cb(GtkAction *action _U_, gpointer user_data _U_)
410 set_all_columns_visible ();
414 update_visible_tree_view_columns(void)
418 GtkTreeViewColumn *col;
420 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
421 gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(view), INTERFACE), TRUE);
422 for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
423 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
424 gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_index_to_name(col_id))?TRUE:FALSE);
430 update_visible_columns_menu (void)
432 GtkWidget *menu_columns, *menu_item;
437 menu_columns = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/DisplayedColumns");
440 fprintf (stderr, "Warning: couldn't find menu_columns path=/ColumnsPopup/DisplayedColumns");
443 sub_menu = gtk_menu_new();
444 gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_columns), sub_menu);
446 for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
447 title = col_index_to_name(col_id);
448 menu_item = gtk_check_menu_item_new_with_label(title);
449 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), prefs_capture_options_dialog_column_is_visible(title));
450 g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(toggle_visible_column_cb), GINT_TO_POINTER(col_id));
451 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
452 gtk_widget_show (menu_item);
454 menu_item = gtk_menu_item_new();
455 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
456 gtk_widget_show (menu_item);
458 menu_item = gtk_menu_item_new_with_label ("Display All");
459 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
460 g_signal_connect(menu_item, "activate", G_CALLBACK(columns_activate_all_columns_cb), NULL);
461 gtk_widget_show (menu_item);
465 columns_pref_cb(GtkAction *action _U_, gpointer user_data)
467 GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/ColumnPreferences");
468 prefs_page_cb( widget , user_data, PREFS_PAGE_CAPTURE);
472 columns_hide_col_cb(GtkAction *action _U_, gpointer user_data _U_)
475 GtkTreeViewColumn *col;
479 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
480 col = (GtkTreeViewColumn *)g_object_get_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY);
481 gtk_tree_view_column_set_visible(col, FALSE);
482 num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MCAPTURE_COLUMNS_COL_KEY));
483 if ((name = col_index_to_name(num)) != NULL) {
484 set_capture_column_visible(name, FALSE);
485 if (!prefs.gui_use_pref_save) {
488 update_visible_columns_menu ();
492 static const char *ui_desc_columns_menu_popup =
494 " <popup name='ColumnsPopup' action='PopupAction'>\n"
495 " <menuitem name='ColumnPreferences' action='/Column Preferences'/>\n"
496 " <menu name='DisplayedColumns' action='/Displayed Columns'>\n"
497 " <menuitem name='Display All' action='/Displayed Columns/Display All'/>\n"
499 " <menuitem name='HideColumn' action='/Hide Column'/>\n"
503 static const GtkActionEntry columns_menu_popup_action_entries[] = {
504 { "/Column Preferences", GTK_STOCK_PREFERENCES, "Column Preferences...", NULL, NULL, G_CALLBACK(columns_pref_cb) },
505 { "/Displayed Columns", NULL, "Displayed Columns", NULL, NULL, NULL },
506 { "/Displayed Columns/Display All", NULL, "Display All", NULL, NULL, G_CALLBACK(columns_activate_all_columns_cb) },
507 { "/Hide Column", NULL, "Hide Column", NULL, NULL, G_CALLBACK(columns_hide_col_cb) },
510 #ifdef HAVE_PCAP_CREATE
512 activate_monitor(GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer,
513 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
517 init_columns_menu(void)
519 GtkActionGroup *columns_action_group;
520 GError *error = NULL;
522 columns_menu_object = gtk_menu_new();
523 /* columns pop-up menu */
524 columns_action_group = gtk_action_group_new ("ColumnsPopUpMenuActionGroup");
526 gtk_action_group_add_actions (columns_action_group, /* the action group */
527 (const GtkActionEntry *)columns_menu_popup_action_entries, /* an array of action descriptions */
528 G_N_ELEMENTS(columns_menu_popup_action_entries), /* the number of entries */
529 columns_menu_object); /* data to pass to the action callbacks */
531 ui_manager_columns = gtk_ui_manager_new ();
532 gtk_ui_manager_insert_action_group (ui_manager_columns,
533 columns_action_group,
534 0); /* the position at which the group will be inserted. */
536 gtk_ui_manager_add_ui_from_string (ui_manager_columns, ui_desc_columns_menu_popup, -1, &error);
539 fprintf (stderr, "Warning: building Packet List Heading Pop-Up failed: %s\n", error->message);
540 g_error_free (error);
544 g_object_set_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY,
545 gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup"));
547 popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_columns);
550 /* stop the currently running capture */
552 capture_stop_cb(GtkWidget *w _U_, gpointer d _U_)
555 if (airpcap_if_active)
556 airpcap_set_toolbar_stop_capture(airpcap_if_active);
559 capture_stop(&global_capture_session);
562 /* restart (stop - delete old file - start) running capture */
564 capture_restart_cb(GtkWidget *w _U_, gpointer d _U_)
567 if (airpcap_if_active)
568 airpcap_set_toolbar_start_capture(airpcap_if_active);
571 capture_restart(&global_capture_session);
581 typedef struct capture_filter_check {
582 enum cfc_state_t state;
584 GtkWidget *filter_te;
586 } capture_filter_check_t;
590 * Idle: filter_text = NULL, state = ?
591 * Pending: filter_text != NULL, state = CFC_PENDING
592 * Unknown: filter_text != NULL, state = CFC_UNKNOWN
593 * Known: filter_text != NULL, state = CFC_VALID || CFC_INVALID
595 * We assume that only one text entry is active at a time.
598 /* We could make this smarter by caching results */
599 static capture_filter_check_t cfc_data;
601 static GMutex *pcap_compile_mtx;
602 static GCond *cfc_data_cond;
603 static GMutex *cfc_data_mtx;
606 #define DEBUG_SYNTAX_CHECK(state1, state2) g_warning("CF state %s -> %s : %s", state1, state2, cfc_data.filter_text)
608 #define DEBUG_SYNTAX_CHECK(state1, state2)
612 check_capture_filter_syntax(void *data _U_) {
613 struct bpf_program fcode;
617 g_mutex_lock(cfc_data_mtx);
618 while (!cfc_data.filter_text || cfc_data.state != CFC_PENDING) {
619 /* Do we really need to use a mutex here? We only have one thread... */
620 g_cond_wait(cfc_data_cond, cfc_data_mtx);
622 cfc_data.state = CFC_UNKNOWN;
623 DEBUG_SYNTAX_CHECK("pending", "unknown");
625 g_mutex_unlock(cfc_data_mtx);
626 g_mutex_lock(pcap_compile_mtx);
628 /* pcap_compile_nopcap will not alter the filter string, so the (char *) cast is "safe" */
629 pc_err = pcap_compile_nopcap(DUMMY_SNAPLENGTH /* use a dummy snaplength for syntax-checking */,
630 cfc_data.dlt, &fcode, cfc_data.filter_text, 1 /* Do optimize */,
631 DUMMY_NETMASK /* use a dummy netmask for syntax-checking */);
633 g_mutex_unlock(pcap_compile_mtx);
634 g_mutex_lock(cfc_data_mtx);
636 if (cfc_data.state == CFC_UNKNOWN) { /* No more input came in */
638 DEBUG_SYNTAX_CHECK("unknown", "known bad");
639 cfc_data.state = CFC_INVALID;
641 DEBUG_SYNTAX_CHECK("unknown", "known good");
642 cfc_data.state = CFC_VALID;
645 g_mutex_unlock(cfc_data_mtx);
651 update_capture_filter_te(gpointer data _U_) {
653 g_mutex_lock(cfc_data_mtx);
655 if (cfc_data.filter_text && cfc_data.filter_te) {
656 if (cfc_data.state == CFC_VALID) {
657 colorize_filter_te_as_valid(cfc_data.filter_te);
658 } else if (cfc_data.state == CFC_INVALID) {
659 colorize_filter_te_as_invalid(cfc_data.filter_te);
661 colorize_filter_te_as_empty(cfc_data.filter_te);
664 if (cfc_data.state == CFC_VALID || cfc_data.state == CFC_INVALID) {
665 DEBUG_SYNTAX_CHECK("known", "idle");
666 /* Reset the current state to idle. */
667 if (cfc_data.filter_text != NULL) {
668 g_free(cfc_data.filter_text);
670 cfc_data.filter_text = NULL;
671 cfc_data.state = CFC_PENDING;
674 g_mutex_unlock(cfc_data_mtx);
678 /** Initialize background capture filter syntax checking
680 void capture_filter_init(void) {
681 cfc_data.filter_text = NULL;
682 cfc_data.filter_te = NULL;
683 cfc_data.state = CFC_PENDING;
685 #if GLIB_CHECK_VERSION(2,31,0)
686 pcap_compile_mtx = g_new(GMutex,1);
687 g_mutex_init(pcap_compile_mtx);
688 cfc_data_cond = g_new(GCond,1);
689 g_cond_init(cfc_data_cond);
690 cfc_data_mtx = g_new(GMutex,1);
691 g_mutex_init(cfc_data_mtx);
692 g_thread_new("Capture filter syntax", check_capture_filter_syntax, NULL);
694 pcap_compile_mtx = g_mutex_new();
695 cfc_data_cond = g_cond_new();
696 cfc_data_mtx = g_mutex_new();
697 g_thread_create(check_capture_filter_syntax, NULL, FALSE, NULL);
700 g_timeout_add(200, update_capture_filter_te, NULL);
704 update_filter_string(gchar *name, gchar *text)
711 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
712 model = gtk_tree_view_get_model(if_cb);
713 gtk_tree_model_get_iter_first(model, &iter);
715 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
716 if (strcmp(name, name_str) == 0) {
717 gtk_list_store_set (GTK_LIST_STORE(model), &iter, FILTER, g_strdup(text), -1);
720 } while (gtk_tree_model_iter_next(model, &iter));
724 capture_all_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
726 GtkWidget *filter_cm, *filter_te;
727 gchar *filter_text = NULL;
730 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
735 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
740 if (global_capture_opts.num_selected > 0) {
743 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
744 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
745 if (!device.selected) {
748 if (device.active_dlt == -1) {
749 colorize_filter_te_as_empty(filter_te);
750 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The link type of interface %s was not specified.", device.name);
751 continue; /* Programming error: somehow managed to select an "unsupported" entry */
753 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
754 if (strlen(filter_text) == 0) {
755 colorize_filter_te_as_empty(filter_te);
756 if (strlen(device.cfilter) > 0) {
757 g_array_remove_index(global_capture_opts.all_ifaces, i);
758 device.cfilter = g_strdup(filter_text);
759 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
760 update_filter_string(device.name, filter_text);
765 g_assert(filter_text != NULL);
766 g_array_remove_index(global_capture_opts.all_ifaces, i);
767 device.cfilter = g_strdup(filter_text);
768 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
769 g_mutex_lock(cfc_data_mtx);
770 /* Ruthlessly clobber the current state. */
771 g_free(cfc_data.filter_text);
772 cfc_data.dlt = device.active_dlt;
773 cfc_data.filter_text = filter_text;
774 cfc_data.filter_te = filter_te;
775 cfc_data.state = CFC_PENDING;
776 DEBUG_SYNTAX_CHECK("?", "pending");
777 g_cond_signal(cfc_data_cond);
778 g_mutex_unlock(cfc_data_mtx);
779 update_filter_string(device.name, filter_text);
785 capture_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
787 GtkWidget *filter_cm, *filter_te, *linktype_combo_box;
791 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
794 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
798 linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
800 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &dlt_ptr)) {
802 * There is no guarantee that we will even know the list of link-layer
803 * header types; we will not have it if, for example, we have a named
804 * pipe rather than an interface, as a named pipe doesn't *have* a
805 * link-layer header type until the capture is started and the
806 * pcap file header or pcap-ng interface description block is
807 * written, and we can't wait for that. We won't have it if we can't
808 * open the interface, either.
810 * We also won't have an active pointer, even if we have the list of
811 * link-layer header types, if none of the types are supported.
813 * Just mark it as empty, as a way of saying "damned if I know whether
814 * this filter is valid".
816 colorize_filter_te_as_empty(filter_te);
819 if ((cfc_data.dlt = GPOINTER_TO_INT(dlt_ptr)) == -1) {
820 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
823 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
825 if (strlen(filter_text) == 0) {
826 colorize_filter_te_as_empty(filter_te);
831 g_mutex_lock(cfc_data_mtx);
832 /* Ruthlessly clobber the current state. */
833 if (cfc_data.filter_text != NULL) {
834 g_free(cfc_data.filter_text);
836 cfc_data.filter_text = filter_text;
837 cfc_data.filter_te = filter_te;
838 cfc_data.state = CFC_PENDING;
839 DEBUG_SYNTAX_CHECK("?", "pending");
840 g_cond_signal(cfc_data_cond);
841 g_mutex_unlock(cfc_data_mtx);
845 capture_filter_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
847 g_mutex_lock(cfc_data_mtx);
848 /* Reset the current state to idle. */
849 if (cfc_data.filter_text != NULL) {
850 g_free(cfc_data.filter_text);
852 cfc_data.filter_text = NULL;
853 cfc_data.filter_te = NULL;
854 cfc_data.state = CFC_PENDING;
855 g_mutex_unlock(cfc_data_mtx);
858 #define TIME_UNIT_SECOND 0
859 #define TIME_UNIT_MINUTE 1
860 #define TIME_UNIT_HOUR 2
861 #define TIME_UNIT_DAY 3
862 #define MAX_TIME_UNITS 4
863 static const char *time_unit_name[MAX_TIME_UNITS] = {
870 /* create one of the duration options */
871 /* (and select the matching unit depending on the given value) */
872 static GtkWidget *time_unit_combo_box_new(guint32 value) {
873 GtkWidget *unit_combo_box;
876 unit_combo_box = gtk_combo_box_text_new ();
877 for (i = 0; i < MAX_TIME_UNITS; i++) {
878 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), time_unit_name[i]);
880 /* the selected combo_box item can't be changed, once the combo_box
881 is created, so set the matching combo_box item now */
883 if (value >= 60 * 60 * 24) {
884 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_DAY);
887 if (value >= 60 * 60) {
888 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_HOUR);
892 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_MINUTE);
895 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_SECOND);
899 return unit_combo_box;
902 /* convert time value from raw to displayed (e.g. 60s -> 1min) */
903 static guint32 time_unit_combo_box_convert_value(
907 if (value >= 60 * 60 * 24) {
908 return value / (60 * 60 * 24);
912 if (value >= 60 * 60) {
913 return value / (60 * 60);
925 /* get raw value from unit and value fields */
926 static guint32 time_unit_combo_box_get_value(
927 GtkWidget *unit_combo_box,
932 unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
935 case(TIME_UNIT_SECOND):
937 case(TIME_UNIT_MINUTE):
939 case(TIME_UNIT_HOUR):
940 return value * 60 * 60;
942 return value * 60 * 60 * 24;
944 g_assert_not_reached();
950 #define SIZE_UNIT_KILOBYTES 0
951 #define SIZE_UNIT_MEGABYTES 1
952 #define SIZE_UNIT_GIGABYTES 2
953 #define MAX_SIZE_UNITS 3
954 static const char *size_unit_name[MAX_SIZE_UNITS] = {
960 /* create one of the size options */
961 /* (and select the matching unit depending on the given value) */
962 static GtkWidget *size_unit_combo_box_new(guint32 value) {
963 GtkWidget *unit_combo_box;
966 unit_combo_box=gtk_combo_box_text_new();
967 for (i=0; i<MAX_SIZE_UNITS; i++){
968 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), size_unit_name[i]);
970 /* the selected combo_box item can't be changed, once the combo_box
971 is created, so set the matching combo_box item now */
973 if (value >= 1024 * 1024) {
974 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_GIGABYTES);
978 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_MEGABYTES);
981 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_KILOBYTES);
984 return unit_combo_box;
987 /* convert size value from raw to displayed (e.g. 1024 Bytes -> 1 KB) */
988 static guint32 size_unit_combo_box_set_value(
992 if (value >= 1024 * 1024) {
993 return value / (1024 * 1024);
998 return value / (1024);
1005 /* get raw value from unit and value fields */
1006 static guint32 size_unit_combo_box_convert_value(
1007 GtkWidget *unit_combo_box,
1012 unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
1015 case(SIZE_UNIT_KILOBYTES):
1016 if (value > (((guint32)G_MAXINT + 1) / 1024)) {
1021 case(SIZE_UNIT_MEGABYTES):
1022 if (value > (((guint32)G_MAXINT + 1) / (1024 * 1024))) {
1025 return value * 1024;
1027 case(SIZE_UNIT_GIGABYTES):
1028 if (value > (((guint32)G_MAXINT + 1) / (1024 * 1024 * 1024))) {
1031 return value * 1024 * 1024;
1034 g_assert_not_reached();
1041 * Sets the toolbar before calling the advanced dialog with for the right interface
1044 options_airpcap_advanced_cb(GtkWidget *w, gpointer d)
1048 from_widget = (gint*)g_malloc(sizeof(gint));
1049 *from_widget = AIRPCAP_ADVANCED_FROM_OPTIONS;
1050 g_object_set_data(G_OBJECT(wireless_tb),AIRPCAP_ADVANCED_FROM_KEY,from_widget);
1052 airpcap_if_active = airpcap_if_selected;
1053 airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
1054 display_airpcap_advanced_cb(w,d);
1058 #ifdef HAVE_PCAP_REMOTE
1059 /* PCAP interface type menu item */
1060 struct iftype_info {
1065 /* List of available types of PCAP interface */
1066 static struct iftype_info iftype[] = {
1067 { CAPTURE_IFLOCAL, "Local" },
1068 { CAPTURE_IFREMOTE, "Remote..." }
1071 #define REMOTE_HOST_START ((sizeof(iftype) / sizeof(iftype[0])) + 1)
1072 #define REMOTE_HOST_SEPARATOR "---"
1075 iftype_combo_box_add_remote_separators (GtkWidget *iftype_cbx)
1077 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), REMOTE_HOST_SEPARATOR);
1078 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), "Clear list");
1082 iftype_combo_box_add (GtkWidget *iftype_cbx, interface_t *device)
1084 GtkTreeModel *model;
1086 gboolean create_new = FALSE;
1088 guint i, pos = REMOTE_HOST_START;
1089 struct remote_host_info *rh;
1091 rh = g_hash_table_lookup (remote_host_list, device->remote_opts.remote_host_opts.remote_host);
1093 rh = g_malloc0 (sizeof (*rh));
1094 if (g_hash_table_size (remote_host_list) == 0) {
1095 iftype_combo_box_add_remote_separators (iftype_cbx);
1097 gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(iftype_cbx), pos, device->remote_opts.remote_host_opts.remote_host);
1098 rh->remote_host = g_strdup (device->remote_opts.remote_host_opts.remote_host);
1101 model = gtk_combo_box_get_model(GTK_COMBO_BOX(iftype_cbx));
1102 if (gtk_tree_model_get_iter_first(model, &iter)) {
1103 /* Skip the first entries */
1104 for (i = 0; i < REMOTE_HOST_START; i++)
1105 gtk_tree_model_iter_next(model, &iter);
1107 gtk_tree_model_get(model, &iter, 0, &string, -1);
1109 if (strcmp (device->remote_opts.remote_host_opts.remote_host, string) == 0) {
1110 /* Found match, show this position in combo box */
1117 } while (gtk_tree_model_iter_next(model, &iter));
1120 g_free (rh->remote_port);
1121 g_free (rh->auth_username);
1122 g_free (rh->auth_password);
1125 rh->remote_port = g_strdup (device->remote_opts.remote_host_opts.remote_port);
1126 rh->auth_type = device->remote_opts.remote_host_opts.auth_type;
1127 rh->auth_username = g_strdup (device->remote_opts.remote_host_opts.auth_username);
1128 rh->auth_password = g_strdup (device->remote_opts.remote_host_opts.auth_password);
1131 g_hash_table_insert (remote_host_list, g_strdup (device->remote_opts.remote_host_opts.remote_host), rh);
1134 g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(1));
1135 gtk_combo_box_set_active(GTK_COMBO_BOX(iftype_cbx), pos);
1136 g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(0));
1140 iftype_combo_box_add_remote_host (gpointer key, gpointer value _U_, gpointer user_data)
1142 gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(user_data), REMOTE_HOST_START, key);
1144 /* if (g_array_index(global_capture_opts.ifaces, interface_options, 0).src_type == CAPTURE_IFREMOTE) {*/
1145 /* Ensure we select the correct entry */
1146 /* if (strcmp ((char *)key, g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host) == 0) {
1147 gtk_combo_box_set_active(GTK_COMBO_BOX(user_data), REMOTE_HOST_START);
1152 /* Fill the menu of available types of interfaces */
1154 iftype_combo_box_new(void)
1156 GtkWidget *iftype_cbx;
1158 iftype_cbx = gtk_combo_box_text_new_with_entry();
1160 /* for (i = 0; i < sizeof(iftype) / sizeof(iftype[0]); i++) {
1161 gtk_combo_box_text_append_text(GTK_COMBO_BOX(iftype_cbx), iftype[i].name);
1164 if (g_hash_table_size (remote_host_list) > 0) {
1165 /* Add remote hosts */
1166 g_hash_table_foreach (remote_host_list, iftype_combo_box_add_remote_host, iftype_cbx);
1167 iftype_combo_box_add_remote_separators (iftype_cbx);
1170 g_signal_connect(iftype_cbx, "changed", G_CALLBACK(select_if_type_cb), NULL);
1176 iftype_combo_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
1178 gboolean result = FALSE;
1181 gtk_tree_model_get(model, iter, 0, &string, -1);
1183 result = !strcmp (string, REMOTE_HOST_SEPARATOR);
1192 #ifdef HAVE_PCAP_REMOTE
1194 error_list_remote_interface_cb (gpointer dialog _U_, gint btn _U_, gpointer data)
1196 capture_remote_cb(GTK_WIDGET(data), FALSE);
1200 insert_new_rows(GList *list)
1206 char *if_string = NULL, *temp = NULL, *snaplen_string;
1208 if_capabilities_t *caps;
1209 gint linktype_count;
1210 gboolean monitor_mode;
1216 data_link_info_t *data_link_info;
1217 gchar *str = NULL, *link_type_name = NULL;
1218 gboolean found = FALSE;
1221 GtkTreeModel *model;
1222 link_row *linkr = NULL;
1224 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
1225 model = gtk_tree_view_get_model(if_cb);
1226 /* Scan through the list and build a list of strings to display. */
1227 for (if_entry = g_list_first(list); if_entry != NULL; if_entry = g_list_next(if_entry)) {
1228 if_info = (if_info_t *)if_entry->data;
1229 #ifdef HAVE_PCAP_REMOTE
1230 add_interface_to_remote_list(if_info);
1232 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
1233 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
1234 if (strcmp(device.name, if_info->name) == 0) {
1243 ip_str = g_string_new("");
1246 device.name = g_strdup(if_info->name);
1247 /* Is this interface hidden and, if so, should we include it
1249 descr = capture_dev_user_descr_find(if_info->name);
1250 if (descr != NULL) {
1251 /* Yes, we have a user-supplied description; use it. */
1252 if_string = g_strdup_printf("%s: %s", descr, if_info->name);
1255 /* No, we don't have a user-supplied description; did we get
1256 one from the OS or libpcap? */
1257 if (if_info->vendor_description != NULL) {
1259 if_string = g_strdup_printf("%s: %s", if_info->vendor_description, if_info->name);
1262 if_string = g_strdup(if_info->name);
1264 } /* else descr != NULL */
1265 if (if_info->loopback) {
1266 device.display_name = g_strdup_printf("%s (loopback)", if_string);
1268 device.display_name = g_strdup(if_string);
1270 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
1271 if ((device.buffer = capture_dev_user_buffersize_find(if_string)) == -1) {
1272 device.buffer = global_capture_opts.default_options.buffer_size;
1275 if ((device.pmode = capture_dev_user_pmode_find(if_string)) == -1) {
1276 device.pmode = global_capture_opts.default_options.promisc_mode;
1278 device.has_snaplen = global_capture_opts.default_options.has_snaplen;
1279 if ((device.snaplen = capture_dev_user_snaplen_find(if_string)) == -1) {
1280 device.snaplen = global_capture_opts.default_options.snaplen;
1282 device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
1283 monitor_mode = prefs_capture_device_monitor_mode(if_string);
1284 caps = capture_get_if_capabilities(if_string, monitor_mode, NULL,main_window_update);
1285 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1286 for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) {
1288 g_string_append(ip_str, "\n");
1290 addr = (if_addr_t *)curr_addr->data;
1292 switch (addr->ifat_type) {
1294 g_string_append(ip_str, ip_to_str((guint8 *)&addr->addr.ip4_addr));
1297 g_string_append(ip_str, ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr));
1300 /* In case we add non-IP addresses */
1303 } /* for curr_addr */
1305 device.links = NULL;
1307 #ifdef HAVE_PCAP_CREATE
1308 device.monitor_mode_enabled = monitor_mode;
1309 device.monitor_mode_supported = caps->can_set_rfmon;
1311 for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
1312 data_link_info = (data_link_info_t *)lt_entry->data;
1313 linkr = (link_row *)g_malloc(sizeof(link_row));
1314 if (data_link_info->description != NULL) {
1315 str = g_strdup_printf("%s", data_link_info->description);
1316 linkr->dlt = data_link_info->dlt;
1318 str = g_strdup_printf("%s (not supported)", data_link_info->name);
1321 if (linktype_count == 0) {
1322 link_type_name = g_strdup(str);
1323 device.active_dlt = data_link_info->dlt;
1325 linkr->name = g_strdup(str);
1327 device.links = g_list_append(device.links, linkr);
1329 } /* for link_types */
1331 #if defined(HAVE_PCAP_CREATE)
1332 device.monitor_mode_enabled = FALSE;
1333 device.monitor_mode_supported = FALSE;
1335 device.active_dlt = -1;
1336 link_type_name = g_strdup("default");
1338 device.addresses = g_strdup(ip_str->str);
1339 device.no_addresses = ips;
1341 temp = g_strdup_printf("<b>%s</b>", device.display_name);
1343 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
1345 #ifdef HAVE_PCAP_REMOTE
1346 device.remote_opts.src_type= global_remote_opts.src_type;
1347 if (device.remote_opts.src_type == CAPTURE_IFREMOTE) {
1348 device.local = FALSE;
1350 device.remote_opts.remote_host_opts.remote_host = g_strdup(global_remote_opts.remote_host_opts.remote_host);
1351 device.remote_opts.remote_host_opts.remote_port = g_strdup(global_remote_opts.remote_host_opts.remote_port);
1352 device.remote_opts.remote_host_opts.auth_type = global_remote_opts.remote_host_opts.auth_type;
1353 device.remote_opts.remote_host_opts.auth_username = g_strdup(global_remote_opts.remote_host_opts.auth_username);
1354 device.remote_opts.remote_host_opts.auth_password = g_strdup(global_remote_opts.remote_host_opts.auth_password);
1355 device.remote_opts.remote_host_opts.datatx_udp = global_remote_opts.remote_host_opts.datatx_udp;
1356 device.remote_opts.remote_host_opts.nocap_rpcap = global_remote_opts.remote_host_opts.nocap_rpcap;
1357 device.remote_opts.remote_host_opts.nocap_local = global_remote_opts.remote_host_opts.nocap_local;
1359 device.local = TRUE;
1361 #ifdef HAVE_PCAP_SETSAMPLING
1362 device.remote_opts.sampling_method = global_remote_opts.sampling_method;
1363 device.remote_opts.sampling_param = global_remote_opts.sampling_param;
1365 device.selected = TRUE;
1366 global_capture_opts.num_selected++;
1367 g_array_append_val(global_capture_opts.all_ifaces, device);
1368 if (device.has_snaplen) {
1369 snaplen_string = g_strdup_printf("%d", device.snaplen);
1371 snaplen_string = g_strdup("default");
1374 #if defined(HAVE_PCAP_CREATE)
1375 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, link_type_name, PMODE, (device.pmode?"enabled":"disabled"), SNAPLEN, snaplen_string, BUFFER, device.buffer, MONITOR, "no",FILTER, "",-1);
1376 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
1377 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, link_type_name, PMODE, (device.pmode?"enabled":"disabled"), SNAPLEN, snaplen_string, BUFFER, device.buffer, FILTER, "",-1);
1379 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, link_type_name, PMODE, (device.pmode?"enabled":"disabled"), SNAPLEN, snaplen_string, -1);
1381 g_string_free(ip_str, TRUE);
1382 #ifdef HAVE_PCAP_REMOTE
1383 add_interface_to_list(global_capture_opts.all_ifaces->len-1);
1386 gtk_tree_view_set_model(GTK_TREE_VIEW(if_cb), model);
1390 #ifdef HAVE_PCAP_REMOTE
1391 /* Retrieve the list of local or remote interfaces according to selected
1392 * options and re-fill interface name combobox */
1394 update_interface_list(void)
1396 GtkWidget *iftype_cbx;
1397 GList *if_list, *if_r_list;
1401 if (cap_open_w == NULL)
1403 iftype_cbx = (GtkWidget *)g_object_get_data(G_OBJECT(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY)), E_REMOTE_HOST_TE_KEY);
1404 iftype_id = CAPTURE_IFREMOTE;
1405 if (iftype_id >= CAPTURE_IFREMOTE) {
1406 if_r_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
1407 global_remote_opts.remote_host_opts.remote_port,
1408 global_remote_opts.remote_host_opts.auth_type,
1409 global_remote_opts.remote_host_opts.auth_username,
1410 global_remote_opts.remote_host_opts.auth_password,
1413 if_list = if_r_list;
1415 if_list = capture_interface_list(&err, &err_str, main_window_update); /* Warning: see capture_prep_cb() */
1416 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY, NULL);
1419 if (if_list == NULL &&
1420 (err == CANT_GET_INTERFACE_LIST || err == DONT_HAVE_PCAP)) {
1421 gpointer dialog = simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
1424 if (iftype_id >= CAPTURE_IFREMOTE) {
1425 /* Fall back to previous interface list */
1426 simple_dialog_set_cb(dialog, error_list_remote_interface_cb, iftype_cbx);
1429 } else if (iftype_id == CAPTURE_IFREMOTE) {
1430 /* New remote interface */
1431 insert_new_rows(if_list);
1432 refresh_non_local_interface_lists();
1436 /* User changed an interface entry of "Remote interface" dialog */
1438 capture_remote_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
1440 GtkWidget *auth_passwd_rb,
1441 *username_lb, *username_te,
1442 *passwd_lb, *passwd_te;
1445 auth_passwd_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1446 E_REMOTE_AUTH_PASSWD_KEY);
1447 username_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1448 E_REMOTE_USERNAME_LB_KEY);
1449 username_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1450 E_REMOTE_USERNAME_TE_KEY);
1451 passwd_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_LB_KEY);
1452 passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_TE_KEY);
1454 state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb));
1455 gtk_widget_set_sensitive(GTK_WIDGET(username_lb), state);
1456 gtk_widget_set_sensitive(GTK_WIDGET(username_te), state);
1457 gtk_widget_set_sensitive(GTK_WIDGET(passwd_lb), state);
1458 gtk_widget_set_sensitive(GTK_WIDGET(passwd_te), state);
1461 /* user requested to destroy the dialog */
1463 capture_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
1465 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, NULL);
1468 /* user requested to accept remote interface options */
1470 capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w)
1472 GtkWidget *host_te, *port_te, *username_te, *passwd_te, *auth_passwd_rb;
1475 if (remote_w == NULL) {
1479 host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
1480 hostname = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(host_te));
1481 port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
1482 username_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w),
1483 E_REMOTE_USERNAME_TE_KEY);
1484 passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
1485 auth_passwd_rb = (GtkWidget *) g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
1486 g_free(global_remote_opts.remote_host_opts.remote_host);
1487 global_remote_opts.remote_host_opts.remote_host = hostname;
1488 g_free(global_remote_opts.remote_host_opts.remote_port);
1489 global_remote_opts.remote_host_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te)));
1490 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb)))
1491 global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_PWD;
1493 global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_NULL;
1494 g_free(global_remote_opts.remote_host_opts.auth_username);
1495 global_remote_opts.remote_host_opts.auth_username =
1496 g_strdup(gtk_entry_get_text(GTK_ENTRY(username_te)));
1498 g_free(global_remote_opts.remote_host_opts.auth_password);
1499 global_remote_opts.remote_host_opts.auth_password =
1500 g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_te)));
1502 window_destroy(GTK_WIDGET(remote_w));
1503 update_interface_list();
1508 capture_remote_cancel_cb(GtkWidget *win, gpointer data)
1510 window_cancel_button_cb (win, data);
1514 free_remote_host (gpointer key _U_, gpointer value, gpointer user _U_)
1516 struct remote_host *rh = value;
1518 g_free (rh->remote_host);
1519 g_free (rh->remote_port);
1520 g_free (rh->auth_username);
1521 g_free (rh->auth_password);
1527 select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_)
1530 GtkWidget *port_te, *auth_rb, *user_te, *pass_te;
1531 GtkWidget *remote_w;
1532 struct remote_host *rh;
1534 int new_iftype = gtk_combo_box_get_active(GTK_COMBO_BOX(iftype_cbx));
1535 gint num_remote = g_hash_table_size (remote_host_list);
1537 if (new_iftype != -1 && new_iftype == num_remote+1) {
1538 g_hash_table_foreach_remove (remote_host_list, free_remote_host, NULL);
1540 while (num_remote--) { /* Remove separator lines and "Clear" item */
1541 gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT(iftype_cbx), num_remote);
1543 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
1544 window_destroy(GTK_WIDGET(remote_w));
1545 capture_remote_cb(GTK_WIDGET(iftype_cbx), FALSE);
1547 string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(iftype_cbx));
1548 rh = g_hash_table_lookup (remote_host_list, string);
1551 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
1552 port_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
1553 gtk_entry_set_text(GTK_ENTRY(port_te), rh->remote_port);
1554 auth_rb = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
1555 if (rh->auth_type == CAPTURE_AUTH_PWD) {
1556 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), TRUE);
1558 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), FALSE);
1560 user_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY);
1561 gtk_entry_set_text(GTK_ENTRY(user_te), rh->auth_username);
1562 pass_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
1563 gtk_entry_set_text(GTK_ENTRY(pass_te), rh->auth_password);
1568 /* Show remote capture interface parameters dialog */
1570 capture_remote_cb(GtkWidget *w, gboolean focus_username)
1572 GtkWidget *remote_w,
1573 *main_vb, *host_grid,
1574 *host_lb, *host_te, *port_lb, *port_te,
1576 *auth_null_rb, *auth_passwd_rb, *auth_passwd_grid,
1577 *user_lb, *user_te, *passwd_lb, *passwd_te,
1578 *bbox, *ok_but, *cancel_bt;
1582 title = create_user_window_title("Wireshark: Remote Interface");
1583 remote_w = dlg_window_new(title);
1584 gtk_window_set_transient_for(GTK_WINDOW(remote_w), GTK_WINDOW(interface_management_w));
1585 g_object_set_data(G_OBJECT(remote_w), E_CAP_REMOTE_CALLER_PTR_KEY, interface_management_w);
1586 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, remote_w);
1589 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1590 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
1591 gtk_container_add(GTK_CONTAINER(remote_w), main_vb);
1593 /* Host/port table */
1594 host_grid = ws_gtk_grid_new();
1595 ws_gtk_grid_set_row_spacing(GTK_GRID(host_grid), DLG_LABEL_SPACING);
1596 ws_gtk_grid_set_column_spacing(GTK_GRID(host_grid), DLG_UNRELATED_SPACING);
1597 gtk_box_pack_start(GTK_BOX(main_vb), host_grid, FALSE, FALSE, 0);
1600 host_lb = gtk_label_new("Host:");
1601 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_lb, 0, 0, 1, 1);
1603 host_te = iftype_combo_box_new();
1604 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_te, 1, 0, 1, 1);
1607 port_lb = gtk_label_new("Port:");
1608 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_lb, 0, 1, 1, 1);
1610 port_te = gtk_entry_new();
1611 gtk_widget_set_tooltip_text(port_te, "Enter the TCP port number used by RPCAP server at remote host "
1612 "(leave it empty for default port number).");
1613 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_te, 1, 1, 1, 1);
1615 /* Authentication options frame */
1616 auth_fr = gtk_frame_new("Authentication");
1617 gtk_box_pack_start(GTK_BOX (main_vb), auth_fr, TRUE, TRUE, 0);
1619 auth_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
1620 gtk_container_set_border_width(GTK_CONTAINER(auth_vb), 5);
1621 gtk_container_add(GTK_CONTAINER(auth_fr), auth_vb);
1623 auth_null_rb = gtk_radio_button_new_with_label(NULL,
1624 "Null authentication");
1625 gtk_box_pack_start(GTK_BOX(auth_vb), auth_null_rb, TRUE, TRUE, 0);
1627 auth_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(auth_null_rb));
1628 auth_passwd_rb = gtk_radio_button_new_with_label(auth_group,
1629 "Password authentication");
1630 gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_rb, TRUE, TRUE, 0);
1631 g_signal_connect(auth_passwd_rb, "toggled",
1632 G_CALLBACK(capture_remote_adjust_sensitivity), remote_w);
1634 auth_passwd_grid = ws_gtk_grid_new();
1635 ws_gtk_grid_set_row_spacing(GTK_GRID(auth_passwd_grid), DLG_LABEL_SPACING);
1636 ws_gtk_grid_set_column_spacing(GTK_GRID(auth_passwd_grid), DLG_UNRELATED_SPACING);
1638 gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_grid, FALSE, FALSE, 0);
1640 user_lb = gtk_label_new("Username:");
1641 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_lb, 0, 0, 1, 1);
1643 user_te = gtk_entry_new();
1644 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_te, 1, 0, 1, 1);
1646 passwd_lb = gtk_label_new("Password:");
1647 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_lb, 0, 1, 1, 1);
1649 passwd_te = gtk_entry_new();
1650 gtk_entry_set_visibility(GTK_ENTRY(passwd_te), FALSE);
1651 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_te, 1, 1, 1, 1);
1653 /* Button row: "Start" and "Cancel" buttons */
1654 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
1655 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
1657 ok_but = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
1658 gtk_widget_set_can_default(ok_but, TRUE);
1659 g_signal_connect(ok_but, "clicked", G_CALLBACK(capture_remote_ok_cb), remote_w);
1660 gtk_widget_set_tooltip_text(ok_but,
1661 "Accept remote host parameters and lookup "
1662 "remote interfaces.");
1663 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_OK_BT_KEY, ok_but);
1664 cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
1665 gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
1666 window_set_cancel_button(remote_w, cancel_bt, capture_remote_cancel_cb);
1668 if (focus_username) {
1669 /* Give the initial focus to the "Username" entry box. */
1670 gtk_widget_grab_focus(user_te);
1673 gtk_widget_grab_default(ok_but);
1675 /* Catch the "activate" signal on the text
1676 entries, so that if the user types Return there, we act as if the
1677 "OK" button had been selected, as happens if Return is typed if some
1678 widget that *doesn't* handle the Return key has the input focus. */
1679 dlg_set_activate(host_te, ok_but);
1680 dlg_set_activate(port_te, ok_but);
1681 dlg_set_activate(user_te, ok_but);
1682 dlg_set_activate(passwd_te, ok_but);
1684 g_signal_connect(remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1685 g_signal_connect(remote_w, "destroy", G_CALLBACK(capture_remote_destroy_cb), NULL);
1687 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY, host_te);
1688 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY, port_te);
1689 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_NULL_KEY, auth_null_rb);
1690 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY, auth_passwd_rb);
1691 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_LB_KEY, user_lb);
1692 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY, user_te);
1693 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_LB_KEY, passwd_lb);
1694 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY, passwd_te);
1696 if (global_remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD)
1697 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_passwd_rb), TRUE);
1699 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_null_rb), TRUE);
1700 capture_remote_adjust_sensitivity(NULL, remote_w);
1702 gtk_widget_show_all(remote_w);
1703 window_present(remote_w);
1706 /* user requested to destroy the dialog */
1708 options_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
1712 caller = g_object_get_data(G_OBJECT(win), E_OPT_REMOTE_CALLER_PTR_KEY);
1713 g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, NULL);
1716 /* user requested to accept remote interface options */
1718 options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w)
1720 GtkWidget *datatx_udp_cb, *nocap_rpcap_cb;
1721 #ifdef HAVE_PCAP_SETSAMPLING
1722 GtkWidget *samp_none_rb, *samp_count_rb, *samp_timer_rb,
1723 *samp_count_sb, *samp_timer_sb;
1727 if (parent_w == NULL)
1730 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
1731 g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
1732 datatx_udp_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_DATATX_UDP_CB_KEY);
1733 nocap_rpcap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_NOCAP_RPCAP_CB_KEY);
1735 device.remote_opts.remote_host_opts.datatx_udp =
1736 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(datatx_udp_cb));
1737 device.remote_opts.remote_host_opts.nocap_rpcap =
1738 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb));
1740 #ifdef HAVE_PCAP_SETSAMPLING
1741 samp_none_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_NONE_RB_KEY);
1742 samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
1743 samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
1744 samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
1745 samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
1747 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_none_rb)))
1748 device.remote_opts.sampling_method = CAPTURE_SAMP_NONE;
1749 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb))) {
1750 device.remote_opts.sampling_method = CAPTURE_SAMP_BY_COUNT;
1751 device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb));
1752 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb))) {
1753 device.remote_opts.sampling_method = CAPTURE_SAMP_BY_TIMER;
1754 device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb));
1756 #endif /* HAVE_PCAP_SETSAMPLING*/
1757 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
1758 window_destroy(GTK_WIDGET(parent_w));
1760 #endif /*HAVE_PCAP_REMOTE*/
1762 #ifdef HAVE_PCAP_SETSAMPLING
1764 options_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
1766 GtkWidget *samp_count_rb, *samp_timer_rb,
1767 *samp_count_sb, *samp_timer_sb;
1769 samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
1770 samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
1771 samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
1772 samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
1774 if (samp_count_sb && samp_count_rb)
1775 gtk_widget_set_sensitive(GTK_WIDGET(samp_count_sb),
1776 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb)));
1778 if (samp_timer_sb && samp_timer_rb)
1779 gtk_widget_set_sensitive(GTK_WIDGET(samp_timer_sb),
1780 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb)));
1783 #endif /*HAVE_PCAP_SETSAMPLING*/
1784 #ifdef HAVE_PCAP_REMOTE
1786 options_remote_cb(GtkWidget *w _U_, gpointer d _U_)
1788 GtkWidget *opt_remote_w, *main_vb;
1789 GtkWidget *caller, *bbox, *ok_but, *cancel_bt;
1790 GtkWidget *capture_fr, *capture_vb;
1791 GtkWidget *nocap_rpcap_cb, *datatx_udp_cb;
1792 #ifdef HAVE_PCAP_SETSAMPLING
1793 GtkWidget *sampling_fr, *sampling_vb, *sampling_grid, *sampling_lb,
1794 *samp_none_rb, *samp_count_rb, *samp_timer_rb,
1795 *samp_count_sb, *samp_timer_sb;
1796 GtkAdjustment *samp_count_adj, *samp_timer_adj;
1801 caller = gtk_widget_get_toplevel(w);
1802 opt_remote_w = g_object_get_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY);
1803 if (opt_remote_w != NULL) {
1804 reactivate_window(opt_remote_w);
1808 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
1809 opt_remote_w = dlg_window_new("Remote Capture Settings");
1810 gtk_window_set_modal(GTK_WINDOW(opt_remote_w), TRUE);
1811 gtk_window_set_transient_for(GTK_WINDOW(opt_remote_w), GTK_WINDOW(caller));
1812 gtk_window_set_type_hint(GTK_WINDOW(opt_remote_w), GDK_WINDOW_TYPE_HINT_DIALOG);
1814 g_object_set_data(G_OBJECT(opt_remote_w), E_OPT_REMOTE_CALLER_PTR_KEY, caller);
1815 g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, opt_remote_w);
1817 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1818 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
1819 gtk_container_add(GTK_CONTAINER(opt_remote_w), main_vb);
1821 /* Remote capture options */
1822 capture_fr = gtk_frame_new("Capture Options");
1823 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
1825 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1826 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
1827 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
1829 nocap_rpcap_cb = gtk_check_button_new_with_mnemonic("Do not capture own RPCAP traffic");
1830 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb),
1831 device.remote_opts.remote_host_opts.nocap_rpcap);
1832 gtk_box_pack_start(GTK_BOX (capture_vb), nocap_rpcap_cb, TRUE, TRUE, 0);
1834 datatx_udp_cb = gtk_check_button_new_with_mnemonic("Use UDP for data transfer");
1835 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(datatx_udp_cb),
1836 device.remote_opts.remote_host_opts.datatx_udp);
1837 gtk_box_pack_start(GTK_BOX (capture_vb), datatx_udp_cb, TRUE, TRUE, 0);
1840 #ifdef HAVE_PCAP_SETSAMPLING
1841 /* Sampling options */
1842 sampling_fr = gtk_frame_new("Sampling Options");
1843 gtk_box_pack_start(GTK_BOX (main_vb), sampling_fr, TRUE, TRUE, 0);
1845 sampling_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1846 gtk_container_set_border_width(GTK_CONTAINER(sampling_vb), 5);
1847 gtk_container_add(GTK_CONTAINER(sampling_fr), sampling_vb);
1849 sampling_grid = ws_gtk_grid_new();
1850 ws_gtk_grid_set_row_spacing(GTK_GRID(sampling_grid), DLG_LABEL_SPACING);
1851 ws_gtk_grid_set_column_spacing(GTK_GRID(sampling_grid), DLG_UNRELATED_SPACING);
1852 gtk_box_pack_start(GTK_BOX(sampling_vb), sampling_grid, FALSE, FALSE, 0);
1854 /* "No sampling" row */
1855 samp_none_rb = gtk_radio_button_new_with_label(NULL, "None");
1856 if (device.remote_opts.sampling_method == CAPTURE_SAMP_NONE)
1857 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_none_rb), TRUE);
1858 g_signal_connect(samp_none_rb, "toggled",
1859 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1860 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_none_rb, 0, 0, 1, 1);
1862 /* "Sampling by counter" row */
1863 samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_none_rb));
1864 samp_count_rb = gtk_radio_button_new_with_label(samp_group, "1 of");
1865 if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_COUNT)
1866 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_count_rb), TRUE);
1867 g_signal_connect(samp_count_rb, "toggled",
1868 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1869 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_rb, 0, 1, 1, 1);
1871 samp_count_adj = (GtkAdjustment *) gtk_adjustment_new(
1872 (gfloat)device.remote_opts.sampling_param,
1873 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
1874 samp_count_sb = gtk_spin_button_new(samp_count_adj, 0, 0);
1875 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_count_sb), TRUE);
1876 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_sb, 1, 1, 1, 1);
1878 sampling_lb = gtk_label_new("packets");
1879 gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
1880 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 1, 1, 1);
1882 /* "Sampling by timer" row */
1883 samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_count_rb));
1884 samp_timer_rb = gtk_radio_button_new_with_label(samp_group, "1 every");
1885 if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_TIMER)
1886 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_timer_rb), TRUE);
1887 g_signal_connect(samp_timer_rb, "toggled",
1888 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1889 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_timer_rb, 0, 2, 1, 1);
1891 samp_timer_adj = (GtkAdjustment *) gtk_adjustment_new(
1892 (gfloat)device.remote_opts.sampling_param,
1893 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
1894 samp_timer_sb = gtk_spin_button_new(samp_timer_adj, 0, 0);
1895 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_timer_sb), TRUE);
1896 ws_gtk_grid_attach_defaults(GTK_GRID(sampling_grid), samp_timer_sb, 1, 2, 1, 1);
1898 sampling_lb = gtk_label_new("milliseconds");
1899 gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
1900 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 2, 1, 1);
1903 /* Button row: "Start" and "Cancel" buttons */
1904 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
1905 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
1907 ok_but = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
1908 g_signal_connect(ok_but, "clicked", G_CALLBACK(options_remote_ok_cb), opt_remote_w);
1909 gtk_widget_set_tooltip_text(ok_but, "Accept parameters and close dialog");
1910 cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
1911 gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
1912 window_set_cancel_button(opt_remote_w, cancel_bt, window_cancel_button_cb);
1914 gtk_widget_grab_default(ok_but);
1916 g_signal_connect(opt_remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1917 g_signal_connect(opt_remote_w, "destroy", G_CALLBACK(options_remote_destroy_cb), NULL);
1919 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_NOCAP_RPCAP_CB_KEY, nocap_rpcap_cb);
1920 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_DATATX_UDP_CB_KEY, datatx_udp_cb);
1922 #ifdef HAVE_PCAP_SETSAMPLING
1923 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_NONE_RB_KEY, samp_none_rb);
1924 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_RB_KEY, samp_count_rb);
1925 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_SB_KEY, samp_count_sb);
1926 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_RB_KEY, samp_timer_rb);
1927 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_SB_KEY, samp_timer_sb);
1930 #ifdef HAVE_PCAP_SETSAMPLING
1931 /* Set the sensitivity of various widgets as per the settings of other
1933 options_prep_adjust_sensitivity(NULL, opt_remote_w);
1936 gtk_widget_show_all(opt_remote_w);
1937 window_present(opt_remote_w);
1941 recent_print_remote_host (gpointer key _U_, gpointer value, gpointer user)
1944 struct remote_host_info *ri = value;
1946 fprintf (rf, RECENT_KEY_REMOTE_HOST ": %s,%s,%d\n", ri->remote_host, ri->remote_port, ri->auth_type);
1950 capture_remote_combo_recent_write_all(FILE *rf)
1952 if (remote_host_list && g_hash_table_size (remote_host_list) > 0) {
1953 /* Write all remote interfaces to the recent file */
1954 g_hash_table_foreach (remote_host_list, recent_print_remote_host, rf);
1959 capture_remote_combo_add_recent(const gchar *s)
1961 GList *vals = prefs_get_string_list (s);
1965 struct remote_host_info *rh;
1970 if (remote_host_list == NULL) {
1971 remote_host_list = g_hash_table_new (g_str_hash, g_str_equal);
1974 rh = g_malloc (sizeof (*rh));
1976 /* First value is the host */
1977 rh->remote_host = g_strdup (valp->data);
1978 if (strlen(rh->remote_host) == 0) {
1979 /* Empty remote host */
1980 g_free(rh->remote_host);
1984 rh->auth_type = CAPTURE_AUTH_NULL;
1988 /* Found value 2, this is the port number */
1989 rh->remote_port = g_strdup (valp->data);
1992 /* Did not find a port number */
1993 rh->remote_port = g_strdup ("");
1997 /* Found value 3, this is the authentication type */
1998 auth_type = strtol(valp->data, &p, 0);
1999 if (p != valp->data && *p == '\0') {
2000 rh->auth_type = auth_type;
2004 /* Do not store username and password */
2005 rh->auth_username = g_strdup ("");
2006 rh->auth_password = g_strdup ("");
2008 prefs_clear_string_list(vals);
2010 g_hash_table_insert (remote_host_list, g_strdup(rh->remote_host), rh);
2015 #endif /* HAVE_PCAP_REMOTE */
2017 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2020 compile_bpf_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
2022 /* Note that we no longer have an "About Wireshark" dialog box. */
2023 compile_bpf_w = NULL;
2027 select_first_entry(void)
2030 GtkTreeModel *model;
2032 GtkTreeSelection *selection;
2034 view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
2035 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
2036 gtk_tree_model_get_iter_first(model, &iter);
2037 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
2038 gtk_tree_selection_select_iter(selection, &iter);
2042 add_page(gchar *name, gchar *text, gboolean error)
2044 GtkWidget *view, *icon;
2045 GtkTreeModel *model;
2048 view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
2049 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
2050 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
2052 icon = pixbuf_to_widget(expert_error_pb_data);
2053 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 1, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
2055 icon = pixbuf_to_widget(expert_ok_pb_data);
2056 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 0, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
2058 g_hash_table_insert(compile_results, name, text);
2062 compile_tree_select_cb(GtkTreeSelection *sel, gpointer dummy _U_)
2065 GtkTreeModel *model;
2067 GtkWidget *textview;
2068 GtkTextBuffer *buffer;
2071 if (gtk_tree_selection_get_selected(sel, &model, &iter))
2073 gtk_tree_model_get(model, &iter, COMPILE_ERROR, &error, INAME, &name, -1);
2074 text = (gchar *)g_hash_table_lookup(compile_results, name);
2075 textview = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB);
2077 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
2079 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
2081 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
2082 gtk_text_buffer_set_text(buffer, text, -1);
2083 gtk_widget_show_all(compile_bpf_w);
2088 compile_results_prep(GtkWidget *w _U_, gpointer data _U_)
2090 GtkWidget *main_box, *main_vb, *bbox, *ok_btn, *top_hb, *ct_sb;
2091 GtkListStore *store;
2092 GtkWidget *view, *scrolled_win, *textview;
2093 GtkTreeSelection *selection;
2094 GtkCellRenderer *renderer;
2095 GtkTreeViewColumn *column;
2096 PangoFontDescription *font;
2098 if (compile_bpf_w != NULL) {
2099 /* There's already an "About Wireshark" dialog box; reactivate it. */
2100 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The requested dialog is already open. Please close it first.");
2104 compile_bpf_w = dlg_window_new("Compile selected BPFs");
2105 /* set the initial position (must be done, before show is called!) */
2106 /* default position is not appropriate for the about dialog */
2107 gtk_window_set_position(GTK_WINDOW(compile_bpf_w), GTK_WIN_POS_CENTER_ON_PARENT);
2108 gtk_window_set_default_size(GTK_WINDOW(compile_bpf_w), 600, 400);
2109 gtk_window_set_modal(GTK_WINDOW(compile_bpf_w), TRUE);
2110 gtk_window_set_transient_for(GTK_WINDOW(compile_bpf_w), GTK_WINDOW(cap_open_w));
2111 gtk_container_set_border_width(GTK_CONTAINER(compile_bpf_w), 6);
2113 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
2114 gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
2115 gtk_container_add(GTK_CONTAINER(compile_bpf_w), main_box);
2116 gtk_widget_show(main_box);
2118 /* Top row: Interfaces tree and notebook */
2119 top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
2120 gtk_box_pack_start(GTK_BOX(main_box), top_hb, TRUE, TRUE, 0);
2121 gtk_widget_show(top_hb);
2123 /* scrolled window on the left for the categories tree */
2124 ct_sb = scrolled_window_new(NULL, NULL);
2125 gtk_widget_set_size_request(GTK_WIDGET(ct_sb), 50, -1);
2126 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct_sb),
2128 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct_sb),
2129 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2130 gtk_box_pack_start(GTK_BOX(top_hb), ct_sb, TRUE, TRUE, 0);
2131 gtk_widget_show(ct_sb);
2132 g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_SW_SCROLLW_KEY, ct_sb);
2134 store = gtk_list_store_new(3, G_TYPE_UINT, GDK_TYPE_PIXBUF, G_TYPE_STRING);
2135 view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
2136 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL (store));
2137 g_object_set(G_OBJECT(view), "headers-visible", FALSE, NULL);
2138 g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES, view);
2139 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
2140 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
2141 column = gtk_tree_view_column_new();
2142 renderer = gtk_cell_renderer_text_new();
2143 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2144 gtk_tree_view_column_set_attributes(column, renderer, "text", COMPILE_ERROR, NULL);
2145 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2146 gtk_tree_view_column_set_visible(column, FALSE);
2147 column = gtk_tree_view_column_new();
2148 renderer = gtk_cell_renderer_pixbuf_new();
2149 gtk_tree_view_column_pack_start(column, renderer, FALSE);
2150 gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", SIGN, NULL);
2151 renderer = gtk_cell_renderer_text_new();
2152 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2153 gtk_tree_view_column_set_attributes(column, renderer, "text", INAME, NULL);
2154 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2155 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 0), TRUE);
2157 g_signal_connect(selection, "changed", G_CALLBACK(compile_tree_select_cb), NULL);
2158 gtk_container_add(GTK_CONTAINER(ct_sb), view);
2159 gtk_widget_show(view);
2161 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
2162 gtk_box_pack_start(GTK_BOX(top_hb), main_vb, TRUE, TRUE, 0);
2163 gtk_widget_show(main_vb);
2164 g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, main_vb);
2166 font = pango_font_description_from_string("Monospace");
2167 textview = gtk_text_view_new();
2168 #if GTK_CHECK_VERSION(3, 0, 0)
2169 gtk_widget_override_font(textview, font);
2171 gtk_widget_modify_font(textview, font);
2173 scrolled_win = gtk_scrolled_window_new(NULL, NULL);
2174 gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
2175 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
2176 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2177 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
2179 gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
2180 gtk_box_pack_start(GTK_BOX(main_vb), scrolled_win, TRUE, TRUE, 0);
2181 g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, textview);
2184 bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
2185 gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
2187 ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
2188 gtk_widget_grab_focus(ok_btn);
2189 gtk_widget_grab_default(ok_btn);
2190 window_set_cancel_button(compile_bpf_w, ok_btn, window_cancel_button_cb);
2192 g_signal_connect(compile_bpf_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2193 g_signal_connect(compile_bpf_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
2195 gtk_widget_show_all(compile_bpf_w);
2196 window_present(compile_bpf_w);
2198 compile_results = g_hash_table_new(g_str_hash, g_str_equal);
2202 capture_all_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
2205 struct bpf_program fcode;
2207 GtkWidget *filter_cm;
2210 gboolean set = FALSE;
2212 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
2217 if (global_capture_opts.all_ifaces->len > 0) {
2220 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
2221 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
2222 if (!device.selected || device.hidden) {
2225 if (device.active_dlt == -1) {
2226 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2230 compile_results_prep(NULL, NULL);
2232 pd = pcap_open_dead(device.active_dlt, DUMMY_SNAPLENGTH);
2234 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
2235 g_mutex_lock(pcap_compile_mtx);
2236 #ifdef PCAP_NETMASK_UNKNOWN
2237 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0)
2239 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0)
2242 g_mutex_unlock(pcap_compile_mtx);
2243 add_page(device.name, g_strdup(pcap_geterr(pd)), TRUE);
2245 GString *bpf_code_dump = g_string_new("");
2246 struct bpf_insn *insn = fcode.bf_insns;
2247 int ii, n = fcode.bf_len;
2248 gchar *bpf_code_str;
2250 for (ii = 0; ii < n; ++insn, ++ii) {
2251 g_string_append(bpf_code_dump, bpf_image(insn, ii));
2252 g_string_append(bpf_code_dump, "\n");
2254 bpf_code_str = g_string_free(bpf_code_dump, FALSE);
2255 g_mutex_unlock(pcap_compile_mtx);
2256 add_page(device.name, g_strdup(bpf_code_str), FALSE);
2257 g_free(bpf_code_str);
2259 g_free(filter_text);
2263 select_first_entry();
2265 #endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
2268 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2270 compile_results_win(gchar *text, gboolean error)
2272 GtkWidget *main_box, *bbox, *ok_btn, *results_w;
2273 GtkWidget *scrolled_win, *textview;
2274 PangoFontDescription *font;
2275 GtkTextBuffer *buffer;
2277 results_w = dlg_window_new("Compile results");
2278 /* set the initial position (must be done, before show is called!) */
2279 /* default position is not appropriate for the about dialog */
2280 gtk_window_set_position(GTK_WINDOW(results_w), GTK_WIN_POS_CENTER_ON_PARENT);
2281 gtk_window_set_default_size(GTK_WINDOW(results_w), 400, 400);
2282 gtk_window_set_modal(GTK_WINDOW(results_w), TRUE);
2283 gtk_window_set_transient_for(GTK_WINDOW(results_w), GTK_WINDOW(opt_edit_w));
2284 gtk_container_set_border_width(GTK_CONTAINER(results_w), 6);
2285 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
2286 gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
2287 gtk_container_add(GTK_CONTAINER(results_w), main_box);
2288 gtk_widget_show(main_box);
2289 font = pango_font_description_from_string("Monospace");
2290 textview = gtk_text_view_new();
2291 #if GTK_CHECK_VERSION(3, 0, 0)
2292 gtk_widget_override_font(textview, font);
2294 gtk_widget_modify_font(textview, font);
2296 scrolled_win = gtk_scrolled_window_new(NULL, NULL);
2297 gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
2298 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
2299 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2300 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
2302 gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
2303 gtk_box_pack_start(GTK_BOX(main_box), scrolled_win, TRUE, TRUE, 0);
2305 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
2307 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
2309 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
2310 gtk_text_buffer_set_text(buffer, g_strdup(text), -1);
2312 bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
2313 gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
2315 ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
2316 gtk_widget_grab_focus(ok_btn);
2317 gtk_widget_grab_default(ok_btn);
2318 window_set_cancel_button(results_w, ok_btn, window_cancel_button_cb);
2320 g_signal_connect(results_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2321 g_signal_connect(results_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
2323 gtk_widget_show_all(results_w);
2324 window_present(results_w);
2329 capture_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
2332 struct bpf_program fcode;
2334 GtkWidget *filter_cm;
2338 GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
2340 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
2341 g_assert_not_reached(); /* Programming error: somehow nothing is active */
2343 if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
2344 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2346 pd = pcap_open_dead(dlt, DUMMY_SNAPLENGTH);
2347 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
2348 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
2349 g_mutex_lock(pcap_compile_mtx);
2350 #ifdef PCAP_NETMASK_UNKNOWN
2351 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0) {
2353 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0) {
2355 g_mutex_unlock(pcap_compile_mtx);
2356 compile_results_win(g_strdup(pcap_geterr(pd)), 1);
2358 GString *bpf_code_dump = g_string_new("");
2359 struct bpf_insn *insn = fcode.bf_insns;
2360 int i, n = fcode.bf_len;
2362 gchar *bpf_code_str;
2364 g_mutex_unlock(pcap_compile_mtx);
2366 for (i = 0; i < n; ++insn, ++i) {
2367 g_string_append(bpf_code_dump, bpf_image(insn, i));
2368 g_string_append(bpf_code_dump, "\n");
2371 bpf_code_str = g_string_free(bpf_code_dump, FALSE);
2372 compile_results_win(g_strdup(bpf_code_str), 0);
2374 g_free(bpf_code_str);
2376 g_free(filter_text);
2380 #endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
2383 options_edit_destroy_cb(GtkWidget *win, gpointer user_data _U_)
2387 caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_EDIT_CALLER_PTR_KEY);
2388 g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, NULL);
2392 update_options_table(gint indx)
2397 GtkTreeModel *model;
2399 gchar *temp, *path_str, *snaplen_string, *linkname;
2401 link_row *linkr = NULL;
2404 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2406 if (!device.hidden) {
2407 if (device.no_addresses == 0) {
2408 temp = g_strdup_printf("<b>%s</b>", device.display_name);
2410 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
2413 for (list=device.links; list!=NULL; list=g_list_next(list))
2415 linkr = (link_row*)(list->data);
2416 if (linkr->dlt == device.active_dlt) {
2417 linkname = g_strdup(linkr->name);
2422 linkname = g_strdup("unknown");
2423 if (device.has_snaplen) {
2424 snaplen_string = g_strdup_printf("%d", device.snaplen);
2426 snaplen_string = g_strdup("default");
2429 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
2430 path_str = g_strdup_printf("%d", indx);
2431 path = gtk_tree_path_new_from_string(path_str);
2432 model = gtk_tree_view_get_model(if_cb);
2433 gtk_tree_model_get_iter(model, &iter, path);
2434 gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1);
2435 if (enabled == FALSE) {
2436 device.selected = TRUE;
2437 global_capture_opts.num_selected++;
2438 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2439 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2441 #if defined(HAVE_PCAP_CREATE)
2442 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
2443 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
2444 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
2446 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
2448 if (global_capture_opts.num_selected > 0) {
2449 gtk_widget_set_sensitive(ok_bt, TRUE);
2450 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2451 gtk_widget_set_sensitive(all_compile_bt, TRUE);
2454 gtk_widget_set_sensitive(ok_bt, FALSE);
2455 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2456 gtk_widget_set_sensitive(all_compile_bt, FALSE);
2459 gtk_tree_path_free (path);
2462 if (interfaces_dialog_window_present()) {
2463 update_selected_interface(g_strdup(device.name));
2465 if (get_welcome_window() != NULL) {
2466 change_interface_selection(g_strdup(device.name), device.selected);
2470 set_sensitivity_for_start_icon();
2475 save_options_cb(GtkWidget *win _U_, gpointer user_data _U_)
2477 GtkWidget *snap_cb, *snap_sb, *promisc_cb,
2478 #ifdef HAVE_PCAP_CREATE
2481 *filter_cm, *linktype_combo_box;
2482 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2483 GtkWidget *buffer_size_sb;
2487 gpointer ptr = NULL;
2491 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2492 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2493 snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
2494 snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
2495 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2496 buffer_size_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY);
2498 promisc_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY);
2499 #ifdef HAVE_PCAP_CREATE
2500 monitor_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY);
2502 filter_cm = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
2504 linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
2506 if (device.links != NULL) {
2507 if (ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
2508 /* Even though device.links != NULL, we might not have an active pointer
2509 * if all of the available links are unsupported, so the failure of
2510 * ws_combo_box_get_active_pointer() is not cause for
2511 * g_assert_not_reached().
2513 if (ptr != NULL && (dlt = GPOINTER_TO_INT(ptr)) == -1)
2514 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2517 device.active_dlt = dlt;
2518 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2519 device.buffer = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_sb));
2521 device.pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb));
2522 device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
2523 if (device.has_snaplen) {
2524 if (device.snaplen != (guint)gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb))) {
2526 device.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
2527 if (device.snaplen < 1)
2528 device.snaplen = WTAP_MAX_PACKET_SIZE;
2529 else if (device.snaplen < MIN_PACKET_SIZE)
2530 device.snaplen = MIN_PACKET_SIZE;
2532 device.snaplen = WTAP_MAX_PACKET_SIZE;
2534 filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(filter_cm));
2536 g_free(device.cfilter);
2537 g_assert(filter_text != NULL);
2538 device.cfilter = filter_text;
2539 #ifdef HAVE_PCAP_CREATE
2540 /* if dumpcap reported that the interface does not support monitor
2541 mode, we disable monitor mode even if the user explicitly selected it */
2542 device.monitor_mode_enabled = device.monitor_mode_supported ?
2543 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor_cb)) : FALSE;
2545 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2546 window_destroy(opt_edit_w);
2547 update_options_table(marked_row);
2548 update_properties_all();
2552 adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_)
2554 GtkWidget *snap_cb, *snap_sb;
2557 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2558 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2560 snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
2561 snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
2563 /* The snapshot length spinbox is sensitive if the "Limit each packet
2564 to" checkbox is on. */
2565 gtk_widget_set_sensitive(GTK_WIDGET(snap_sb),
2566 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)));
2567 device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
2568 if (!device.has_snaplen) {
2569 gtk_spin_button_set_value(GTK_SPIN_BUTTON (snap_sb), WTAP_MAX_PACKET_SIZE);
2570 device.snaplen = WTAP_MAX_PACKET_SIZE;
2572 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2575 void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata)
2577 GtkWidget *caller, *window, *swindow = NULL, *if_view,
2578 *main_vb, *if_hb, *if_lb, *if_lb_name,
2580 #if defined (HAVE_AIRPCAP) || defined (HAVE_PCAP_REMOTE) || defined (HAVE_PCAP_CREATE)
2583 *capture_fr, *capture_vb,
2584 *if_ip_hb, *if_ip_lb = NULL, *if_ip_name,
2585 *if_vb_left, *if_vb_right,
2586 *linktype_hb, *linktype_lb, *linktype_combo_box,
2587 *snap_hb, *snap_cb, *snap_sb, *snap_lb,
2589 #ifdef HAVE_PCAP_CREATE
2592 *filter_hb, *filter_bt, *filter_te, *filter_cm,
2593 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2596 *bbox, *ok_but, *cancel_bt,
2598 GList *cf_entry, *list, *cfilter_list;
2599 GtkAdjustment *snap_adj;
2600 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2601 GtkAdjustment *buffer_size_adj;
2602 GtkWidget *buffer_size_lb, *buffer_size_sb, *buffer_size_hb;
2604 #ifdef HAVE_PCAP_REMOTE
2605 GtkWidget *remote_bt;
2608 GtkWidget *advanced_bt;
2611 GtkTreeModel *model;
2614 gboolean found = FALSE;
2615 gint num_link_types, num_supported_link_types, first_supported_index;
2618 GtkCellRenderer *renderer;
2619 GtkListStore *store;
2620 const gchar *new_cfilter;
2622 window = (GtkWidget *)userdata;
2623 caller = gtk_widget_get_toplevel(GTK_WIDGET(window));
2624 opt_edit_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY);
2625 if (opt_edit_w != NULL) {
2626 reactivate_window(opt_edit_w);
2631 device.display_name = NULL;
2632 device.no_addresses = 0;
2633 device.addresses = NULL;
2634 device.links = NULL;
2635 device.active_dlt = -1;
2636 device.pmode = FALSE;
2637 #ifdef HAVE_PCAP_CREATE
2638 device.monitor_mode_enabled = FALSE;
2639 device.monitor_mode_supported = FALSE;
2641 device.has_snaplen = FALSE;
2642 device.snaplen = 65535;
2643 device.cfilter = NULL;
2644 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2645 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
2648 model = gtk_tree_view_get_model(view);
2649 gtk_tree_model_get_iter (model, &iter, path);
2651 if (window == get_welcome_window()) {
2652 gtk_tree_model_get(model, &iter, IFACE_NAME, &name, -1);
2653 } else if (window == cap_open_w) {
2654 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name, -1);
2659 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
2660 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
2661 if (strcmp(device.name, name) == 0) {
2662 marked_interface = i;
2666 marked_row = atoi(gtk_tree_path_to_string(path));
2667 opt_edit_w = dlg_window_new("Edit Interface Settings");
2668 gtk_window_set_modal(GTK_WINDOW(opt_edit_w), TRUE);
2669 gtk_window_set_type_hint (GTK_WINDOW (opt_edit_w), GDK_WINDOW_TYPE_HINT_DIALOG);
2670 g_object_set_data(G_OBJECT(opt_edit_w), E_OPT_EDIT_CALLER_PTR_KEY, caller);
2671 g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, opt_edit_w);
2673 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2674 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
2675 gtk_container_add(GTK_CONTAINER(opt_edit_w), main_vb);
2677 /* Capture-related options frame */
2678 capture_fr = gtk_frame_new("Capture");
2679 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
2681 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2682 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
2683 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
2686 if_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2687 gtk_box_pack_start(GTK_BOX(capture_vb), if_hb, FALSE, FALSE, 3);
2689 if_lb = gtk_label_new("Interface: ");
2690 gtk_box_pack_start(GTK_BOX(if_hb), if_lb, FALSE, FALSE, 3);
2692 if_lb_name = gtk_label_new(device.display_name);
2693 gtk_box_pack_start(GTK_BOX(if_hb), if_lb_name, FALSE, FALSE, 3);
2695 /* IP addresses row */
2696 if_ip_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2698 gtk_widget_set_tooltip_text(if_ip_hb, "Lists the IP address(es) "
2699 "assigned to the selected interface. ");
2700 if_vb_left = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2701 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_left, FALSE, FALSE, 3);
2702 if_vb_right = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2704 if_ip_lb = gtk_label_new("IP address:");
2705 gtk_misc_set_alignment(GTK_MISC(if_ip_lb), 0, 0); /* Left justified */
2706 gtk_box_pack_start(GTK_BOX(if_vb_left), if_ip_lb, FALSE, FALSE, 0);
2707 if (device.no_addresses > 0) {
2708 gchar *temp_addresses = g_strdup(device.addresses);
2709 gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, TRUE, TRUE, 0);
2710 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, TRUE, TRUE, 3);
2711 swindow = gtk_scrolled_window_new (NULL, NULL);
2712 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
2713 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2714 gtk_widget_set_size_request(GTK_WIDGET(swindow),-1, 50);
2715 if_view = gtk_tree_view_new ();
2716 g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL);
2717 renderer = gtk_cell_renderer_text_new();
2718 column = gtk_tree_view_column_new_with_attributes ("",
2719 GTK_CELL_RENDERER(renderer),
2722 gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
2723 store = gtk_list_store_new(1, G_TYPE_STRING);
2724 for (tok = strtok (temp_addresses, "\n"); tok; tok = strtok(NULL, "\n")) {
2725 gtk_list_store_append (store, &iter);
2726 gtk_list_store_set (store, &iter, 0, tok, -1);
2728 gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
2729 gtk_container_add (GTK_CONTAINER (swindow), if_view);
2730 gtk_box_pack_start(GTK_BOX(if_vb_right), swindow, TRUE, TRUE, 0);
2731 g_free(temp_addresses);
2733 gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, FALSE, FALSE, 0);
2734 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, FALSE, FALSE, 3);
2735 if_ip_name = gtk_label_new("none");
2736 gtk_misc_set_alignment(GTK_MISC(if_ip_name), 0, 0); /* Left justified */
2737 gtk_box_pack_start(GTK_BOX(if_vb_right), if_ip_name, FALSE, FALSE, 0);
2739 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
2740 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
2741 gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 3);
2743 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2744 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
2745 gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
2747 #if defined (HAVE_AIRPCAP) || defined (HAVE_PCAP_REMOTE) || defined (HAVE_PCAP_CREATE)
2748 /* Avoid adding the right vbox if not needed, because it steals 3 pixels */
2749 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2750 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
2751 gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 3);
2755 linktype_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2756 gtk_box_pack_start(GTK_BOX(left_vb), linktype_hb, FALSE, FALSE, 0);
2758 linktype_lb = gtk_label_new("Link-layer header type:");
2759 gtk_box_pack_start(GTK_BOX(linktype_hb), linktype_lb, FALSE, FALSE, 3);
2761 linktype_combo_box = ws_combo_box_new_text_and_pointer();
2762 g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY, linktype_lb);
2763 /* Default to "use the default" */
2764 /* Datalink menu index is not reset; it will be restored with last used value */
2766 g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_IFACE_IP_KEY, if_ip_lb);
2768 * XXX - in some cases, this is "multiple link-layer header types", e.g.
2769 * some 802.11 interfaces on FreeBSD 5.2 and later, where you can request
2770 * fake Ethernet, 802.11, or 802.11-plus-radio-information headers.
2772 * In other cases, it's "multiple link-layer types", e.g., with recent
2773 * versions of libpcap, a DAG card on an "HDLC" WAN, where you can
2774 * request Cisco HDLC or PPP depending on what type of traffic is going
2775 * over the WAN, or an Ethernet interface, where you can request Ethernet
2776 * or DOCSIS, the latter being for some Cisco cable modem equipment that
2777 * can be configured to send raw DOCSIS frames over an Ethernet inside
2778 * Ethernet low-level framing, for traffic capture purposes.
2780 * We leave it as "multiple link-layer types" for now.
2782 gtk_widget_set_tooltip_text(linktype_combo_box, "The selected interface supports multiple link-layer types; select the desired one.");
2783 gtk_box_pack_start (GTK_BOX(linktype_hb), linktype_combo_box, FALSE, FALSE, 0);
2784 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY, linktype_combo_box);
2786 num_supported_link_types = 0;
2787 first_supported_index = -1;
2788 for (list=device.links; list!=NULL; list=g_list_next(list))
2790 temp = (link_row*)(list->data);
2791 if (temp->dlt == -1)
2793 ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
2796 GINT_TO_POINTER(-1), /* Flag as "not supported" */
2801 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
2803 GINT_TO_POINTER(temp->dlt));
2804 /* Record the index of the first supported link type (and thus the first
2805 * one in the list to be active) for use determining the default selected
2807 if (first_supported_index == -1)
2809 first_supported_index = num_link_types;
2811 if (temp->dlt == device.active_dlt)
2813 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box), num_link_types);
2816 num_supported_link_types++;
2820 gtk_widget_set_sensitive(linktype_lb, num_link_types >= 2);
2821 gtk_widget_set_sensitive(linktype_combo_box, num_link_types >= 2);
2822 if (!found && first_supported_index >= 0)
2824 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),first_supported_index);
2826 g_signal_connect(linktype_combo_box, "changed", G_CALLBACK(select_link_type_cb), NULL);
2828 /* Promiscuous mode row */
2829 promisc_cb = gtk_check_button_new_with_mnemonic(
2830 "Capture packets in _promiscuous mode");
2831 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
2833 gtk_widget_set_tooltip_text(promisc_cb,
2834 "Usually a network adapter will only capture the traffic sent to its own network address. "
2835 "If you want to capture all traffic that the network adapter can \"see\", mark this option. "
2836 "See the FAQ for some more details of capturing packets from a switched network.");
2837 gtk_box_pack_start (GTK_BOX(left_vb), promisc_cb, FALSE, FALSE, 0);
2838 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY, promisc_cb);
2840 #ifdef HAVE_PCAP_CREATE
2841 /* Monitor mode row */
2842 monitor_cb = gtk_check_button_new_with_mnemonic( "Capture packets in monitor mode");
2843 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb), device.monitor_mode_enabled);
2844 gtk_widget_set_sensitive(monitor_cb, device.monitor_mode_supported);
2845 g_signal_connect(monitor_cb, "toggled", G_CALLBACK(capture_prep_monitor_changed_cb), NULL);
2847 gtk_widget_set_tooltip_text(monitor_cb,
2848 "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture the traffic on the BSS to which it's associated. "
2849 "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", mark this option. "
2850 "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
2851 "it might be necessary to turn this option on.\n\n"
2852 "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
2853 gtk_box_pack_start (GTK_BOX(left_vb), monitor_cb, FALSE, FALSE, 0);
2855 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY, monitor_cb);
2859 * This controls the sensitivity of both the link-type list and, if
2860 * you have it, the monitor mode checkbox. That's why we do this
2864 /* Capture length row */
2865 snap_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2866 gtk_box_pack_start (GTK_BOX(left_vb), snap_hb, FALSE, FALSE, 0);
2868 snap_cb = gtk_check_button_new_with_mnemonic("_Limit each packet to");
2869 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(snap_cb),
2870 device.has_snaplen);
2871 g_signal_connect(snap_cb, "toggled", G_CALLBACK(adjust_snap_sensitivity), NULL);
2872 gtk_widget_set_tooltip_text(snap_cb,
2873 "Limit the maximum number of bytes to be captured from each packet. This size includes the "
2874 "link-layer header and all subsequent headers. ");
2875 gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0);
2877 snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.snaplen,
2878 MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE, 1.0, 10.0, 0.0);
2879 snap_sb = gtk_spin_button_new (snap_adj, 0, 0);
2880 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE);
2881 gtk_widget_set_size_request(snap_sb, 80, -1);
2882 gtk_box_pack_start (GTK_BOX(snap_hb), snap_sb, FALSE, FALSE, 0);
2884 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY, snap_cb);
2885 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY, snap_sb);
2886 snap_lb = gtk_label_new("bytes");
2887 gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5f);
2888 gtk_box_pack_start(GTK_BOX(snap_hb), snap_lb, FALSE, FALSE, 0);
2889 gtk_widget_set_sensitive(GTK_WIDGET(snap_sb), device.has_snaplen);
2892 filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2893 gtk_box_pack_start(GTK_BOX(capture_vb), filter_hb, FALSE, FALSE, 0);
2895 filter_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
2896 g_signal_connect(filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
2897 g_signal_connect(filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
2898 gtk_widget_set_tooltip_text(filter_bt,
2899 "Select a capture filter to reduce the amount of packets to be captured. "
2900 "See \"Capture Filters\" in the online help for further information how to use it."
2902 gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, FALSE, 3);
2904 /* Create the capture filter combo box*/
2905 filter_cm = gtk_combo_box_text_new_with_entry();
2906 g_object_set_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY, filter_cm);
2907 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
2908 colorize_filter_te_as_empty(filter_te);
2909 g_signal_connect(filter_te, "changed", G_CALLBACK(capture_filter_check_syntax_cb), NULL);
2910 g_signal_connect(filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
2912 cfilter_list = recent_get_cfilter_list(name);
2913 for (cf_entry = cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
2914 new_cfilter = (const gchar *)cf_entry->data;
2915 /* If this is the current dfilter or the default cfilter, don't put
2916 it in the list, as it'll be added later. */
2917 if ((device.cfilter == NULL || strcmp(device.cfilter, new_cfilter) != 0) &&
2918 (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0)) {
2919 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), new_cfilter);
2922 if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
2923 /* If this is the current dfilter, don't put it in the list, as it'll be
2925 if (device.cfilter == NULL || strcmp(device.cfilter, global_capture_opts.default_options.cfilter) != 0) {
2926 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), global_capture_opts.default_options.cfilter);
2929 if (device.cfilter && (strlen(device.cfilter) > 0)) {
2930 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), device.cfilter);
2931 gtk_combo_box_set_active(GTK_COMBO_BOX(filter_cm), 0);
2934 gtk_widget_set_tooltip_text(filter_cm,
2935 "Enter a capture filter to reduce the amount of packets to be captured. "
2936 "See \"Capture Filters\" in the online help for further information how to use it. "
2937 "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
2939 gtk_box_pack_start(GTK_BOX(filter_hb), filter_cm, TRUE, TRUE, 3);
2941 /* let an eventually capture filters dialog know the text entry to fill in */
2942 g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
2944 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2945 compile_bt = gtk_button_new_with_label("Compile BPF");
2946 g_signal_connect(compile_bt, "clicked", G_CALLBACK(capture_filter_compile_cb), NULL);
2947 gtk_widget_set_tooltip_text(compile_bt,
2948 "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
2949 /* We can't compile without any supported link-types, so disable the button in that case */
2950 gtk_widget_set_sensitive(compile_bt, (num_supported_link_types >= 1));
2951 gtk_box_pack_start(GTK_BOX(filter_hb), compile_bt, FALSE, FALSE, 3);
2954 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2955 buffer_size_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2956 buffer_size_lb = gtk_label_new("Buffer size:");
2957 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 0);
2959 buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.buffer,
2960 1, 65535, 1.0, 10.0, 0.0);
2961 buffer_size_sb = gtk_spin_button_new (buffer_size_adj, 0, 0);
2962 gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) device.buffer);
2963 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (buffer_size_sb), TRUE);
2964 gtk_widget_set_size_request(buffer_size_sb, 80, -1);
2965 gtk_widget_set_tooltip_text(buffer_size_sb,
2966 "The memory buffer size used while capturing. If you notice packet drops, you can try to increase this size.");
2967 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_sb, FALSE, FALSE, 0);
2968 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY, buffer_size_sb);
2969 buffer_size_lb = gtk_label_new("megabyte(s)");
2970 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 3);
2971 gtk_misc_set_alignment(GTK_MISC(buffer_size_lb), 1, 0);
2972 #ifdef HAVE_PCAP_REMOTE
2973 gtk_box_pack_start (GTK_BOX(left_vb), buffer_size_hb, FALSE, FALSE, 0);
2975 gtk_box_pack_start (GTK_BOX(right_vb), buffer_size_hb, FALSE, FALSE, 0);
2979 #ifdef HAVE_PCAP_REMOTE
2981 * *IF* this is a remote interface, add the "Remote Settings"
2982 * button. Do *not* add it for other interfaces, as that could
2983 * lead users to believe that it could somehow be enabled.
2985 /* Both the callback and the data are global */
2986 if (strncmp (device.name, "rpcap://", 8) == 0) {
2987 remote_bt = gtk_button_new_with_label("Remote Settings");
2988 gtk_widget_set_tooltip_text(remote_bt, "Various settings for remote capture.");
2990 g_signal_connect(remote_bt, "clicked", G_CALLBACK(options_remote_cb), NULL);
2992 gtk_box_pack_start(GTK_BOX(right_vb), remote_bt, FALSE, FALSE, 0);
2993 gtk_widget_show(remote_bt);
2999 * *IF* this is an AirPcap interface, add the "Wireless Settings"
3000 * button. Do *not* add it for other interfaces, as that can
3001 * confuse users, so that they ask why this is grayed out on
3002 * their non-Windows machine and ask how to enable it.
3004 airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list, device.name);
3005 if (airpcap_if_selected != NULL) {
3006 advanced_bt = gtk_button_new_with_label("Wireless Settings");
3008 /* Both the callback and the data are global */
3009 g_signal_connect(advanced_bt,"clicked", G_CALLBACK(options_airpcap_advanced_cb), wireless_tb);
3011 gtk_box_pack_start(GTK_BOX(right_vb), advanced_bt, FALSE, FALSE, 0);
3012 gtk_widget_show(advanced_bt);
3016 /* Button row: "Start", "Cancel" and "Help" buttons */
3017 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
3018 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
3020 ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
3021 g_signal_connect(ok_but, "clicked", G_CALLBACK(save_options_cb), NULL);
3022 gtk_widget_set_tooltip_text(ok_but,
3023 "Accept interface settings.");
3024 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
3025 gtk_widget_set_tooltip_text(cancel_bt,
3026 "Cancel and exit dialog.");
3027 window_set_cancel_button(opt_edit_w, cancel_bt, window_cancel_button_cb);
3028 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
3029 gtk_widget_set_tooltip_text(help_bt,
3030 "Show help about capturing.");
3031 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_OPTIONS_DIALOG);
3032 dlg_set_activate(filter_te, ok_but);
3033 gtk_widget_grab_focus(filter_te);
3034 g_signal_connect(opt_edit_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
3035 g_signal_connect(opt_edit_w, "destroy", G_CALLBACK(options_edit_destroy_cb), NULL);
3036 gtk_widget_show_all(opt_edit_w);
3037 window_present(opt_edit_w);
3040 static void toggle_callback(GtkCellRendererToggle *cell _U_,
3044 /* get the treemodel from somewhere */
3047 GtkTreeModel *model;
3048 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3050 GtkWidget *pcap_ng_cb, *filter_cm;
3056 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3057 model = gtk_tree_view_get_model(if_cb);
3058 gtk_tree_model_get_iter (model, &iter, path);
3059 gtk_tree_model_get (model, &iter, CAPTURE, &enabled, IFACE_HIDDEN_NAME, &name, -1);
3060 /* Look for the right interface. The number of interfaces shown might be less
3061 * than the real number. Therefore the path index does not correspond
3062 * necessarily to the position in the list */
3063 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3064 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3065 if (strcmp(device.name, name) == 0) {
3070 if (!device.locked) {
3071 if (enabled == FALSE) {
3072 device.selected = TRUE;
3073 global_capture_opts.num_selected++;
3075 device.selected = FALSE;
3076 global_capture_opts.num_selected--;
3078 device.locked = TRUE;
3081 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
3082 g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
3083 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
3084 if (global_capture_opts.num_selected >= 2) {
3085 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
3086 gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
3088 gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
3090 if (global_capture_opts.num_selected > 0) {
3091 gtk_widget_set_sensitive(ok_bt, TRUE);
3092 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3093 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3096 gtk_widget_set_sensitive(ok_bt, FALSE);
3097 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3098 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3101 /* do something with the new enabled value, and set the new
3102 enabled value in your treemodel */
3103 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, -1);
3104 if (interfaces_dialog_window_present()) {
3105 update_selected_interface(g_strdup(device.name));
3107 if (get_welcome_window() != NULL) {
3108 change_interface_selection(g_strdup(device.name), device.selected);
3111 if (device.cfilter != NULL) {
3112 g_free(device.cfilter);
3113 device.cfilter = NULL;
3114 update_filter_string(device.name, NULL);
3116 device.locked = FALSE;
3117 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
3118 g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
3119 gtk_tree_path_free (path);
3120 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
3121 if (strcmp(gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm)),"") != 0) {
3122 capture_all_filter_check_syntax_cb(NULL, NULL);
3124 update_properties_all();
3127 void enable_selected_interface(gchar *name, gboolean selected)
3131 GtkTreeModel *model;
3134 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3135 model = gtk_tree_view_get_model(if_cb);
3136 gtk_tree_model_get_iter_first(model, &iter);
3138 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
3139 if (strcmp(name, name_str) == 0) {
3140 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, selected, -1);
3144 while (gtk_tree_model_iter_next(model, &iter));
3145 if (global_capture_opts.num_selected > 0) {
3146 gtk_widget_set_sensitive(ok_bt, TRUE);
3147 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3148 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3151 gtk_widget_set_sensitive(ok_bt, FALSE);
3152 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3153 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3159 static void capture_all_cb(GtkToggleButton *button, gpointer d _U_)
3163 GtkTreeModel *model;
3164 GtkWidget *filter_cm, *pcap_ng_cb;
3165 gchar *interface = NULL, *filter_text = NULL;
3166 gboolean enabled = FALSE, capture_set = FALSE, pseudo = FALSE;
3167 guint16 num_temp, i;
3170 if (gtk_toggle_button_get_active(button))
3172 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3173 model = gtk_tree_view_get_model(if_cb);
3174 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
3175 num_temp = global_capture_opts.num_selected++;
3176 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
3177 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
3178 if (gtk_tree_model_get_iter_first(model, &iter)) {
3180 gtk_tree_model_get (model, &iter, CAPTURE, &capture_set, IFACE_HIDDEN_NAME, &interface, -1);
3181 if (strcmp(interface, "any") == 0) {
3184 if (!capture_set && enabled && !pseudo) {
3186 } else if (capture_set && (!enabled || (enabled && pseudo))) {
3190 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, enabled, -1);
3191 if (strlen(filter_text) != 0) {
3192 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3193 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3194 if (strcmp(device.name, interface) == 0) {
3195 g_array_remove_index(global_capture_opts.all_ifaces, i);
3196 device.cfilter = g_strdup(filter_text);
3197 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3198 update_filter_string(device.name, filter_text);
3203 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, -1);
3206 } while (gtk_tree_model_iter_next(model, &iter));
3208 if (num_temp >= 2) {
3209 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
3210 gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
3211 } else if (num_temp <= 1) {
3212 gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
3214 if (interfaces_dialog_window_present()) {
3215 select_all_interfaces(enabled);
3217 if (get_welcome_window() != NULL) {
3218 change_selection_for_all(enabled);
3220 if (global_capture_opts.num_selected != num_temp) {
3221 global_capture_opts.num_selected = num_temp;
3223 if (global_capture_opts.num_selected > 0) {
3224 gtk_widget_set_sensitive(ok_bt, TRUE);
3225 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3226 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3229 gtk_widget_set_sensitive(ok_bt, FALSE);
3230 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3231 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3234 set_sensitivity_for_start_icon();
3238 static gboolean get_all_prom_mode(void)
3240 interface_options interface_opts;
3243 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
3244 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
3245 if (!interface_opts.promisc_mode) {
3252 static void promisc_mode_callback(GtkToggleButton *button, gpointer d _U_)
3256 GtkTreeModel *model;
3257 gboolean enabled = FALSE, set;
3259 interface_options interface_opts;
3262 set = gtk_toggle_button_get_active(button);
3263 gtk_toggle_button_set_active(button, (set?FALSE:TRUE));
3264 if (gtk_toggle_button_get_active(button))
3267 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3268 model = gtk_tree_view_get_model(if_cb);
3269 if (gtk_tree_model_get_iter_first(model, &iter)) {
3271 gtk_list_store_set(GTK_LIST_STORE(model), &iter, PMODE, enabled?"enabled":"disabled", -1);
3272 } while (gtk_tree_model_iter_next(model, &iter));
3275 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3276 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3277 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
3278 device.pmode = (enabled?TRUE:FALSE);
3279 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3282 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
3283 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
3284 global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
3285 interface_opts.promisc_mode = (enabled?TRUE:FALSE);
3286 g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
3290 #if defined (HAVE_PCAP_REMOTE)
3292 show_remote_dialog(GtkWidget *w)
3295 g_free(global_remote_opts.remote_host_opts.remote_host);
3296 g_free(global_remote_opts.remote_host_opts.remote_port);
3297 g_free(global_remote_opts.remote_host_opts.auth_username);
3298 g_free(global_remote_opts.remote_host_opts.auth_password);
3299 global_remote_opts.src_type = CAPTURE_IFREMOTE;
3300 global_remote_opts.remote_host_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
3301 global_remote_opts.remote_host_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
3302 global_remote_opts.remote_host_opts.auth_type = global_capture_opts.default_options.auth_type;
3303 global_remote_opts.remote_host_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
3304 global_remote_opts.remote_host_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
3305 global_remote_opts.remote_host_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
3306 global_remote_opts.remote_host_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
3307 global_remote_opts.remote_host_opts.nocap_local = global_capture_opts.default_options.nocap_local;
3308 #ifdef HAVE_PCAP_SETSAMPLING
3309 global_remote_opts.sampling_method = global_capture_opts.default_options.sampling_method;
3310 global_remote_opts.sampling_param = global_capture_opts.default_options.sampling_param;
3312 capture_remote_cb(GTK_WIDGET(w), FALSE);
3316 static void change_pipe_name_cb(gpointer dialog _U_, gint btn, gpointer data)
3320 gchar *temp, *optname, *snaplen_string/*, *oldname = ""*/;
3322 GtkTreeModel *model;
3328 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3329 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3330 if (strcmp((gchar *)data, device.name) == 0) {
3331 simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
3332 "%sA pipe with this name already exists.%s",
3333 simple_dialog_primary_start(), simple_dialog_primary_end());
3334 if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3335 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3336 model = gtk_tree_view_get_model(if_cb);
3337 if (gtk_tree_model_get_iter_first (model, &iter)) {
3339 gtk_tree_model_get(model, &iter, 0, &optname, -1);
3340 if (strcmp(optname, (gchar *) data) == 0) {
3341 gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
3342 gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
3345 } while (gtk_tree_model_iter_next(model, &iter));
3351 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3352 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3353 if (strcmp(pipe_name, device.name) == 0) {
3354 device.name = g_strdup((gchar *)data);
3355 device.display_name = g_strdup_printf("%s", device.name);
3356 g_array_remove_index(global_capture_opts.all_ifaces, i);
3357 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3358 temp = g_strdup_printf("<b>%s</b>", device.display_name);
3359 if (device.has_snaplen) {
3360 snaplen_string = g_strdup_printf("%d", device.snaplen);
3362 snaplen_string = g_strdup("default");
3364 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3365 model = gtk_tree_view_get_model(if_cb);
3366 if (gtk_tree_model_get_iter_first (model, &iter)) {
3368 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &optname, -1);
3369 if (strcmp(optname, pipe_name) == 0) {
3370 #if defined(HAVE_PCAP_CREATE)
3371 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
3372 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
3373 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
3375 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
3378 oldname = g_strdup(pipe_name);
3380 pipe_name = g_strdup(device.name);
3383 } while (gtk_tree_model_iter_next(model, &iter));
3387 if (global_capture_opts.num_selected > 0) {
3388 gtk_widget_set_sensitive(ok_bt, TRUE);
3389 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3390 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3393 gtk_widget_set_sensitive(ok_bt, FALSE);
3394 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3395 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3398 refresh_non_local_interface_lists();
3403 case(ESD_BTN_CANCEL): {
3404 if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3405 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3406 model = gtk_tree_view_get_model(if_cb);
3408 if (gtk_tree_model_get_iter_first (model, &iter)) {
3410 gtk_tree_model_get(model, &iter, 0, &optname, -1);
3411 if (strcmp(optname, (gchar *) data) == 0) {
3412 gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
3413 gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
3416 } while (gtk_tree_model_iter_next(model, &iter));
3422 g_assert_not_reached();
3427 add_pipe_cb(gpointer w _U_)
3432 GtkTreeModel *model;
3434 gchar *temp, *path_str, *snaplen_string;
3436 const gchar *g_save_file;
3441 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3442 g_save_file = gtk_entry_get_text(GTK_ENTRY(pipe_te));
3443 name = g_strdup(g_save_file);
3444 if (strcmp(name, "New pipe") == 0 || strcmp(name, "") == 0) {
3448 if (strcmp(pipe_name, "New pipe") != 0) {
3449 if (strcmp(pipe_name, name) != 0) {
3450 dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_OK_CANCEL,
3451 "%sDo you want to change %s to %s?%s",
3452 simple_dialog_primary_start(), pipe_name, name, simple_dialog_primary_end());
3453 simple_dialog_set_cb(dialog, change_pipe_name_cb, name);
3456 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3457 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3458 if (strcmp(name, device.name) == 0) {
3463 pipe_name = g_strdup(g_save_file);
3464 device.name = g_strdup(g_save_file);
3465 device.display_name = g_strdup_printf("%s", device.name);
3466 device.hidden = FALSE;
3467 device.selected = TRUE;
3468 device.type = IF_PIPE;
3469 device.pmode = global_capture_opts.default_options.promisc_mode;
3470 device.has_snaplen = global_capture_opts.default_options.has_snaplen;
3471 device.snaplen = global_capture_opts.default_options.snaplen;
3472 device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
3473 device.addresses = NULL;
3474 device.no_addresses = 0;
3475 device.last_packets = 0;
3476 device.links = NULL;
3477 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
3478 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
3480 device.active_dlt = -1;
3481 device.locked = FALSE;
3482 device.if_info.name = g_strdup(g_save_file);
3483 device.if_info.friendly_name = NULL;
3484 device.if_info.vendor_description = NULL;
3485 device.if_info.addrs = NULL;
3486 device.if_info.loopback = FALSE;
3487 #if defined(HAVE_PCAP_CREATE)
3488 device.monitor_mode_enabled = FALSE;
3489 device.monitor_mode_supported = FALSE;
3491 global_capture_opts.num_selected++;
3493 indx = global_capture_opts.all_ifaces->len;
3494 temp = g_strdup_printf("<b>%s</b>", device.display_name);
3496 if (device.has_snaplen) {
3497 snaplen_string = g_strdup_printf("%d", device.snaplen);
3499 snaplen_string = g_strdup("default");
3502 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3503 path_str = g_strdup_printf("%d", indx);
3504 model = gtk_tree_view_get_model(if_cb);
3505 gtk_tree_model_get_iter_from_string(model, &iter, path_str);
3506 g_array_append_val(global_capture_opts.all_ifaces, device);
3507 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
3508 #if defined(HAVE_PCAP_CREATE)
3509 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
3510 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
3511 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
3513 gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
3515 if (global_capture_opts.num_selected > 0) {
3516 gtk_widget_set_sensitive(ok_bt, TRUE);
3517 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3518 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3521 gtk_widget_set_sensitive(ok_bt, FALSE);
3522 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3523 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3527 /* Refresh all places that are displaying an interface list
3528 that includes interfaces other than local interfaces
3530 refresh_non_local_interface_lists();
3537 pipe_new_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
3539 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3540 GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3541 GtkListStore *store;
3544 /* Add a new entry to the pipe list. */
3546 store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
3547 gtk_list_store_append(store, &iter);
3549 gtk_list_store_set(store, &iter, 0, "New pipe", -1);
3550 pipe_name = "New pipe";
3552 /* Select the item. */
3553 gtk_tree_selection_select_iter(gtk_tree_view_get_selection(pipe_l), &iter);
3555 gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
3557 gtk_widget_grab_focus(name_te);
3561 pipe_del_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
3563 GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
3564 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3565 GtkTreeSelection *sel;
3566 GtkTreeModel *model, *optmodel;
3567 GtkTreeIter iter, optiter;
3569 gchar *name, *optname = NULL;
3572 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
3573 /* If something was selected */
3575 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3576 gtk_tree_model_get(model, &iter, 0, &name, -1);
3577 if (name != NULL && atoi(gtk_tree_model_get_string_from_iter(model, &iter)) < (gint)global_capture_opts.all_ifaces->len) {
3578 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3579 if (strcmp(g_array_index(global_capture_opts.all_ifaces, interface_t, i).name, name) == 0) {
3580 g_array_remove_index(global_capture_opts.all_ifaces, i);
3584 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
3585 gtk_entry_set_text(GTK_ENTRY(name_te), "");
3586 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3587 optmodel = gtk_tree_view_get_model(if_cb);
3588 if (gtk_tree_model_get_iter_first (optmodel, &optiter)) {
3590 gtk_tree_model_get(optmodel, &optiter, IFACE_HIDDEN_NAME, &optname, -1);
3591 if (optname != NULL && strcmp(optname, name) == 0) {
3592 gtk_list_store_remove(GTK_LIST_STORE(gtk_tree_view_get_model(if_cb)), &optiter);
3595 } while (gtk_tree_model_iter_next(optmodel, &optiter));
3602 if (gtk_tree_model_get_iter_first (model, &iter)) {
3603 gtk_tree_selection_select_iter(sel, &iter);
3605 gtk_widget_set_sensitive(name_te, FALSE);
3608 /* Refresh all places that are displaying an interface list
3609 that includes interfaces other than local interfaces
3611 refresh_non_local_interface_lists();
3615 pipe_name_te_changed_cb(GtkWidget *w _U_, gpointer data _U_)
3617 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3618 GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
3620 GtkTreeSelection *sel;
3621 GtkTreeModel *model;
3624 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
3625 name = gtk_entry_get_text(GTK_ENTRY(name_te));
3627 /* if something was selected */
3628 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3629 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, name, -1);
3634 fill_pipe_list(void)
3639 GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3640 GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
3642 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3643 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3644 if (device.type == IF_PIPE) {
3645 gtk_list_store_append(store, &iter);
3646 gtk_list_store_set(store, &iter, 0, device.name, -1);
3654 pipe_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
3656 /* GtkWidget *pipe_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));*/
3657 GtkTreeModel *model;
3659 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3660 GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY);
3663 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3664 gtk_tree_model_get(model, &iter, 0, &name, -1);
3666 if (name_te != NULL) {
3667 gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
3668 gtk_widget_set_sensitive(name_te, TRUE);
3669 selected_name = gtk_entry_get_text(GTK_ENTRY(name_te));
3670 pipe_name = g_strdup(selected_name);
3672 if (del_bt != NULL) {
3673 gtk_widget_set_sensitive(del_bt, TRUE);
3681 cancel_pipe_cb (gpointer w _U_)
3683 window_destroy(GTK_WIDGET(interface_management_w));
3687 fill_local_list(void)
3692 GtkListStore *store;
3693 GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3696 store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
3698 store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
3701 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3702 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3703 if (device.local && device.type != IF_PIPE && device.type != IF_STDIN) {
3704 gtk_list_store_append(store, &iter);
3707 gtk_list_store_set(store, &iter, 0, device.friendly_name, 1, device.name, 2, device.hidden, -1);
3709 gtk_list_store_set(store, &iter, 0, device.name, 1, device.hidden, -1);
3715 gtk_tree_view_set_model(GTK_TREE_VIEW(local_l), GTK_TREE_MODEL(store));
3718 static void local_hide_cb(GtkCellRendererToggle *cell _U_,
3722 gboolean hide, hide_enabled = TRUE;
3724 GtkTreeModel *model;
3726 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3727 GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3729 model = gtk_tree_view_get_model(local_l);
3730 gtk_tree_model_get_iter (model, &iter, path);
3731 gtk_tree_model_get (model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
3733 /* See if this is the currently selected capturing device */
3734 if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0')) {
3737 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3738 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3739 if ((strcmp(device.display_name, prefs.capture_device) == 0) &&
3740 (strcmp(device.name, name) == 0)) {
3741 /* Don't allow current interface to be hidden */
3742 hide_enabled = FALSE;
3750 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, FALSE, -1);
3752 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, TRUE, -1);
3755 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Default interface cannot be hidden");
3760 apply_local_cb(GtkWidget *win _U_, gpointer *data _U_)
3763 GtkTreeModel *model;
3764 gchar *name, *new_hide;
3766 gint first_if = TRUE;
3767 GtkTreeView *local_l;
3769 if (global_capture_opts.all_ifaces->len > 0) {
3770 local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3771 model = gtk_tree_view_get_model(local_l);
3773 new_hide = (gchar*)g_malloc0(MAX_VAL_LEN);
3775 if (gtk_tree_model_get_iter_first (model, &iter)) {
3777 gtk_tree_model_get(model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
3781 if (first_if != TRUE) {
3782 g_strlcat (new_hide, ",", MAX_VAL_LEN);
3784 g_strlcat (new_hide, name, MAX_VAL_LEN);
3787 } while (gtk_tree_model_iter_next(model, &iter));
3790 /* write new "hidden" string to preferences */
3791 g_free(prefs.capture_devices_hide);
3792 prefs.capture_devices_hide = new_hide;
3793 hide_interface(g_strdup(new_hide));
3795 /* Refresh all places that are displaying an interface list
3796 that includes local interfaces. */
3797 refresh_local_interface_lists();
3799 /* save changes to the preferences file */
3800 if (!prefs.gui_use_pref_save) {
3807 capture_dlg_refresh_if (void)
3811 if (interface_management_w)
3814 view = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3815 create_and_fill_model(GTK_TREE_VIEW(view));
3816 update_properties_all();
3820 rescan_local_cb(GtkWidget *button _U_, gpointer *data _U_)
3822 /* Refresh all places that are displaying an interface list
3823 that includes local interfaces. */
3824 refresh_local_interface_lists();
3827 #if defined(HAVE_PCAP_REMOTE)
3829 fill_remote_list(void)
3833 GtkTreeIter iter, child;
3835 GtkTreeView *remote_l;
3836 GtkTreeStore *store;
3837 GtkWidget *host_te, *remote_w;
3840 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
3841 remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3842 store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
3843 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3844 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3848 /* fill the store */
3849 if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) != 0) {
3850 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
3851 host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
3852 iftype_combo_box_add (host_te, &device);
3853 host = g_strdup(device.remote_opts.remote_host_opts.remote_host);
3854 gtk_tree_store_append(store, &iter, NULL);
3855 gtk_tree_store_set(store, &iter, 0, host, 3, "FALSE", -1);
3856 gtk_tree_store_append(store, &child, &iter);
3857 gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
3859 gtk_tree_store_append(store, &child, &iter);
3860 gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
3864 gtk_tree_view_set_model(GTK_TREE_VIEW(remote_l), GTK_TREE_MODEL(store));
3865 gtk_tree_view_expand_all(GTK_TREE_VIEW(remote_l));
3869 button_hide_cb(GtkTreeViewColumn *column, GtkCellRenderer *renderer,
3870 GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
3874 gtk_tree_model_get(model, iter, 3, &enabled, -1);
3875 if (strcmp(enabled, "TRUE") == 0) {
3876 g_object_set(G_OBJECT(renderer), "visible", TRUE, NULL);
3877 } else if (strcmp(enabled, "FALSE") == 0){
3878 g_object_set(G_OBJECT(renderer), "visible", FALSE, NULL);
3882 static void remote_hide_cb(GtkCellRendererToggle *cell _U_,
3887 GtkTreeModel *model;
3889 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3890 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3892 model = gtk_tree_view_get_model(remote_l);
3893 gtk_tree_model_get_iter (model, &iter, path);
3894 gtk_tree_model_get (model, &iter, 2, &hide, -1);
3897 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, FALSE, -1);
3899 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, TRUE, -1);
3904 ok_remote_cb(GtkWidget *win _U_, gpointer *data _U_)
3906 GtkTreeIter iter, child;
3907 GtkTreeModel *model;
3908 gchar *name, *new_hide;
3910 gint first_if = TRUE;
3912 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3913 model = gtk_tree_view_get_model(remote_l);
3915 new_hide = g_malloc0(MAX_VAL_LEN);
3917 if (gtk_tree_model_get_iter_first (model, &iter)) {
3919 gtk_tree_model_get(model, &iter, 1, &name, 2, &hide, -1);
3920 if (!name && gtk_tree_model_iter_children(model, &child, &iter)) {
3922 gtk_tree_model_get(model, &child, 1, &name, 2, &hide, -1);
3926 if (first_if != TRUE) {
3927 g_strlcat (new_hide, ",", MAX_VAL_LEN);
3929 g_strlcat (new_hide, name, MAX_VAL_LEN);
3932 } while (gtk_tree_model_iter_next(model, &child));
3934 } while (gtk_tree_model_iter_next(model, &iter));
3937 hide_interface(g_strdup(new_hide));
3939 /* Refresh all places that are displaying an interface list
3940 that includes interfaces other than local interfaces
3941 (such as remote interfaces). */
3942 refresh_non_local_interface_lists();
3946 select_host_cb(GtkTreeSelection *selection _U_,
3947 GtkTreeModel *model,
3949 gboolean path_currently_selected _U_,
3954 gtk_tree_model_get_iter (model, &iter, path);
3955 if (gtk_tree_model_iter_has_child(model, &iter)) {
3957 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), TRUE);
3965 remove_remote_host(GtkWidget *w _U_, gpointer data _U_)
3967 GtkTreeIter iter, child;
3968 GtkTreeModel *model;
3970 gint num_children, i;
3972 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3973 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
3975 model = gtk_tree_view_get_model(remote_l);
3976 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
3977 gtk_tree_model_get(model, &iter, 0, &host, -1);
3978 if ((num_children = gtk_tree_model_iter_n_children(model, &iter)) > 0) {
3979 for (i = num_children-1; i >= 0; i--) {
3980 if (gtk_tree_model_iter_nth_child(model, &child, &iter, i)) {
3981 gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
3985 gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
3986 if (--num_selected == 0) {
3987 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
3989 for (i = global_capture_opts.all_ifaces->len-1; i >= 0; i--) {
3990 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3994 if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) == 0) {
3995 g_array_remove_index(global_capture_opts.all_ifaces, i);
4000 /* Refresh all places that are displaying an interface list
4001 that includes interfaces other than local interfaces
4002 (such as remote interfaces). */
4003 refresh_non_local_interface_lists();
4009 show_add_interfaces_dialog(GtkWidget *bt _U_, GtkWidget *parent_win)
4011 GtkWidget *vbox, *top_hb;
4012 GtkWidget *hbox, *bbox, *list_bb, *edit_fr, *pipe_fr, *pipe_sc, *pipe_l, *props_fr, *props_vb;
4014 GtkWidget *temp_page, *tmp;
4015 GtkWidget *pipe_hb, *pipe_bt, *pipe_lb, *pipe_te, *pipe_vb;
4016 GtkWidget *add_bt, *cancel_bt, *new_bt, *del_bt, *middle_hb;
4017 GtkWidget *local_fr, *local_l, *local_sc, *local_vb;
4018 GtkWidget *apply_bt, *refresh_bt;
4019 GtkCellRenderer *renderer, *toggle_renderer;
4020 GtkTreeViewColumn *column;
4021 GtkTreeSelection *sel;
4022 GtkListStore *store;
4023 #if defined(HAVE_PCAP_REMOTE)
4024 GtkWidget *remote_fr, *remote_l, *remote_sc, *remote_vb;
4025 GtkWidget *delete_bt, *add_but, *ok_but;
4026 GtkWidget *button_hbox, *help_hbox;
4027 GtkTreeSelection *selection;
4030 interface_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Interface Management");
4031 gtk_window_set_transient_for(GTK_WINDOW(interface_management_w), GTK_WINDOW(parent_win));
4032 gtk_window_set_destroy_with_parent(GTK_WINDOW(interface_management_w), TRUE);
4034 gtk_window_set_default_size(GTK_WINDOW(interface_management_w), 700, 300);
4036 vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4037 gtk_container_add(GTK_CONTAINER(interface_management_w), vbox);
4038 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
4040 main_nb = gtk_notebook_new();
4041 gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
4044 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4045 tmp = gtk_label_new("Pipes");
4046 gtk_widget_show(tmp);
4047 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4048 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
4050 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4053 pipe_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20, FALSE);
4054 gtk_container_set_border_width(GTK_CONTAINER(pipe_hb), 5);
4055 gtk_box_pack_start(GTK_BOX(temp_page), pipe_hb, TRUE, TRUE, 0);
4057 /* Container for each row of widgets */
4058 pipe_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4059 gtk_container_set_border_width(GTK_CONTAINER(pipe_vb), 0);
4060 gtk_box_pack_start(GTK_BOX (pipe_hb), pipe_vb, TRUE, TRUE, 0);
4061 gtk_widget_show(pipe_vb);
4063 /* Top row: Buttons and pipe list */
4064 top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4065 gtk_box_pack_start(GTK_BOX (pipe_vb), top_hb, TRUE, TRUE, 0);
4066 gtk_widget_show(top_hb);
4068 edit_fr = gtk_frame_new("");
4069 gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
4070 gtk_widget_show(edit_fr);
4072 list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
4073 gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
4074 gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
4075 gtk_widget_show(list_bb);
4077 new_bt = gtk_button_new_from_stock(GTK_STOCK_NEW);
4078 g_signal_connect(new_bt, "clicked", G_CALLBACK(pipe_new_bt_clicked_cb), NULL);
4079 gtk_widget_show(new_bt);
4080 gtk_box_pack_start (GTK_BOX (list_bb), new_bt, FALSE, FALSE, 0);
4081 gtk_widget_set_tooltip_text (new_bt, "Add a new pipe (with default properties)");
4083 del_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
4084 g_signal_connect(del_bt, "clicked", G_CALLBACK(pipe_del_bt_clicked_cb), NULL);
4085 gtk_widget_show(del_bt);
4086 gtk_widget_set_sensitive(del_bt, FALSE);
4087 gtk_box_pack_start (GTK_BOX (list_bb), del_bt, FALSE, FALSE, 0);
4088 gtk_widget_set_tooltip_text (del_bt, "Remove the selected pipe from the list");
4089 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY, del_bt);
4091 pipe_fr = gtk_frame_new("Pipes");
4092 gtk_box_pack_start(GTK_BOX(top_hb), pipe_fr, TRUE, TRUE, 0);
4093 gtk_widget_show(pipe_fr);
4095 pipe_sc = scrolled_window_new(NULL, NULL);
4096 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pipe_sc),
4099 gtk_container_set_border_width (GTK_CONTAINER (pipe_sc), 5);
4100 gtk_container_add(GTK_CONTAINER(pipe_fr), pipe_sc);
4101 gtk_widget_show(pipe_sc);
4103 store = gtk_list_store_new(1, G_TYPE_STRING);
4104 pipe_l = tree_view_new(GTK_TREE_MODEL(store));
4105 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pipe_l), FALSE);
4107 renderer = gtk_cell_renderer_text_new();
4108 column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
4109 gtk_tree_view_column_set_expand(column, TRUE);
4110 gtk_tree_view_column_set_sort_column_id(column, 0);
4111 gtk_tree_view_append_column(GTK_TREE_VIEW(pipe_l), column);
4113 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
4114 gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
4115 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY, pipe_l);
4116 g_signal_connect(sel, "changed", G_CALLBACK(pipe_sel_list_cb), pipe_vb);
4117 gtk_container_add(GTK_CONTAINER(pipe_sc), pipe_l);
4118 gtk_widget_show(pipe_l);
4122 g_object_unref(G_OBJECT(store));
4124 props_fr = gtk_frame_new("");
4125 gtk_box_pack_start(GTK_BOX(pipe_vb), props_fr, FALSE, FALSE, 0);
4126 gtk_widget_show(props_fr);
4128 props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4129 gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
4130 gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
4131 gtk_widget_show(props_vb);
4133 middle_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4134 gtk_box_pack_start(GTK_BOX (props_vb), middle_hb, TRUE, TRUE, 0);
4135 gtk_widget_show(middle_hb);
4137 pipe_lb = gtk_label_new("Pipe:");
4138 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_lb, FALSE, FALSE, 3);
4139 pipe_te = gtk_entry_new();
4140 gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_te),
4141 "Enter the name of the pipe data should be captured from. "
4143 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_te, TRUE, TRUE, 3);
4144 gtk_widget_set_sensitive(pipe_te, FALSE);
4145 pipe_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
4146 gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_bt),
4147 "Select a pipe from which data should be captured, "
4148 "instead of entering the pipe name directly. "
4150 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_bt, FALSE, FALSE, 0);
4151 g_signal_connect(pipe_te, "changed", G_CALLBACK(pipe_name_te_changed_cb), NULL);
4152 g_signal_connect(pipe_bt, "clicked", G_CALLBACK(capture_prep_pipe_cb), pipe_te);
4154 bbox = dlg_button_row_new(GTK_STOCK_SAVE, GTK_STOCK_CLOSE, NULL);
4155 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4157 add_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
4158 g_signal_connect(add_bt, "clicked", G_CALLBACK(add_pipe_cb), interface_management_w);
4159 gtk_widget_set_tooltip_text(GTK_WIDGET(add_bt), "Add pipe to the list of interfaces.");
4161 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
4162 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4163 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4165 gtk_widget_show(bbox);
4166 gtk_widget_show(temp_page);
4168 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY, pipe_te);
4170 /* --- Local interfaces --- */
4171 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4172 tmp = gtk_label_new("Local Interfaces");
4173 gtk_widget_show(tmp);
4174 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4175 gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
4176 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4178 local_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4179 gtk_container_set_border_width(GTK_CONTAINER(local_vb), 0);
4180 gtk_box_pack_start(GTK_BOX(temp_page), local_vb, TRUE, TRUE, 0);
4181 gtk_widget_show(local_vb);
4183 local_fr = gtk_frame_new("Local Interfaces");
4184 gtk_box_pack_start(GTK_BOX(local_vb), local_fr, TRUE, TRUE, 0);
4185 gtk_widget_show(local_fr);
4187 local_sc = scrolled_window_new(NULL, NULL);
4188 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(local_sc),
4191 gtk_container_set_border_width (GTK_CONTAINER (local_sc), 5);
4192 gtk_container_add(GTK_CONTAINER(local_fr), local_sc);
4193 gtk_widget_show(local_sc);
4195 local_l = gtk_tree_view_new();
4198 renderer = gtk_cell_renderer_text_new();
4199 column = gtk_tree_view_column_new_with_attributes("Friendly Name", renderer, "text", 0, NULL);
4200 gtk_tree_view_column_set_expand(column, TRUE);
4201 gtk_tree_view_column_set_sort_column_id(column, 0);
4202 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4205 renderer = gtk_cell_renderer_text_new();
4206 column = gtk_tree_view_column_new_with_attributes("Interface Name", renderer, "text", 0+LOCAL_OFFSET, NULL);
4207 gtk_tree_view_column_set_expand(column, TRUE);
4208 gtk_tree_view_column_set_sort_column_id(column, 0+LOCAL_OFFSET);
4209 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4211 toggle_renderer = gtk_cell_renderer_toggle_new();
4212 column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 1+LOCAL_OFFSET, NULL);
4213 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (local_hide_cb), NULL);
4214 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4215 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
4217 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY, local_l);
4218 gtk_container_add(GTK_CONTAINER(local_sc), local_l);
4219 gtk_widget_show(local_l);
4223 bbox = dlg_button_row_new(GTK_STOCK_REFRESH, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL);
4225 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4226 refresh_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_REFRESH);
4227 g_signal_connect(refresh_bt, "clicked", G_CALLBACK(rescan_local_cb), NULL);
4228 gtk_widget_set_tooltip_text(GTK_WIDGET(refresh_bt), "Rescan the local interfaces and refresh the list");
4230 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
4231 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4232 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4234 apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
4235 g_signal_connect(GTK_WIDGET(apply_bt), "clicked", G_CALLBACK(apply_local_cb), NULL);
4236 gtk_widget_set_tooltip_text(GTK_WIDGET(apply_bt), "Apply the changes to the general list of local interfaces");
4238 gtk_widget_show(bbox);
4239 gtk_widget_show(temp_page);
4242 #if defined (HAVE_PCAP_REMOTE)
4243 /* --- remote interfaces --- */
4244 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4245 tmp = gtk_label_new("Remote Interfaces");
4246 gtk_widget_show(tmp);
4247 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4248 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
4249 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4251 remote_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4252 gtk_container_set_border_width(GTK_CONTAINER(remote_vb), 0);
4253 gtk_box_pack_start(GTK_BOX(temp_page), remote_vb, TRUE, TRUE, 0);
4254 gtk_widget_show(remote_vb);
4256 remote_fr = gtk_frame_new("Remote Interfaces");
4257 gtk_box_pack_start(GTK_BOX(remote_vb), remote_fr, TRUE, TRUE, 0);
4258 gtk_widget_show(remote_fr);
4260 remote_sc = scrolled_window_new(NULL, NULL);
4261 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(remote_sc),
4264 gtk_container_set_border_width (GTK_CONTAINER (remote_sc), 5);
4265 gtk_container_add(GTK_CONTAINER(remote_fr), remote_sc);
4266 gtk_widget_show(remote_sc);
4268 remote_l = gtk_tree_view_new();
4270 renderer = gtk_cell_renderer_text_new();
4271 column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", 0, NULL);
4272 gtk_tree_view_column_set_expand(column, TRUE);
4273 gtk_tree_view_column_set_sort_column_id(column, 0);
4274 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4276 renderer = gtk_cell_renderer_text_new();
4277 column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", 1, NULL);
4278 gtk_tree_view_column_set_expand(column, TRUE);
4279 gtk_tree_view_column_set_sort_column_id(column, 1);
4280 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4282 toggle_renderer = gtk_cell_renderer_toggle_new();
4283 column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 2, NULL);
4284 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (remote_hide_cb), NULL);
4285 gtk_tree_view_column_set_cell_data_func(column, toggle_renderer, button_hide_cb, NULL, FALSE);
4286 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4287 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
4289 renderer = gtk_cell_renderer_text_new();
4290 column = gtk_tree_view_column_new_with_attributes("Control", renderer, "text", 3, NULL);
4291 gtk_tree_view_column_set_visible(column, FALSE);
4292 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4294 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
4295 gtk_tree_selection_set_select_function(selection, select_host_cb, NULL, FALSE);
4297 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY, remote_l);
4298 gtk_container_add(GTK_CONTAINER(remote_sc), remote_l);
4299 gtk_widget_show(remote_l);
4303 bbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4304 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4305 gtk_widget_show(bbox);
4307 button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
4308 gtk_box_pack_end(GTK_BOX(bbox), button_hbox, FALSE, FALSE, 0);
4309 gtk_widget_show(button_hbox);
4310 gtk_box_set_spacing(GTK_BOX(button_hbox), DLG_BUTTON_SPACING);
4312 help_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
4313 gtk_box_pack_start(GTK_BOX(bbox), help_hbox, FALSE, FALSE, 0);
4314 gtk_widget_show(help_hbox);
4315 gtk_box_set_spacing(GTK_BOX(help_hbox), DLG_BUTTON_SPACING);
4317 add_but = gtk_button_new_from_stock(GTK_STOCK_ADD);
4318 g_object_set_data(G_OBJECT(bbox), GTK_STOCK_ADD, add_but);
4319 gtk_box_pack_start(GTK_BOX(help_hbox), add_but, FALSE, FALSE, 0);
4320 g_signal_connect(add_but, "clicked", G_CALLBACK(show_remote_dialog), NULL);
4321 gtk_widget_set_tooltip_text(GTK_WIDGET(add_but), "Add a remote host to the list");
4322 gtk_widget_show(add_but);
4324 delete_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
4325 g_object_set_data(G_OBJECT(bbox), GTK_STOCK_DELETE, delete_bt);
4326 gtk_box_pack_start(GTK_BOX(help_hbox), delete_bt, FALSE, FALSE, 0);
4327 g_signal_connect(delete_bt, "clicked", G_CALLBACK(remove_remote_host), NULL);
4328 gtk_widget_set_tooltip_text(GTK_WIDGET(delete_bt), "Remove a remote host from the list");
4329 gtk_widget_set_sensitive(GTK_WIDGET(delete_bt), FALSE);
4330 g_object_set_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY, delete_bt);
4331 gtk_widget_show(delete_bt);
4333 ok_but = gtk_button_new_from_stock(GTK_STOCK_APPLY);
4334 gtk_box_pack_end(GTK_BOX(button_hbox), ok_but, FALSE, FALSE, 0);
4335 g_signal_connect(GTK_WIDGET(ok_but), "clicked", G_CALLBACK(ok_remote_cb), NULL);
4336 gtk_widget_set_tooltip_text(GTK_WIDGET(ok_but), "Apply the changes to the general list of local interfaces");
4337 gtk_widget_show(ok_but);
4339 cancel_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
4340 gtk_box_pack_end(GTK_BOX(button_hbox), cancel_bt, FALSE, FALSE, 0);
4341 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4342 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4343 gtk_widget_show(cancel_bt);
4345 gtk_widget_show(temp_page);
4348 gtk_widget_show_all(interface_management_w);
4351 /* show capture prepare (options) dialog */
4354 Note that capture_interface_list() is called directly (or indirectly) during the
4355 creation of (and changes to) the capture options dialog window.
4357 Also note that capture_interface_list() indirectly runs the gtk main loop temporarily
4358 to process queued events (which may include button-presses, key-presses, etc).
4359 (This is done while awaiting a response from dumpcap which is invoked to obtain
4360 the capture interface list).
4361 This means other Wireshark callbacks can be invoked while the capture options window
4362 is being created or updated (in effect an "interrupt" can occur).
4364 Needless to say, "race conditions" may occur in "interrupt" code which depends upon the exact
4365 state of the capture options dialog window and which may be invoked during the
4366 creation of (or changes to) the capture options dialog window.
4368 For example: if a user hits "Capture:Options" and then immediately hits "Capture:Start",
4369 capture_start_cb() may be invoked before capture_prep_cb() has been completed (i.e., during
4370 a call to capture_interface_list() in the code which creates the capture options window).
4371 capture_start_cb() depends upon certain properties of the capture options window having been
4372 initialized and thus fails if the properties have not (yet) been initialized.
4374 An interlock has been added to handle this particular situation;
4375 Ideally a more general solution should be implemented since it's probably difficult
4376 (if not nearly impossible) to identify all the possible "race conditions".
4378 ? Prevent the temporary running of the gtk main loop in cases wherein dumpcap is invoked for a
4379 simple request/reply ? (e.g., capture_interface_list()) ??
4385 columns_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
4387 GtkWidget *menu = (GtkWidget *)data;
4388 GdkEventButton *event_button = NULL;
4390 /* context menu handler */
4391 if (event->type == GDK_BUTTON_PRESS) {
4392 event_button = (GdkEventButton *) event;
4394 /* To quote the "Gdk Event Structures" doc:
4395 * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
4396 if (event_button->button == 3) {
4397 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, widget,
4398 event_button->button,
4399 event_button->time);
4400 g_signal_stop_emission_by_name(widget, "button_press_event");
4408 update_properties_all(void)
4412 gboolean capture_all;
4413 gboolean promisc_all;
4414 gboolean filter_all;
4416 GtkWidget *promisc_b;
4417 GtkWidget *capture_b;
4418 GtkWidget *all_filter_te;
4420 /* If we don't have a Capture Options dialog open, there's nothing
4422 if (cap_open_w == NULL)
4425 /* Determine whether all interfaces:
4427 are selected for capturing;
4429 all selected interfaces are in promiscuous mode;
4431 all selected interfaces have the same capture filter.
4433 Start out by assuming that all three are the case, and change that
4434 once we find an interface where it's not the case. */
4439 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
4440 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
4441 if (!device.hidden) {
4442 if (!device.selected) {
4443 /* This interface isn't selected, so not all interfaces are selected. */
4444 capture_all = FALSE;
4446 /* This interface is selected; is it in promiscuous mode? */
4447 if (!device.pmode) {
4448 /* No, so not all selected interfaces are in promiscuous mode. */
4449 promisc_all = FALSE;
4451 /* Have we seen the same capture filter on all interfaces at
4452 which we've looked so far? */
4453 if (device.cfilter != NULL && filter_all) {
4454 /* Yes. Is this the first interface for which we've seen a
4456 if (filter_str == NULL) {
4457 /* First selected interface - save its capture filter;
4458 there aren't any filters against which to compare. */
4459 filter_str = g_strdup(device.cfilter);
4461 /* Not the first selected interface; is its capture filter
4462 the same as the one the other interfaces we've looked
4464 if (strcmp(device.cfilter, filter_str) != 0) {
4465 /* No, so not all selected interfaces have the same capture
4467 if (filter_str != NULL) {
4479 /* If all interfaces are selected, check the "capture on all interfaces"
4480 checkbox, otherwise un-check it. */
4482 capture_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL);
4483 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(capture_b), TRUE);
4486 /* If all selected interfaces are in promiscuous mode, check the global
4487 "promiscuous mode" checkbox, otherwise un-check it. */
4488 promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
4489 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), promisc_all);
4491 /* If all selected interfaces have the same filter string, set the
4492 global filter string to it. */
4493 all_filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY)));
4495 /* Either no interfaces were selected, or all selected interfaces
4496 have the same filter. In the former case, make the global capture
4497 filter empty; in the latter case, make it that filter. */
4498 if (filter_str != NULL) {
4499 gtk_entry_set_text(GTK_ENTRY(all_filter_te), filter_str);
4502 gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
4505 /* Not all selected interfaces have the same filter, so there is no
4506 global capture filter; make it empty to reflect that. */
4507 gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
4513 column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
4515 GtkWidget *col = (GtkWidget *) data;
4517 GtkWidget *menu = (GtkWidget *)g_object_get_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY);
4519 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
4520 g_object_set_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY, col);
4521 return columns_menu_handler (widget, event, menu);
4526 capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
4529 *main_hb, *left_vb, *right_vb,
4530 *capture_fr, *capture_vb,
4532 *promisc_cb, *pcap_ng_cb,
4534 *file_hb, *file_bt, *file_lb, *file_te,
4535 *multi_hb, *multi_grid, *multi_files_on_cb,
4536 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
4537 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
4538 *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
4539 *stop_files_cb, *stop_files_sb, *stop_files_lb,
4540 *limit_fr, *limit_vb, *limit_hb, *limit_grid,
4541 *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
4542 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
4543 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
4544 *display_fr, *display_vb,
4545 *sync_cb, *auto_scroll_cb, *hide_info_cb,
4546 *resolv_fr, *resolv_vb,
4547 *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb,
4549 *all_filter_cm, *all_filter_te, *all_filter_bt, *all_filter_hb,
4553 GtkWidget *decryption_cb;
4557 GtkWidget *iftype_cbx;
4559 GtkAdjustment *ringbuffer_nbf_adj,
4560 *stop_packets_adj, *stop_filesize_adj, *stop_duration_adj, *stop_files_adj,
4561 *ring_filesize_adj, *file_duration_adj;
4567 GtkCellRenderer *renderer;
4568 GtkCellRenderer *toggle_renderer;
4569 GtkTreeSelection *selection;
4570 GtkTreeViewColumn *column;
4571 gboolean if_present = TRUE;
4572 GList *all_cfilter_list, *cf_entry;
4573 window_geometry_t tl_geom;
4574 const gchar *new_cfilter;
4576 if (interfaces_dialog_window_present()) {
4577 destroy_if_window();
4579 if (cap_open_w != NULL) {
4580 /* There's already a "Capture Options" dialog box; reactivate it. */
4581 reactivate_window(cap_open_w);
4584 init_columns_menu();
4586 /* use user-defined title if preference is set */
4588 cap_title = create_user_window_title("Wireshark: Capture Options");
4590 cap_open_complete = FALSE;
4591 cap_open_w = dlg_window_new(cap_title);
4595 /* update airpcap interface list */
4597 /* load the airpcap interfaces */
4598 airpcap_if_list = get_airpcap_interface_list(&err, &err_str);
4600 /* If we don't get a list don't do any thing.
4601 * If the error is AIRPCAP_NOT_LOADED it avoids a unneccessay rescan of the packet list
4602 * ( see airpcap_loader.h for error codes).
4604 if (airpcap_if_list == NULL) {
4605 if (err == CANT_GET_AIRPCAP_INTERFACE_LIST) {
4606 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
4610 decryption_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
4611 /* XXXX update_decryption_mode_list() trigers a rescan, should only be done if the mode is changed */
4612 update_decryption_mode_list(decryption_cb);
4613 /* select the first as default (THIS SHOULD BE CHANGED) */
4614 airpcap_if_active = airpcap_get_default_if(airpcap_if_list);
4618 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4619 gtk_container_set_border_width(GTK_CONTAINER(main_vb), DLG_OUTER_MARGIN);
4620 gtk_container_add(GTK_CONTAINER(cap_open_w), main_vb);
4622 /* Capture-related options frame */
4623 capture_fr = frame_new("Capture");
4624 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
4626 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
4627 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), DLG_OUTER_MARGIN);
4628 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
4630 #if defined (HAVE_PCAP_REMOTE)
4631 if (remote_host_list == NULL) {
4632 remote_host_list = g_hash_table_new (g_str_hash, g_str_equal);
4636 swindow = gtk_scrolled_window_new (NULL, NULL);
4637 gtk_widget_set_size_request(swindow, 676, 180);
4638 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
4640 view = gtk_tree_view_new ();
4641 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (view), TRUE);
4642 g_signal_connect(view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)cap_open_w);
4644 toggle_renderer = gtk_cell_renderer_toggle_new();
4645 column = gtk_tree_view_column_new_with_attributes("Capture", GTK_CELL_RENDERER(toggle_renderer), "active", CAPTURE, NULL);
4646 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4647 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (toggle_callback), NULL);
4648 g_object_set (GTK_TREE_VIEW(view), "has-tooltip", TRUE, NULL);
4649 g_signal_connect (GTK_TREE_VIEW(view), "query-tooltip", G_CALLBACK (query_tooltip_tree_view_cb), NULL);
4651 renderer = gtk_cell_renderer_text_new();
4652 column = gtk_tree_view_column_new_with_attributes ("",
4653 GTK_CELL_RENDERER(renderer),
4654 "text", IFACE_HIDDEN_NAME,
4656 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4657 gtk_tree_view_column_set_visible(column, FALSE);
4659 renderer = gtk_cell_renderer_text_new ();
4660 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), -1, "Interface", renderer, "markup", INTERFACE, NULL);
4661 column = gtk_tree_view_get_column(GTK_TREE_VIEW (view), INTERFACE);
4662 gtk_tree_view_column_set_min_width(column, 200);
4663 gtk_tree_view_column_set_resizable(column, TRUE );
4664 gtk_tree_view_column_set_alignment(column, 0.5f);
4665 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(INTERFACE));
4666 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("INTERFACE"))
4667 gtk_tree_view_column_set_visible(column, TRUE);
4669 gtk_tree_view_column_set_visible(column, FALSE);
4670 g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
4672 renderer = gtk_cell_renderer_text_new();
4673 column = gtk_tree_view_column_new_with_attributes ("Link-layer header", renderer, "text", LINK, NULL);
4674 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4675 gtk_tree_view_column_set_clickable(column, TRUE);
4676 gtk_tree_view_column_set_reorderable(column, TRUE);
4677 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW (view),LINK), TRUE );
4678 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(LINK));
4679 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4680 G_CALLBACK(column_button_pressed_cb), column);
4681 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("LINK"))
4682 gtk_tree_view_column_set_visible(column, TRUE);
4684 gtk_tree_view_column_set_visible(column, FALSE);
4685 gtk_tree_view_column_set_alignment(column, 0.5f);
4687 renderer = gtk_cell_renderer_text_new();
4688 column = gtk_tree_view_column_new_with_attributes("Prom. Mode", renderer, "text", PMODE, NULL);
4689 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4690 g_object_set(renderer, "xalign", 0.5f, NULL);
4691 gtk_tree_view_column_set_clickable(column, TRUE);
4692 gtk_tree_view_column_set_reorderable(column, TRUE);
4693 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(PMODE));
4694 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4695 G_CALLBACK(column_button_pressed_cb), column);
4696 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("PMODE"))
4697 gtk_tree_view_column_set_visible(column, TRUE);
4699 gtk_tree_view_column_set_visible(column, FALSE);
4700 gtk_tree_view_column_set_alignment(column, 0.5f);
4702 renderer = gtk_cell_renderer_text_new();
4703 column = gtk_tree_view_column_new_with_attributes("Snaplen [B]", renderer, "text", SNAPLEN, NULL);
4704 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4705 gtk_tree_view_column_set_clickable(column, TRUE);
4706 gtk_tree_view_column_set_reorderable(column, TRUE);
4707 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(SNAPLEN));
4708 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4709 G_CALLBACK(column_button_pressed_cb), column);
4710 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("SNAPLEN"))
4711 gtk_tree_view_column_set_visible(column, TRUE);
4713 gtk_tree_view_column_set_visible(column, FALSE);
4714 g_object_set(renderer, "xalign", 0.5f, NULL);
4716 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
4717 renderer = gtk_cell_renderer_text_new();
4718 column = gtk_tree_view_column_new_with_attributes("Buffer [MB]", renderer, "text", BUFFER, NULL);
4719 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4720 gtk_tree_view_column_set_reorderable(column, TRUE);
4721 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(BUFFER));
4722 gtk_tree_view_column_set_clickable(column, TRUE);
4723 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4724 G_CALLBACK(column_button_pressed_cb), column);
4725 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("BUFFER"))
4726 gtk_tree_view_column_set_visible(column, TRUE);
4728 gtk_tree_view_column_set_visible(column, FALSE);
4729 g_object_set(renderer, "xalign", 0.5f, NULL);
4732 #if defined (HAVE_PCAP_CREATE)
4733 renderer = gtk_cell_renderer_text_new();
4734 column = gtk_tree_view_column_new_with_attributes ("Mon. Mode", renderer, "text", MONITOR, NULL);
4735 gtk_tree_view_column_set_cell_data_func(column, renderer, activate_monitor, NULL, FALSE);
4736 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4737 gtk_tree_view_column_set_reorderable(column, TRUE);
4738 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(MONITOR));
4739 gtk_tree_view_column_set_clickable(column, TRUE);
4740 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4741 G_CALLBACK(column_button_pressed_cb), column);
4742 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("MONITOR"))
4743 gtk_tree_view_column_set_visible(column, TRUE);
4745 gtk_tree_view_column_set_visible(column, FALSE);
4746 g_object_set(renderer, "xalign", 0.5f, NULL);
4749 renderer = gtk_cell_renderer_text_new();
4750 column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", FILTER, NULL);
4751 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4752 gtk_tree_view_column_set_alignment(column, 0.5f);
4753 create_and_fill_model(GTK_TREE_VIEW(view));
4754 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
4755 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
4756 gtk_tree_view_column_set_clickable(column, TRUE);
4757 gtk_tree_view_column_set_reorderable(column, TRUE);
4758 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(FILTER));
4759 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4760 G_CALLBACK(column_button_pressed_cb), column);
4761 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("FILTER"))
4762 gtk_tree_view_column_set_visible(column, TRUE);
4764 gtk_tree_view_column_set_visible(column, FALSE);
4765 gtk_container_add (GTK_CONTAINER (swindow), view);
4766 gtk_box_pack_start(GTK_BOX(capture_vb), swindow, TRUE, TRUE, 0);
4768 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY, view);
4770 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4771 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
4772 gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 0);
4773 all_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4774 gtk_container_set_border_width(GTK_CONTAINER(all_vb), 0);
4775 gtk_box_pack_start(GTK_BOX(main_hb), all_vb, TRUE, TRUE, 0);
4777 all_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4778 gtk_container_set_border_width(GTK_CONTAINER(all_hb), 0);
4779 gtk_box_pack_start(GTK_BOX(all_vb), all_hb, TRUE, TRUE, 0);
4781 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4782 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
4783 gtk_box_pack_start(GTK_BOX(all_hb), left_vb, TRUE, TRUE, 0);
4785 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4786 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
4787 gtk_box_pack_start(GTK_BOX(all_hb), right_vb, FALSE, FALSE, 3);
4789 all_cb = gtk_check_button_new_with_mnemonic( "Capture on all interfaces");
4790 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(all_cb), FALSE);
4791 g_signal_connect(all_cb, "toggled", G_CALLBACK(capture_all_cb), NULL);
4792 gtk_widget_set_tooltip_text(all_cb, "Activate the box to capture on all interfaces. "
4793 "Deactivate it to capture on none and set the interfaces individually.");
4794 gtk_box_pack_start(GTK_BOX(left_vb), all_cb, TRUE, TRUE, 0);
4796 gtk_widget_set_sensitive(GTK_WIDGET(all_cb), if_present);
4797 /* Promiscuous mode row */
4798 promisc_cb = gtk_check_button_new_with_mnemonic("Use _promiscuous mode on all interfaces");
4799 if (!global_capture_session.session_started) {
4800 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
4802 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), get_all_prom_mode());
4804 g_signal_connect(promisc_cb, "button-press-event", G_CALLBACK(promisc_mode_callback), NULL);
4806 gtk_widget_set_tooltip_text(promisc_cb,
4807 "Usually a network adapter will only capture the traffic sent to its own network address. "
4808 "If you want to capture all traffic that all network adapters can \"see\", select this option. "
4809 "If you want to set this option on a per-interface basis, do not select this option. "
4810 "Instead, select the individual checkboxes in the interface list's \"Prom. Mode\" column. "
4811 "See the FAQ for some more details of capturing packets from a switched network.");
4812 gtk_box_pack_start(GTK_BOX(left_vb), promisc_cb, TRUE, TRUE, DLG_LABEL_SPACING);
4814 iftype_cbx = gtk_button_new_with_label("Manage Interfaces");
4815 gtk_widget_set_tooltip_text(iftype_cbx, "Add a new interface or pipe to capture from or remove "
4816 "an interface from the list.");
4817 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFTYPE_CBX_KEY, iftype_cbx);
4819 gtk_box_pack_start(GTK_BOX(right_vb), iftype_cbx, FALSE, FALSE, 0);
4820 g_signal_connect(iftype_cbx, "clicked", G_CALLBACK(show_add_interfaces_dialog), cap_open_w);
4821 gtk_widget_show(iftype_cbx);
4823 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4824 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
4825 gtk_box_pack_start(GTK_BOX(main_vb), main_hb, FALSE, FALSE, 0);
4827 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4828 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
4829 gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
4831 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4832 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
4833 gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 0);
4836 all_filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4837 gtk_box_pack_start(GTK_BOX(all_vb), all_filter_hb, FALSE, FALSE, DLG_LABEL_SPACING);
4839 all_filter_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
4840 g_signal_connect(all_filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
4841 g_signal_connect(all_filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
4842 gtk_widget_set_tooltip_text(all_filter_bt,
4843 "Select a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
4844 "See \"Capture Filters\" in the online help for further information how to use it."
4846 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_bt, FALSE, FALSE, 0);
4848 /* Create the capture filter combo box*/
4849 all_filter_cm = gtk_combo_box_text_new_with_entry();
4850 g_object_set_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY, all_filter_cm);
4851 all_filter_te = gtk_bin_get_child(GTK_BIN(all_filter_cm));
4852 colorize_filter_te_as_empty(all_filter_te);
4853 g_signal_connect(all_filter_te, "changed", G_CALLBACK(capture_all_filter_check_syntax_cb), NULL);
4854 g_signal_connect(all_filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
4856 all_cfilter_list = recent_get_cfilter_list(NULL);
4857 for (cf_entry = all_cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
4858 new_cfilter = (const gchar *)cf_entry->data;
4859 /* If this is the default cfilter, don't put it in the list, as it'll
4861 if (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0) {
4862 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), new_cfilter);
4865 if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
4866 fprintf(stderr, "Adding the default filter \"%s\"???\n", global_capture_opts.default_options.cfilter);
4867 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), global_capture_opts.default_options.cfilter);
4868 gtk_combo_box_set_active(GTK_COMBO_BOX(all_filter_cm), 0);
4871 gtk_widget_set_tooltip_text(all_filter_cm,
4872 "Enter a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
4873 "See \"Capture Filters\" in the online help for further information how to use it. "
4874 "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
4876 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_cm, TRUE, TRUE, DLG_BUTTON_SPACING);
4878 /* let an eventually capture filters dialog know the text entry to fill in */
4879 g_object_set_data(G_OBJECT(all_filter_bt), E_FILT_TE_PTR_KEY, all_filter_te);
4881 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
4882 all_compile_bt = gtk_button_new_with_label("Compile selected BPFs");
4883 g_signal_connect(all_compile_bt, "clicked", G_CALLBACK(capture_all_filter_compile_cb), NULL);
4884 gtk_widget_set_tooltip_text(all_compile_bt,
4885 "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
4886 /* We can't compile without any supported link-types, so disable the button in that case */
4887 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_compile_bt, FALSE, FALSE, DLG_BUTTON_SPACING);
4888 if (global_capture_opts.num_selected > 0) {
4889 gtk_widget_set_sensitive(all_compile_bt, TRUE);
4891 gtk_widget_set_sensitive(all_compile_bt, FALSE);
4895 /* Capture file-related options frame */
4896 file_fr = frame_new("Capture Files");
4897 gtk_box_pack_start(GTK_BOX (left_vb), file_fr, TRUE, TRUE, 0);
4899 file_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
4900 gtk_container_set_border_width(GTK_CONTAINER(file_vb), DLG_OUTER_MARGIN);
4901 gtk_container_add(GTK_CONTAINER(file_fr), file_vb);
4904 file_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4905 gtk_box_pack_start(GTK_BOX(file_vb), file_hb, FALSE, FALSE, 0);
4907 file_lb = gtk_label_new("File:");
4908 gtk_box_pack_start(GTK_BOX(file_hb), file_lb, FALSE, FALSE, 3);
4910 file_te = gtk_entry_new();
4911 gtk_widget_set_tooltip_text(file_te,
4912 "Enter the file name to which captured data will be written. "
4913 "If you don't enter something here, a temporary file will be used."
4915 gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 3);
4917 file_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
4918 gtk_widget_set_tooltip_text(file_bt,
4919 "Select a file to which captured data will be written, "
4920 "instead of entering the file name directly. "
4922 gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 0);
4924 g_signal_connect(file_bt, "clicked", G_CALLBACK(capture_prep_file_cb), file_te);
4926 /* multiple files table */
4927 /* XXX We want multi_grid to shrink to its minimum size horizontally
4928 * and be left-aligned within file_fr. Using a horizontal GtkBox works
4929 * in Gtk2 but not Gtk3. The situation gets sillier below with limit_fr
4930 * and limit_grid because we have both horizontal and vertical GtkBoxes.
4932 multi_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4933 gtk_box_pack_start(GTK_BOX(file_vb), multi_hb, FALSE, FALSE, 0);
4934 multi_grid = ws_gtk_grid_new();
4935 ws_gtk_grid_set_row_spacing(GTK_GRID(multi_grid), DLG_LABEL_SPACING);
4936 ws_gtk_grid_set_column_spacing(GTK_GRID(multi_grid), DLG_UNRELATED_SPACING);
4937 gtk_box_pack_start(GTK_BOX(multi_hb), multi_grid, FALSE, FALSE, 0);
4940 /* multiple files row */
4941 multi_files_on_cb = gtk_check_button_new_with_mnemonic("Use _multiple files");
4942 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb),
4943 global_capture_opts.multi_files_on);
4944 g_signal_connect(multi_files_on_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity),
4946 gtk_widget_set_tooltip_text(multi_files_on_cb,
4947 "Instead of using a single capture file, multiple files will be created. "
4948 "The generated file names will contain an incrementing number and the start time of the capture.");
4949 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), multi_files_on_cb, 0, row, 1, 1,
4950 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4953 pcap_ng_cb = gtk_check_button_new_with_mnemonic("Use pcap-ng format");
4954 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), global_capture_opts.use_pcapng);
4955 gtk_widget_set_tooltip_text(pcap_ng_cb, "Capture packets in the next-generation capture file format. "
4956 "This is still experimental.");
4957 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), pcap_ng_cb, 2, row, 1, 1,
4958 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4961 /* Ring buffer filesize row */
4962 ring_filesize_cb = gtk_check_button_new_with_label("Next file every");
4963 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb),
4964 global_capture_opts.has_autostop_filesize || !global_capture_opts.has_file_duration);
4965 g_signal_connect(ring_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
4966 gtk_widget_set_tooltip_text(ring_filesize_cb,
4967 "If the selected file size is exceeded, capturing switches to the next file.\n"
4968 "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
4969 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cb, 0, row, 1, 1,
4970 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4972 ring_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
4973 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
4974 ring_filesize_sb = gtk_spin_button_new (ring_filesize_adj, 0, 0);
4975 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ring_filesize_sb), TRUE);
4976 gtk_widget_set_size_request(ring_filesize_sb, 80, -1);
4977 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_sb, 1, row, 1, 1,
4978 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4980 ring_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
4981 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cbx, 2, row, 1, 1,
4982 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4984 value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
4985 gtk_adjustment_set_value(ring_filesize_adj, (gdouble) value);
4989 /* Ring buffer duration row */
4990 file_duration_cb = gtk_check_button_new_with_label("Next file every");
4991 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_duration_cb),
4992 global_capture_opts.has_file_duration);
4993 g_signal_connect(file_duration_cb, "toggled",
4994 G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
4995 gtk_widget_set_tooltip_text(file_duration_cb,
4996 "If the selected duration is exceeded, capturing switches to the next file.\n"
4997 "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
4998 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_cb, 0, row, 1, 1,
4999 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5001 file_duration_adj = (GtkAdjustment *)gtk_adjustment_new(0.0,
5002 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5003 file_duration_sb = gtk_spin_button_new (file_duration_adj, 0, 0);
5004 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (file_duration_sb), TRUE);
5005 gtk_widget_set_size_request(file_duration_sb, 80, -1);
5006 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_sb, 1, row, 1, 1,
5007 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5009 file_duration_cbx = time_unit_combo_box_new(global_capture_opts.file_duration);
5010 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_cbx, 2, row, 1, 1,
5011 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5013 value = time_unit_combo_box_convert_value(global_capture_opts.file_duration);
5014 gtk_adjustment_set_value(file_duration_adj, (gdouble) value);
5017 /* Ring buffer files row */
5018 ringbuffer_nbf_cb = gtk_check_button_new_with_label("Ring buffer with");
5019 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb),
5020 global_capture_opts.has_ring_num_files);
5021 g_signal_connect(ringbuffer_nbf_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5022 gtk_widget_set_tooltip_text(ringbuffer_nbf_cb,
5023 "After capturing has switched to the next file and the given number of files has exceeded, "
5024 "the oldest file will be removed."
5026 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_cb, 0, row, 1, 1,
5027 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5029 ringbuffer_nbf_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.ring_num_files,
5030 2/*RINGBUFFER_MIN_NUM_FILES*/, RINGBUFFER_MAX_NUM_FILES, 1.0, 10.0, 0.0);
5031 ringbuffer_nbf_sb = gtk_spin_button_new (ringbuffer_nbf_adj, 0, 0);
5032 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ringbuffer_nbf_sb), TRUE);
5033 gtk_widget_set_size_request(ringbuffer_nbf_sb, 80, -1);
5034 g_signal_connect(ringbuffer_nbf_sb, "changed", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5035 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_sb, 1, row, 1, 1,
5036 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5038 ringbuffer_nbf_lb = gtk_label_new("files");
5039 gtk_misc_set_alignment(GTK_MISC(ringbuffer_nbf_lb), 0, 0.5f);
5040 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_lb, 2, row, 1, 1,
5041 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5046 stop_files_cb = gtk_check_button_new_with_label("Stop capture after");
5047 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_files_cb),
5048 global_capture_opts.has_autostop_files);
5049 g_signal_connect(stop_files_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5050 gtk_widget_set_tooltip_text(stop_files_cb, "Stop capturing after the given number of \"file switches\" have been done.");
5051 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), stop_files_cb, 0, row, 1, 1,
5052 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5054 stop_files_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_files,
5055 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5056 stop_files_sb = gtk_spin_button_new (stop_files_adj, 0, 0);
5057 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_files_sb), TRUE);
5058 gtk_widget_set_size_request(stop_files_sb, 80, -1);
5059 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), stop_files_sb, 1, row, 1, 1,
5060 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5062 stop_files_lb = gtk_label_new("file(s)");
5063 gtk_misc_set_alignment(GTK_MISC(stop_files_lb), 0, 0.5f);
5064 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), stop_files_lb, 2, row, 1, 1,
5065 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5069 /* Capture limits frame */
5070 limit_fr = frame_new("Stop Capture Automatically After...");
5071 gtk_box_pack_start(GTK_BOX (left_vb), limit_fr, TRUE, TRUE, 0);
5073 limit_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5074 gtk_container_set_border_width(GTK_CONTAINER(limit_vb), DLG_OUTER_MARGIN);
5075 gtk_container_add(GTK_CONTAINER(limit_fr), limit_vb);
5078 limit_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
5079 gtk_box_pack_start(GTK_BOX(limit_vb), limit_hb, FALSE, FALSE, 0);
5080 limit_grid = ws_gtk_grid_new();
5081 ws_gtk_grid_set_row_spacing(GTK_GRID(limit_grid), DLG_LABEL_SPACING);
5082 ws_gtk_grid_set_column_spacing(GTK_GRID(limit_grid), DLG_UNRELATED_SPACING);
5083 gtk_box_pack_start(GTK_BOX(limit_hb), limit_grid, FALSE, FALSE, 0);
5086 /* Packet count row */
5087 stop_packets_cb = gtk_check_button_new();
5088 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_packets_cb),
5089 global_capture_opts.has_autostop_packets);
5090 g_signal_connect(stop_packets_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5091 gtk_widget_set_tooltip_text(stop_packets_cb, "Stop capturing after the specified number of packets have been captured.");
5092 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_cb, 0, row, 1, 1,
5093 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5095 stop_packets_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_packets,
5096 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5097 stop_packets_sb = gtk_spin_button_new (stop_packets_adj, 0, 0);
5098 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_packets_sb), TRUE);
5099 gtk_widget_set_size_request(stop_packets_sb, 80, -1);
5100 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_sb, 1, row, 1, 1,
5101 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5103 stop_packets_lb = gtk_label_new("packet(s)");
5104 gtk_misc_set_alignment(GTK_MISC(stop_packets_lb), 0, 0.5f);
5105 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_lb, 2, row, 1, 1,
5106 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5111 stop_filesize_cb = gtk_check_button_new();
5112 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_filesize_cb),
5113 global_capture_opts.has_autostop_filesize);
5114 g_signal_connect(stop_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5115 gtk_widget_set_tooltip_text(stop_filesize_cb, "Stop capturing after the specified amount of data has been captured.");
5116 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cb, 0, row, 1, 1,
5117 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5119 stop_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
5120 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5121 stop_filesize_sb = gtk_spin_button_new (stop_filesize_adj, 0, 0);
5122 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_filesize_sb), TRUE);
5123 gtk_widget_set_size_request(stop_filesize_sb, 80, -1);
5124 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_sb, 1, row, 1, 1,
5125 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5127 stop_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
5128 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cbx, 2, row, 1, 1,
5129 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5131 value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
5132 gtk_adjustment_set_value(stop_filesize_adj, (gdouble) value);
5137 stop_duration_cb = gtk_check_button_new();
5138 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_duration_cb),
5139 global_capture_opts.has_autostop_duration);
5140 g_signal_connect(stop_duration_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5141 gtk_widget_set_tooltip_text(stop_duration_cb, "Stop capturing after the specified amount of time has passed.");
5142 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cb, 0, row, 1, 1,
5143 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5145 stop_duration_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
5146 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5147 stop_duration_sb = gtk_spin_button_new (stop_duration_adj, 0, 0);
5148 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_duration_sb), TRUE);
5149 gtk_widget_set_size_request(stop_duration_sb, 80, -1);
5150 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_sb, 1, row, 1, 1,
5151 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5153 stop_duration_cbx = time_unit_combo_box_new(global_capture_opts.autostop_duration);
5154 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cbx, 2, row, 1, 1,
5155 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5157 value = time_unit_combo_box_convert_value(global_capture_opts.autostop_duration);
5158 gtk_adjustment_set_value(stop_duration_adj, (gdouble) value);
5161 /* Display-related options frame */
5162 display_fr = frame_new("Display Options");
5163 gtk_box_pack_start(GTK_BOX (right_vb), display_fr, TRUE, TRUE, 0);
5165 display_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5166 gtk_container_set_border_width(GTK_CONTAINER(display_vb), DLG_OUTER_MARGIN);
5167 gtk_container_add(GTK_CONTAINER(display_fr), display_vb);
5169 /* "Update display in real time" row */
5170 sync_cb = gtk_check_button_new_with_mnemonic(
5171 "_Update list of packets in real time");
5172 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sync_cb),
5173 global_capture_opts.real_time_mode);
5174 g_signal_connect(sync_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5175 gtk_widget_set_tooltip_text(sync_cb,
5176 "Using this option will show the captured packets immediately on the main screen. "
5177 "Please note: this will slow down capturing, so increased packet drops might appear.");
5178 gtk_box_pack_start(GTK_BOX (display_vb), sync_cb, TRUE, TRUE, 0);
5180 /* "Auto-scroll live update" row */
5181 auto_scroll_cb = gtk_check_button_new_with_mnemonic("_Automatically scroll during live capture");
5182 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_scroll_cb), auto_scroll_live);
5183 gtk_widget_set_tooltip_text(auto_scroll_cb,
5184 "This will scroll the \"Packet List\" automatically to the latest captured packet, "
5185 "when the \"Update List of packets in real time\" option is used.");
5186 gtk_box_pack_start(GTK_BOX (display_vb), auto_scroll_cb, TRUE, TRUE, 0);
5188 /* "Hide capture info" row */
5189 hide_info_cb = gtk_check_button_new_with_mnemonic("_Hide capture info dialog");
5190 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hide_info_cb), !global_capture_opts.show_info);
5191 gtk_widget_set_tooltip_text(hide_info_cb, "Hide the capture info dialog while capturing.");
5192 gtk_box_pack_start(GTK_BOX (display_vb), hide_info_cb, TRUE, TRUE, 0);
5194 /* Name Resolution frame */
5195 resolv_fr = frame_new("Name Resolution");
5196 gtk_box_pack_start(GTK_BOX (right_vb), resolv_fr, TRUE, TRUE, 0);
5198 resolv_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5199 gtk_container_set_border_width(GTK_CONTAINER(resolv_vb), DLG_OUTER_MARGIN);
5200 gtk_container_add(GTK_CONTAINER(resolv_fr), resolv_vb);
5202 m_resolv_cb = gtk_check_button_new_with_mnemonic(
5203 "Resolve _MAC addresses");
5204 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_resolv_cb),
5205 gbl_resolv_flags.mac_name);
5206 gtk_widget_set_tooltip_text(m_resolv_cb, "Perform MAC layer name resolution while capturing.");
5207 gtk_box_pack_start(GTK_BOX (resolv_vb), m_resolv_cb, TRUE, TRUE, 0);
5209 n_resolv_cb = gtk_check_button_new_with_mnemonic(
5210 "Resolve _network-layer names");
5211 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(n_resolv_cb),
5212 gbl_resolv_flags.network_name);
5213 gtk_widget_set_tooltip_text(n_resolv_cb, "Perform network layer name resolution while capturing.");
5214 gtk_box_pack_start(GTK_BOX (resolv_vb), n_resolv_cb, TRUE, TRUE, 0);
5216 t_resolv_cb = gtk_check_button_new_with_mnemonic(
5217 "Resolve _transport-layer name");
5218 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(t_resolv_cb),
5219 gbl_resolv_flags.transport_name);
5220 gtk_widget_set_tooltip_text(t_resolv_cb,
5221 "Perform transport layer name resolution while capturing.");
5222 gtk_box_pack_start(GTK_BOX (resolv_vb), t_resolv_cb, TRUE, TRUE, 0);
5224 e_resolv_cb = gtk_check_button_new_with_mnemonic(
5225 "Use _external network name resolver");
5226 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e_resolv_cb),
5227 gbl_resolv_flags.use_external_net_name_resolver);
5228 gtk_widget_set_tooltip_text(e_resolv_cb,
5229 "Use the (system's) configured name resolver (e.g., DNS) to resolve network names.");
5230 gtk_box_pack_start(GTK_BOX (resolv_vb), e_resolv_cb, TRUE, TRUE, 0);
5232 /* Button row: "Start", "Cancel" and "Help" buttons */
5233 bbox = dlg_button_row_new(WIRESHARK_STOCK_CAPTURE_START, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
5234 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
5236 ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_START);
5237 g_signal_connect(ok_bt, "clicked", G_CALLBACK(capture_start_cb), NULL);
5238 gtk_widget_set_tooltip_text(ok_bt, "Start the capture process.");
5239 if (global_capture_opts.num_selected > 0) {
5240 gtk_widget_set_sensitive(ok_bt, TRUE);
5242 gtk_widget_set_sensitive(ok_bt, FALSE);
5245 close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
5246 gtk_widget_set_tooltip_text(close_bt,
5248 window_set_cancel_button(cap_open_w, close_bt, window_cancel_button_cb);
5250 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
5251 gtk_widget_set_tooltip_text(help_bt,
5252 "Show help about capturing.");
5253 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), GUINT_TO_POINTER(HELP_CAPTURE_OPTIONS_DIALOG));
5254 gtk_widget_grab_default(ok_bt);
5256 /* Attach pointers to needed widgets to the capture prefs window/object */
5257 #if defined(HAVE_PCAP_REMOTE)
5258 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_REMOTE_DIALOG_PTR_KEY, NULL);
5260 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL, all_cb);
5261 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL, promisc_cb);
5262 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY, pcap_ng_cb);
5263 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_TE_KEY, file_te);
5264 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_MULTI_FILES_ON_CB_KEY, multi_files_on_cb);
5265 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_CB_KEY, ringbuffer_nbf_cb);
5266 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb);
5267 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb);
5268 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CB_KEY, ring_filesize_cb);
5269 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_SB_KEY, ring_filesize_sb);
5270 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CBX_KEY, ring_filesize_cbx);
5271 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_CB_KEY, file_duration_cb);
5272 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_SB_KEY, file_duration_sb);
5273 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_CBX_KEY, file_duration_cbx);
5274 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb);
5275 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb);
5276 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_HIDE_INFO_KEY, hide_info_cb);
5277 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_CB_KEY, stop_packets_cb);
5278 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_SB_KEY, stop_packets_sb);
5279 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_LB_KEY, stop_packets_lb);
5280 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CB_KEY, stop_filesize_cb);
5281 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_SB_KEY, stop_filesize_sb);
5282 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CBX_KEY, stop_filesize_cbx);
5283 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CB_KEY, stop_duration_cb);
5284 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_SB_KEY, stop_duration_sb);
5285 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CBX_KEY, stop_duration_cbx);
5286 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_CB_KEY, stop_files_cb);
5287 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_SB_KEY, stop_files_sb);
5288 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_LB_KEY, stop_files_lb);
5289 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb);
5290 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb);
5291 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb);
5292 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_E_RESOLVE_KEY, e_resolv_cb);
5294 /* Set the sensitivity of various widgets as per the settings of other
5296 capture_prep_adjust_sensitivity(NULL, cap_open_w);
5298 update_properties_all();
5299 update_visible_columns_menu ();
5301 /* Catch the "activate" signal on the text
5302 entries, so that if the user types Return there, we act as if the
5303 "OK" button had been selected, as happens if Return is typed if some
5304 widget that *doesn't* handle the Return key has the input focus. */
5305 /*dlg_set_activate(gtk_bin_get_child(GTK_BIN(if_cb)), ok_bt);*/
5306 dlg_set_activate(file_te, ok_bt);
5307 dlg_set_activate(all_filter_te, ok_bt);
5308 gtk_widget_grab_focus(all_filter_te);
5310 g_signal_connect(cap_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
5311 g_signal_connect(cap_open_w, "destroy", G_CALLBACK(capture_prep_destroy_cb), NULL);
5313 window_get_geometry(top_level, &tl_geom);
5314 gtk_window_set_default_size(GTK_WINDOW(cap_open_w), tl_geom.width * 8 / 10, -1);
5316 gtk_widget_show_all(cap_open_w);
5317 window_present(cap_open_w);
5319 cap_open_complete = TRUE; /* "Capture:Start" is now OK */
5320 global_capture_session.session_started = TRUE;
5323 /* user pressed the "Start" button (in dialog or toolbar) */
5325 capture_start_cb(GtkWidget *w _U_, gpointer d _U_)
5327 interface_options interface_opts;
5332 airpcap_if_active = airpcap_if_selected;
5333 if (airpcap_if_active)
5334 airpcap_set_toolbar_start_capture(airpcap_if_active);
5337 /* XXX - will closing this remove a temporary file? */
5338 if(!do_file_close(&cfile, FALSE, " before starting a new capture")){
5343 * There's an options dialog; get the values from it and close it.
5347 /* Determine if "capture start" while building of the "capture options" window */
5348 /* is in progress. If so, ignore the "capture start. */
5349 /* XXX: Would it be better/cleaner for the "capture options" window code to */
5350 /* disable the capture start button temporarily ? */
5351 if (cap_open_complete == FALSE) {
5352 return; /* Building options window: ignore "capture start" */
5354 success = capture_dlg_prep(cap_open_w);
5356 window_destroy(GTK_WIDGET(cap_open_w));
5358 return; /* error in options dialog */
5360 if (global_capture_opts.num_selected == 0) {
5361 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5362 "You didn't specify an interface on which to capture packets.");
5366 /* everything's prepared, now it's really time to start the capture */
5368 /* XXX - we might need to init other pref data as well... */
5369 main_auto_scroll_live_changed(auto_scroll_live);
5371 /* XXX - can this ever happen? */
5372 if (global_capture_session.state != CAPTURE_STOPPED)
5375 /* close the currently loaded capture file */
5376 cf_close((capture_file *)global_capture_session.cf);
5378 /* Copy the selected interfaces to the set of interfaces to use for
5380 collect_ifaces(&global_capture_opts);
5382 if (capture_start(&global_capture_opts, &global_capture_session, main_window_update)) {
5383 /* The capture succeeded, which means the capture filters specified are
5384 valid; add them to the recent capture filter lists for the interfaces.
5386 If the same capture filter is used for all the selected interfaces,
5387 add it to the global recent capture filter list as well. */
5389 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
5390 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
5391 if (interface_opts.cfilter) {
5392 recent_add_cfilter(interface_opts.name, interface_opts.cfilter);
5393 if (filter_str == NULL) {
5394 /* First selected interface - save its capture filter. */
5395 filter_str = g_strdup(interface_opts.cfilter);
5397 /* Not the first selected interface; is its capture filter
5398 the same as the one the other interfaces we've looked
5400 if (strcmp(interface_opts.cfilter, filter_str) != 0) {
5401 /* No, so not all selected interfaces have the same capture
5403 if (filter_str != NULL) {
5411 if (filter_str != NULL) {
5412 if (filter_str[0] != '\0') {
5413 recent_add_cfilter(NULL, filter_str);
5421 /* user change linktype selection;, convert to internal DLT value */
5423 select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_)
5429 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
5430 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
5431 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
5432 g_assert_not_reached(); /* Programming error: somehow nothing is active */
5434 if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
5435 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
5437 device.active_dlt = dlt;
5438 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
5439 capture_filter_check_syntax_cb(linktype_combo_box, data);
5442 /* user pressed "File" button */
5444 capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te)
5446 file_selection_browse(file_bt, file_te, "Wireshark: Specify a Capture File", FILE_SELECTION_WRITE_BROWSE);
5449 /* user pressed "Pipe" button */
5451 capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te)
5453 file_selection_browse(pipe_bt, pipe_te, "Wireshark: Specify a Pipe", FILE_SELECTION_WRITE_BROWSE);
5457 /* convert dialog settings into capture_opts values */
5459 capture_dlg_prep(gpointer parent_w) {
5460 GtkWidget *pcap_ng_cb,
5461 *file_te, *multi_files_on_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_cb,
5462 *sync_cb, *auto_scroll_cb, *hide_info_cb,
5463 *stop_packets_cb, *stop_packets_sb,
5464 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
5465 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
5466 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
5467 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
5468 *stop_files_cb, *stop_files_sb,
5469 *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb;
5470 const gchar *g_save_file;
5475 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_PCAP_NG_KEY);
5476 file_te = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_TE_KEY);
5477 multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
5478 ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
5479 ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
5480 ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
5481 ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
5482 ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
5483 file_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CB_KEY);
5484 file_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_SB_KEY);
5485 file_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CBX_KEY);
5486 sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
5487 auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
5488 hide_info_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_HIDE_INFO_KEY);
5489 stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
5490 stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
5491 stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
5492 stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
5493 stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
5494 stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
5495 stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
5496 stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
5497 stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
5498 stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
5499 m_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY);
5500 n_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY);
5501 t_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY);
5502 e_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_E_RESOLVE_KEY);
5504 if (global_capture_opts.num_selected == 0) {
5505 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5506 "You didn't specify an interface on which to capture packets.");
5509 global_capture_opts.use_pcapng =
5510 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pcap_ng_cb));
5511 /* Wireshark always saves to a capture file. */
5512 global_capture_opts.saving_to_file = TRUE;
5513 g_save_file = gtk_entry_get_text(GTK_ENTRY(file_te));
5514 if (g_save_file && g_save_file[0]) {
5515 /* User specified a file to which the capture should be written. */
5516 global_capture_opts.save_file = g_strdup(g_save_file);
5517 /* Save the directory name for future file dialogs. */
5518 cf_name = g_strdup(g_save_file);
5519 dirname = get_dirname(cf_name); /* Overwrites cf_name */
5520 set_last_open_dir(dirname);
5523 /* User didn't specify a file; save to a temporary file. */
5524 global_capture_opts.save_file = NULL;
5527 global_capture_opts.has_autostop_packets =
5528 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb));
5529 if (global_capture_opts.has_autostop_packets)
5530 global_capture_opts.autostop_packets =
5531 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_packets_sb));
5533 global_capture_opts.has_autostop_duration =
5534 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb));
5535 if (global_capture_opts.has_autostop_duration) {
5536 global_capture_opts.autostop_duration =
5537 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_duration_sb));
5538 global_capture_opts.autostop_duration =
5539 time_unit_combo_box_get_value(stop_duration_cbx, global_capture_opts.autostop_duration);
5542 global_capture_opts.real_time_mode =
5543 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb));
5546 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb));
5548 global_capture_opts.show_info =
5549 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hide_info_cb));
5551 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_resolv_cb)))
5552 gbl_resolv_flags.mac_name = TRUE;
5554 gbl_resolv_flags.mac_name = FALSE;
5555 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(n_resolv_cb)))
5556 gbl_resolv_flags.network_name = TRUE;
5558 gbl_resolv_flags.network_name = FALSE;
5559 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t_resolv_cb)))
5560 gbl_resolv_flags.transport_name = TRUE;
5562 gbl_resolv_flags.transport_name = FALSE;
5563 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(e_resolv_cb)))
5564 gbl_resolv_flags.use_external_net_name_resolver = TRUE;
5566 gbl_resolv_flags.use_external_net_name_resolver = FALSE;
5568 global_capture_opts.has_ring_num_files =
5569 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb));
5571 global_capture_opts.ring_num_files =
5572 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ringbuffer_nbf_sb));
5573 if (global_capture_opts.ring_num_files > RINGBUFFER_MAX_NUM_FILES)
5574 global_capture_opts.ring_num_files = RINGBUFFER_MAX_NUM_FILES;
5575 #if RINGBUFFER_MIN_NUM_FILES > 0
5576 else if (global_capture_opts.ring_num_files < RINGBUFFER_MIN_NUM_FILES)
5577 global_capture_opts.ring_num_files = RINGBUFFER_MIN_NUM_FILES;
5580 global_capture_opts.multi_files_on =
5581 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb));
5583 global_capture_opts.has_file_duration =
5584 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb));
5585 if (global_capture_opts.has_file_duration) {
5586 global_capture_opts.file_duration =
5587 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(file_duration_sb));
5588 global_capture_opts.file_duration =
5589 time_unit_combo_box_get_value(file_duration_cbx, global_capture_opts.file_duration);
5592 global_capture_opts.has_autostop_files =
5593 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb));
5594 if (global_capture_opts.has_autostop_files)
5595 global_capture_opts.autostop_files =
5596 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_files_sb));
5598 if (global_capture_opts.multi_files_on) {
5599 global_capture_opts.has_autostop_filesize =
5600 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb));
5601 if (global_capture_opts.has_autostop_filesize) {
5602 tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ring_filesize_sb));
5603 tmp = size_unit_combo_box_convert_value(ring_filesize_cbx, tmp);
5605 global_capture_opts.autostop_filesize = tmp;
5607 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5608 "%sMultiple files: Requested filesize too large!%s\n\n"
5609 "The setting \"Next file every x byte(s)\" can't be greater than %u bytes (2GiB).",
5610 simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
5615 /* test if the settings are ok for a ringbuffer */
5616 if (global_capture_opts.save_file == NULL) {
5617 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5618 "%sMultiple files: No capture file name given!%s\n\n"
5619 "You must specify a filename if you want to use multiple files.",
5620 simple_dialog_primary_start(), simple_dialog_primary_end());
5622 } else if (!global_capture_opts.has_autostop_filesize && !global_capture_opts.has_file_duration) {
5623 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5624 "%sMultiple files: No file limit given!%s\n\n"
5625 "You must specify a file size or duration at which is switched to the next capture file\n"
5626 "if you want to use multiple files.",
5627 simple_dialog_primary_start(), simple_dialog_primary_end());
5628 g_free(global_capture_opts.save_file);
5629 global_capture_opts.save_file = NULL;
5633 global_capture_opts.has_autostop_filesize =
5634 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb));
5635 if (global_capture_opts.has_autostop_filesize) {
5636 tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_filesize_sb));
5637 tmp = size_unit_combo_box_convert_value(stop_filesize_cbx, tmp);
5639 global_capture_opts.autostop_filesize = tmp;
5641 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5642 "%sStop Capture: Requested filesize too large!%s\n\n"
5643 "The setting \"after x byte(s)\" can't be greater than %u bytes (2GiB).",
5644 simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
5648 } /* multi_files_on */
5652 static GtkTreeModel *
5653 create_and_fill_model(GtkTreeView *view)
5655 GtkListStore *store;
5658 char *temp, *snaplen_string, *linkname;
5660 link_row *linkr = NULL;
5662 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
5666 gboolean hassnap, pmode;
5668 #if defined(HAVE_PCAP_CREATE)
5669 store = gtk_list_store_new (9, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
5670 #elif defined(_WIN32) && !defined (HAVE_PCAP_CREATE)
5671 store = gtk_list_store_new (8, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
5673 store = gtk_list_store_new (7, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
5676 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
5677 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
5678 if (!device.hidden) {
5679 if (device.no_addresses == 0) {
5680 temp = g_strdup_printf("<b>%s</b>", device.display_name);
5682 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
5685 if(capture_dev_user_linktype_find(device.name) != -1) {
5686 device.active_dlt = capture_dev_user_linktype_find(device.name);
5688 for (list = device.links; list != NULL; list = g_list_next(list)) {
5689 linkr = (link_row*)(list->data);
5690 if (linkr->dlt == device.active_dlt) {
5691 linkname = g_strdup(linkr->name);
5696 linkname = g_strdup("unknown");
5697 pmode = capture_dev_user_pmode_find(device.name);
5699 device.pmode = pmode;
5701 hassnap = capture_dev_user_hassnap_find(device.name);
5702 snaplen = capture_dev_user_snaplen_find(device.name);
5703 if(snaplen != -1 && hassnap != -1) {
5704 /* Default snap lenght set in preferences */
5705 device.snaplen = snaplen;
5706 device.has_snaplen = hassnap;
5708 /* No preferences set yet, use default values */
5709 device.snaplen = WTAP_MAX_PACKET_SIZE;
5710 device.has_snaplen = FALSE;
5713 if (device.has_snaplen) {
5714 snaplen_string = g_strdup_printf("%d", device.snaplen);
5716 snaplen_string = g_strdup("default");
5719 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
5720 if (capture_dev_user_buffersize_find(device.name) != -1) {
5721 buffer = capture_dev_user_buffersize_find(device.name);
5722 device.buffer = buffer;
5724 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
5727 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
5728 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
5729 gtk_list_store_append (store, &iter);
5730 #if defined(HAVE_PCAP_CREATE)
5731 gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
5732 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
5733 gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
5735 gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
5740 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
5741 return GTK_TREE_MODEL(store);
5745 query_tooltip_tree_view_cb (GtkWidget *widget,
5748 gboolean keyboard_tip,
5749 GtkTooltip *tooltip,
5753 GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
5754 GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
5755 GtkTreePath *path = NULL;
5757 GtkTreeViewColumn *column;
5758 GtkCellRenderer* renderer = NULL;
5759 GList *renderer_list;
5764 if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
5767 gtk_tree_model_get (model, &iter, 0, &tmp, -1);
5769 if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), (gint) x, (gint) y, NULL, &column, NULL, NULL)) {
5770 idx = col_title_to_index((const gchar *)gtk_tree_view_column_get_title(column));
5774 case CAPTURE: g_snprintf (buffer, sizeof(buffer), "Choose which interface (network adapter) will be used to capture packets from. "
5775 "Be sure to select the correct one, as it's a common mistake to select the wrong interface.");
5777 case INTERFACE: g_snprintf (buffer, sizeof(buffer), "Lists the interface name and the IP address(es) assigned to it. ");
5779 case LINK: g_snprintf (buffer, sizeof(buffer), "Link-layer type the interface supports.");
5781 case PMODE: g_snprintf (buffer, sizeof(buffer), "Usually a network adapter will only capture the traffic sent to its own network address. "
5782 "If you want to capture all traffic that the network adapter can \"see\", promiscuous mode should be configured.");
5784 case SNAPLEN: g_snprintf(buffer, sizeof(buffer), "Limit the maximum number of bytes to be captured from each packet. This size includes the "
5785 "link-layer header and all subsequent headers.");
5787 #if defined(HAVE_PCAP_CREATE)
5788 case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
5789 "If you notice packet drops, you can try increasing this size.");
5791 case MONITOR: g_snprintf (buffer, sizeof(buffer), "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture "
5792 "the traffic on the BSS to which it's associated. "
5793 "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", select this option. "
5794 "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
5795 "it might be necessary to turn this option on.\n\n"
5796 "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
5798 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
5799 case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
5800 "If you notice packet drops, you can try increasing this size.");
5803 case FILTER: g_snprintf(buffer, sizeof(buffer), "Selected capture filter to reduce the amount of packets to be captured.");
5805 default: g_snprintf(buffer, sizeof(buffer), "another option");
5808 gtk_tooltip_set_markup (tooltip, buffer);
5809 renderer_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
5810 /* get the first renderer */
5811 if (g_list_first(renderer_list)) {
5812 renderer = (GtkCellRenderer*)g_list_nth_data(renderer_list, 0);
5813 gtk_tree_view_set_tooltip_cell (tree_view, tooltip, path, column, renderer);
5816 gtk_tree_path_free (path);
5821 #if defined (HAVE_PCAP_CREATE)
5823 activate_monitor(GtkTreeViewColumn *tree_column _U_, GtkCellRenderer *renderer,
5824 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data _U_)
5827 GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
5828 int indx = atoi(gtk_tree_path_to_string(path));
5830 device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
5832 if (device.monitor_mode_supported == TRUE) {
5833 g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
5835 g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_INERT, NULL);
5840 /* user requested to destroy the dialog */
5842 capture_prep_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
5845 #ifdef HAVE_PCAP_REMOTE
5847 GtkWidget *remote_w;
5850 /* Is there a file selection dialog associated with this
5851 Capture Options dialog? */
5852 fs = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_FILE_SEL_DIALOG_PTR_KEY);
5854 #ifdef HAVE_PCAP_REMOTE
5855 if_list = (GList *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY);
5856 if (if_list && g_list_length(if_list)>0) {
5857 free_interface_list(if_list);
5862 /* Yes. Destroy it. */
5866 /* Note that we no longer have a "Capture Options" dialog box. */
5870 /* update airpcap toolbar */
5871 if (airpcap_if_active)
5872 airpcap_set_toolbar_stop_capture(airpcap_if_active);
5875 #ifdef HAVE_PCAP_REMOTE
5876 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
5877 if (remote_w != NULL)
5878 window_destroy(remote_w);
5883 #ifdef HAVE_PCAP_CREATE
5884 /* user changed the setting of the monitor-mode checkbox */
5886 capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp _U_)
5890 gboolean monitor_mode;
5891 if_capabilities_t *caps;
5892 gint linktype_count = 0, i;
5893 data_link_info_t *data_link_info;
5896 GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
5897 GtkWidget *linktype_lb = (GtkWidget *)g_object_get_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY);
5899 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
5900 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
5903 if_string = g_strdup(device.name);
5904 monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor));
5905 caps = capture_get_if_capabilities(if_string, monitor_mode, NULL, main_window_update);
5908 g_signal_handlers_disconnect_by_func(linktype_combo_box, G_CALLBACK(select_link_type_cb), NULL );
5909 ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box));
5910 for (i = (gint)g_list_length(device.links)-1; i >= 0; i--) {
5911 GList* rem = g_list_nth(device.links, i);
5912 device.links = g_list_remove_link(device.links, rem);
5915 device.active_dlt = -1;
5917 device.monitor_mode_supported = caps->can_set_rfmon;
5918 device.monitor_mode_enabled = monitor_mode;
5919 for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
5920 linkr = (link_row *)g_malloc(sizeof(link_row));
5921 data_link_info = (data_link_info_t *)lt_entry->data;
5922 if (data_link_info->description != NULL) {
5923 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
5924 data_link_info->description,
5925 GINT_TO_POINTER(data_link_info->dlt));
5926 linkr->dlt = data_link_info->dlt;
5927 if (linktype_count == 0) {
5928 device.active_dlt = data_link_info->dlt;
5930 linkr->name = g_strdup(data_link_info->description);
5933 /* Not supported - tell them about it but don't let them select it. */
5934 str = g_strdup_printf("%s (not supported)", data_link_info->name);
5935 ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
5938 GINT_TO_POINTER(-1), /* Flag as "not supported" */
5941 linkr->name = g_strdup(str);
5944 device.links = g_list_append(device.links, linkr);
5947 free_if_capabilities(caps);
5949 /* We don't know whether this supports monitor mode or not;
5950 don't ask for monitor mode. */
5951 device.monitor_mode_enabled = FALSE;
5952 device.monitor_mode_supported = FALSE;
5954 gtk_widget_set_sensitive(linktype_lb, linktype_count >= 2);
5955 gtk_widget_set_sensitive(linktype_combo_box, linktype_count >= 2);
5956 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),0);
5957 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
5962 * Adjust the sensitivity of various widgets as per the current setting
5966 capture_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
5968 GtkWidget *multi_files_on_cb, *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
5969 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
5970 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
5971 *sync_cb, *auto_scroll_cb,
5972 *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
5973 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
5974 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
5975 *stop_files_cb, *stop_files_sb, *stop_files_lb;
5977 multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
5978 ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
5979 ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
5980 ringbuffer_nbf_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_LB_KEY);
5981 ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
5982 ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
5983 ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
5984 file_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CB_KEY);
5985 file_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_SB_KEY);
5986 file_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CBX_KEY);
5987 sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
5988 auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
5989 stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
5990 stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
5991 stop_packets_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_LB_KEY);
5992 stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
5993 stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
5994 stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
5995 stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
5996 stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
5997 stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
5998 stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
5999 stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
6000 stop_files_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_LB_KEY);
6002 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb))) {
6003 /* "Update list of packets in real time" captures enabled; we don't
6004 support ring buffer mode for those captures, so turn ring buffer
6005 mode off if it's on, and make its toggle button, and the spin
6006 button for the number of ring buffer files (and the spin button's
6007 label), insensitive. */
6009 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb), FALSE);
6010 gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), FALSE);
6013 /* Auto-scroll mode is meaningful only in "Update list of packets
6014 in real time" captures, so make its toggle button sensitive. */
6015 gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), TRUE);
6017 /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), TRUE);*/
6019 /* "Update list of packets in real time" captures disabled; that
6020 means ring buffer mode is OK, so make its toggle button
6022 /* gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), TRUE);*/
6024 /* Auto-scroll mode is meaningful only in "Update list of packets
6025 in real time" captures, so make its toggle button insensitive. */
6026 gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), FALSE);
6028 /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), FALSE);*/
6031 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb))) {
6032 /* Ring buffer mode enabled. */
6034 /* Force at least one of the "file switch" conditions (we need at least one) */
6035 if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)) == FALSE) &&
6036 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)) == FALSE)) {
6037 if (tb == ring_filesize_cb)
6038 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_duration_cb), TRUE);
6040 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb), TRUE);
6043 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), TRUE);
6044 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb),
6045 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
6046 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb),
6047 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
6049 /* The ring filesize spinbox is sensitive if the "Next capture file
6050 after N kilobytes" checkbox is on. */
6051 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), TRUE);
6052 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),
6053 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
6054 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),
6055 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
6057 /* The ring duration spinbox is sensitive if the "Next capture file
6058 after N seconds" checkbox is on. */
6059 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cb), TRUE);
6060 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_sb),
6061 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)));
6062 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cbx),
6063 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)));
6065 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), FALSE);
6066 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb), FALSE);
6067 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx), FALSE);
6069 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), TRUE);
6070 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb),
6071 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
6072 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb),
6073 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
6075 /* Ring buffer mode disabled. */
6076 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), FALSE);
6077 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), FALSE);
6078 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), FALSE);
6080 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), FALSE);
6081 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),FALSE);
6082 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),FALSE);
6084 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cb), FALSE);
6085 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_sb),FALSE);
6086 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cbx),FALSE);
6088 /* The maximum file size spinbox is sensitive if the "Stop capture
6089 after N kilobytes" checkbox is on. */
6090 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), TRUE);
6091 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb),
6092 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
6093 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx),
6094 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
6096 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), FALSE);
6097 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb), FALSE);
6098 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb), FALSE);
6101 /* The maximum packet count spinbox is sensitive if the "Stop capture
6102 after N packets" checkbox is on. */
6103 gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_sb),
6104 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
6105 gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_lb),
6106 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
6108 /* The capture duration spinbox is sensitive if the "Stop capture
6109 after N seconds" checkbox is on. */
6110 gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_sb),
6111 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
6112 gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_cbx),
6113 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
6116 gboolean capture_dlg_window_present(void)
6118 return (cap_open_w?TRUE:FALSE);
6122 * Refresh everything visible that shows an interface list that
6123 * includes local interfaces.
6126 refresh_local_interface_lists(void)
6128 /* Reload the local interface list. */
6129 scan_local_interfaces(main_window_update);
6131 /* If there's an interfaces dialog up, refresh it. */
6132 if (interfaces_dialog_window_present())
6133 refresh_if_window();
6135 /* If there's a capture options dialog up, refresh it. */
6136 if (capture_dlg_window_present())
6137 capture_dlg_refresh_if();
6139 /* If the welcome screen is up, refresh its interface list. */
6140 if (get_welcome_window() != NULL)
6141 welcome_if_panel_reload();
6143 /* Refresh the 802.11 toolbar. */
6144 tb80211_refresh_interfaces();
6148 * Refresh everything visible that shows an interface list that
6149 * includes non-local interfaces.
6152 refresh_non_local_interface_lists(void)
6154 /* If there's a capture options dialog up, refresh it. */
6155 if (capture_dlg_window_present())
6156 capture_dlg_refresh_if();
6158 /* If the welcome screen is up, refresh its interface list. */
6159 if (get_welcome_window() != NULL)
6160 welcome_if_panel_reload();
6163 #endif /* HAVE_LIBPCAP */
6171 * indent-tabs-mode: nil
6174 * ex: set shiftwidth=2 tabstop=8 expandtab:
6175 * :indentSize=2:tabSize=8:noTabs=true: