2 * Routines for the "Capture Options" dialog and dialog windows popped
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
34 #include <epan/packet.h>
35 #include <epan/addr_resolv.h>
36 #include <epan/prefs.h>
37 #include <wsutil/filesystem.h>
39 #include "../capture.h"
40 #include <capchild/capture_ifinfo.h>
41 #include "../capture-pcap-util.h"
42 #include "../capture_ui_utils.h"
43 #include "../ringbuffer.h"
45 #include "ui/capture_globals.h"
46 #include "ui/iface_lists.h"
47 #include "ui/preference_utils.h"
48 #include "ui/recent.h"
49 #include "ui/recent_utils.h"
50 #include "ui/simple_dialog.h"
53 #include "ui/gtk/main.h"
54 #include "ui/gtk/gui_utils.h"
55 #include "ui/gtk/capture_dlg.h"
56 #include "ui/gtk/filter_dlg.h"
57 #include "ui/gtk/dlg_utils.h"
58 #include "ui/gtk/file_dlg.h"
59 #include "ui/gtk/stock_icons.h"
60 #include "ui/gtk/capture_file_dlg.h"
61 #include "ui/gtk/help_dlg.h"
62 #include "ui/gtk/gtkglobals.h"
63 #include "ui/gtk/cfilter_combo_utils.h"
64 #include "ui/gtk/capture_if_dlg.h"
65 #include "ui/gtk/main_welcome.h"
66 #include "ui/gtk/network_icons.h"
67 #include "ui/gtk/menus.h"
68 #include "ui/gtk/prefs_dlg.h"
69 #include "ui/gtk/main_80211_toolbar.h"
71 #include "ui/gtk/keys.h"
73 #include "ui/gtk/old-gtk-compat.h"
74 #include "ui/gtk/expert_indicators.h"
78 #include "airpcap_loader.h"
79 #include "airpcap_gui_utils.h"
80 #include "airpcap_dlg.h"
84 * Symbolic names for column indices.
94 #if defined(HAVE_PCAP_CREATE)
97 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
112 #define LOCAL_OFFSET 1
114 #define LOCAL_OFFSET 0
117 /* Capture callback data keys */
118 #define E_CAP_IFACE_KEY "cap_iface"
119 #define E_CAP_IFACE_IP_KEY "cap_iface_ip"
120 #define E_CAP_SNAP_CB_KEY "cap_snap_cb"
121 #define E_CAP_LT_CBX_KEY "cap_lt_cbx"
122 #define E_CAP_LT_CBX_LABEL_KEY "cap_lt_cbx_label"
123 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
124 #define E_CAP_BUFFER_SIZE_SB_KEY "cap_buffer_size_sb"
126 #define E_CAP_SNAP_SB_KEY "cap_snap_sb"
127 #define E_CAP_PROMISC_KEY "cap_promisc"
128 #define E_CAP_PROMISC_KEY_ALL "cap_promisc_all"
129 #define E_CAP_KEY_ALL "cap_all"
130 #ifdef HAVE_PCAP_CREATE
131 #define E_CAP_MONITOR_KEY "cap_monitor"
133 #define E_CAP_PCAP_NG_KEY "cap_pcap_ng"
134 #define E_CAP_FILT_KEY "cap_filter_te"
135 #define E_OPT_EDIT_DIALOG_PTR_KEY "cap_edit_opt_dialog"
136 #define E_OPT_EDIT_CALLER_PTR_KEY "cap_edit_opt_caller"
137 #define E_CAP_FILE_TE_KEY "cap_file_te"
138 #define E_CAP_MULTI_FILES_ON_CB_KEY "cap_multi_files_on_cb"
139 #define E_CAP_RING_FILESIZE_CB_KEY "cap_ring_filesize_cb"
140 #define E_CAP_RING_FILESIZE_SB_KEY "cap_ring_filesize_sb"
141 #define E_CAP_RING_FILESIZE_CBX_KEY "cap_ring_filesize_cbx"
142 #define E_CAP_FILE_DURATION_CB_KEY "cap_file_duration_cb"
143 #define E_CAP_FILE_DURATION_SB_KEY "cap_file_duration_sb"
144 #define E_CAP_FILE_DURATION_CBX_KEY "cap_file_duration_cbx"
145 #define E_CAP_RING_NBF_CB_KEY "cap_ring_nbf_cb"
146 #define E_CAP_RING_NBF_SB_KEY "cap_ring_nbf_sb"
147 #define E_CAP_RING_NBF_LB_KEY "cap_ring_nbf_lb"
148 #define E_CAP_STOP_FILES_CB_KEY "cap_stop_files_cb"
149 #define E_CAP_STOP_FILES_SB_KEY "cap_stop_files_sb"
150 #define E_CAP_STOP_FILES_LB_KEY "cap_stop_files_lb"
151 #define E_CAP_SYNC_KEY "cap_sync"
152 #define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll"
153 #define E_CAP_HIDE_INFO_KEY "cap_hide_info"
154 #define E_CAP_STOP_PACKETS_CB_KEY "cap_stop_packets_cb"
155 #define E_CAP_STOP_PACKETS_SB_KEY "cap_stop_packets_sb"
156 #define E_CAP_STOP_PACKETS_LB_KEY "cap_stop_packets_lb"
157 #define E_CAP_STOP_FILESIZE_CB_KEY "cap_stop_filesize_cb"
158 #define E_CAP_STOP_FILESIZE_SB_KEY "cap_stop_filesize_sb"
159 #define E_CAP_STOP_FILESIZE_CBX_KEY "cap_stop_filesize_cbx"
160 #define E_CAP_STOP_DURATION_CB_KEY "cap_stop_duration_cb"
161 #define E_CAP_STOP_DURATION_SB_KEY "cap_stop_duration_sb"
162 #define E_CAP_STOP_DURATION_CBX_KEY "cap_stop_duration_cbx"
163 #define E_CAP_M_RESOLVE_KEY "cap_m_resolve"
164 #define E_CAP_N_RESOLVE_KEY "cap_n_resolve"
165 #define E_CAP_T_RESOLVE_KEY "cap_t_resolve"
166 #define E_CAP_E_RESOLVE_KEY "cap_e_resolve"
168 #define E_CAP_IFTYPE_CBX_KEY "cap_iftype_cbx"
169 #ifdef HAVE_PCAP_REMOTE
170 #define E_CAP_IF_LIST_KEY "cap_if_list"
171 #define E_CAP_DATATX_UDP_CB_KEY "cap_datatx_udp_cb"
172 #define E_CAP_NOCAP_RPCAP_CB_KEY "cap_nocap_rpcap_cb"
173 #define E_CAP_REMOTE_DIALOG_PTR_KEY "cap_remote_dialog"
174 #define E_CAP_REMOTE_CALLER_PTR_KEY "cap_remote_caller"
175 #define E_REMOTE_HOST_TE_KEY "cap_remote_host"
176 #define E_REMOTE_PORT_TE_KEY "cap_remote_port"
177 #define E_REMOTE_AUTH_NULL_KEY "cap_remote_auth_null"
178 #define E_REMOTE_AUTH_PASSWD_KEY "cap_remote_auth_passwd"
179 #define E_REMOTE_USERNAME_LB_KEY "cap_remote_username_lb"
180 #define E_REMOTE_USERNAME_TE_KEY "cap_remote_username_te"
181 #define E_REMOTE_PASSWD_LB_KEY "cap_remote_passwd_lb"
182 #define E_REMOTE_PASSWD_TE_KEY "cap_remote_passwd_te"
183 #define E_REMOTE_OK_BT_KEY "cap_remote_ok_bt"
184 #define E_REMOTE_DEL_BT_KEY "cap_remote_delete_bt"
185 #define E_CAP_CBX_IFTYPE_NOUPDATE_KEY "cap_cbx_iftype_noupdate"
186 #define E_OPT_REMOTE_DIALOG_PTR_KEY "cap_remote_opt_dialog"
187 #define E_OPT_REMOTE_CALLER_PTR_KEY "cap_remote_opt_caller"
189 #ifdef HAVE_PCAP_SETSAMPLING
190 #define E_CAP_SAMP_NONE_RB_KEY "cap_samp_none_rb"
191 #define E_CAP_SAMP_COUNT_RB_KEY "cap_samp_count_rb"
192 #define E_CAP_SAMP_COUNT_SB_KEY "cap_samp_count_sb"
193 #define E_CAP_SAMP_TIMER_RB_KEY "cap_samp_timer_rb"
194 #define E_CAP_SAMP_TIMER_SB_KEY "cap_samp_timer_sb"
196 #define E_CAP_PIPE_TE_KEY "cap_pipe_te"
197 #define E_CAP_PIPE_L_KEY "cap_pipe_list"
198 #define E_CAP_PIPE_DEL_KEY "cap_pipe_delete_key"
199 #define E_CAP_LOCAL_L_KEY "cap_local_list"
200 #define E_CAP_REMOTE_L_KEY "cap_remote_list"
202 #define E_COMPILE_SW_SCROLLW_KEY "compileScrolledWindowInterfaces"
203 #define E_COMPILE_TREE_VIEW_INTERFACES "compileTreeViewInterfaces"
205 #define DUMMY_SNAPLENGTH 65535
206 #define DUMMY_NETMASK 0xFF000000
216 * Keep a static pointer to the current "Capture Options" window, if
217 * any, so that if somebody tries to do "Capture:Options" while there's
218 * already a "Capture Options" window up, we just pop up the existing
219 * one, rather than creating a new one.
220 * Also: Capture:Start obtains info from the "Capture Options" window
221 * if it exists and if its creation is complete.
223 static GtkWidget *cap_open_w = NULL, *opt_edit_w = NULL, *ok_bt, *interface_management_w = NULL;
224 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
225 static GtkWidget *compile_bpf_w = NULL;
227 static gboolean cap_open_complete; /* valid only if cap_open_w != NULL */
228 static const gchar *pipe_name = NULL;
229 static const gchar *selected_name;
230 static GtkWidget *columns_menu_object;
231 static GtkUIManager *ui_manager_columns = NULL;
232 static GSList *popup_menu_list = NULL;
233 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
234 static GHashTable *compile_results = NULL;
235 static GtkWidget *all_compile_bt;
238 static gint marked_interface;
239 static gint marked_row;
241 #ifdef HAVE_PCAP_REMOTE
242 static GHashTable *remote_host_list=NULL;
243 static remote_options global_remote_opts;
244 static guint num_selected = 0;
247 static gulong capture_all_handler_id;
248 static gulong promisc_all_handler_id;
251 capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te);
254 capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te);
257 select_link_type_cb(GtkWidget *w, gpointer data);
259 #ifdef HAVE_PCAP_REMOTE
261 capture_remote_cb(GtkWidget *w, gboolean focus_username);
264 select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data);
267 fill_remote_list(void);
271 capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w);
274 capture_prep_destroy_cb(GtkWidget *win, gpointer user_data);
276 #ifdef HAVE_PCAP_CREATE
278 capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp);
282 capture_dlg_prep(gpointer parent_w);
285 create_and_fill_model(GtkTreeView *view);
288 update_options_table(gint indx);
291 update_properties_all(void);
294 query_tooltip_tree_view_cb (GtkWidget *widget,
297 gboolean keyboard_tip,
302 gchar *col_index_to_name(gint indx)
308 case INTERFACE: col_name = g_strdup("INTERFACE");
310 case LINK: col_name = g_strdup("LINK");
312 case PMODE: col_name = g_strdup("PMODE");
314 case SNAPLEN: col_name = g_strdup("SNAPLEN");
316 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
317 case BUFFER: col_name = g_strdup("BUFFER");
320 #if defined (HAVE_PCAP_CREATE)
321 case MONITOR: col_name = g_strdup("MONITOR");
324 case FILTER: col_name = g_strdup("FILTER");
326 default: return NULL;
332 gint col_title_to_index(const gchar *name)
334 if (strcmp(name, "Capture") == 0) return CAPTURE;
335 if (strcmp(name, "Interface") == 0) return INTERFACE;
336 if (strcmp(name, "Link-layer header") == 0) return LINK;
337 if (strcmp(name, "Prom. Mode") == 0) return PMODE;
338 if (strcmp(name, "Snaplen [B]") == 0) return SNAPLEN;
339 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
340 if (strcmp(name, "Buffer [MiB]") == 0) return BUFFER;
342 #if defined (HAVE_PCAP_CREATE)
343 if (strcmp(name, "Mon. Mode") == 0) return MONITOR;
345 if (strcmp(name, "Capture Filter") == 0) return FILTER;
350 set_capture_column_visible(gchar *col, gboolean visible _U_)
355 if (visible && !prefs_capture_options_dialog_column_is_visible(col)) {
356 prefs.capture_columns = g_list_append(prefs.capture_columns, col);
357 } else if (!visible && prefs_capture_options_dialog_column_is_visible(col)) {
358 for (curr = g_list_first(prefs.capture_columns); curr; curr = g_list_next(curr)) {
359 col_name = (gchar *)curr->data;
360 if (col_name && (g_ascii_strcasecmp(col_name, col) == 0)) {
361 prefs.capture_columns = g_list_remove(prefs.capture_columns, curr->data);
369 toggle_visible_column_cb (GtkWidget *w _U_, gpointer data)
372 GtkTreeViewColumn *col;
376 col_id = GPOINTER_TO_INT(data);
377 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
378 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
379 col_name = col_index_to_name(col_id);
380 gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
381 set_capture_column_visible(col_name, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
386 set_all_columns_visible (void)
388 GtkTreeViewColumn *col;
393 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
394 for (col_id = 2; col_id < NUM_COLUMNS; col_id++) {
395 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
396 gtk_tree_view_column_set_visible(col, TRUE);
397 if ((name = col_index_to_name(col_id)) != NULL) {
398 set_capture_column_visible(name, TRUE);
402 if (!prefs.gui_use_pref_save) {
406 update_visible_columns_menu ();
410 columns_activate_all_columns_cb(GtkAction *action _U_, gpointer user_data _U_)
412 set_all_columns_visible ();
416 update_visible_tree_view_columns(void)
420 GtkTreeViewColumn *col;
422 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
423 gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(view), INTERFACE), TRUE);
424 for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
425 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
426 gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_index_to_name(col_id))?TRUE:FALSE);
432 update_visible_columns_menu (void)
434 GtkWidget *menu_columns, *menu_item;
439 menu_columns = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/DisplayedColumns");
442 fprintf (stderr, "Warning: couldn't find menu_columns path=/ColumnsPopup/DisplayedColumns");
445 sub_menu = gtk_menu_new();
446 gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_columns), sub_menu);
448 for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
449 title = col_index_to_name(col_id);
450 menu_item = gtk_check_menu_item_new_with_label(title);
451 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), prefs_capture_options_dialog_column_is_visible(title));
452 g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(toggle_visible_column_cb), GINT_TO_POINTER(col_id));
453 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
454 gtk_widget_show (menu_item);
456 menu_item = gtk_menu_item_new();
457 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
458 gtk_widget_show (menu_item);
460 menu_item = gtk_menu_item_new_with_label ("Display All");
461 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
462 g_signal_connect(menu_item, "activate", G_CALLBACK(columns_activate_all_columns_cb), NULL);
463 gtk_widget_show (menu_item);
467 columns_pref_cb(GtkAction *action _U_, gpointer user_data)
469 GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/ColumnPreferences");
470 prefs_page_cb( widget , user_data, PREFS_PAGE_CAPTURE);
474 columns_hide_col_cb(GtkAction *action _U_, gpointer user_data _U_)
477 GtkTreeViewColumn *col;
481 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
482 col = (GtkTreeViewColumn *)g_object_get_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY);
483 gtk_tree_view_column_set_visible(col, FALSE);
484 num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MCAPTURE_COLUMNS_COL_KEY));
485 if ((name = col_index_to_name(num)) != NULL) {
486 set_capture_column_visible(name, FALSE);
487 if (!prefs.gui_use_pref_save) {
490 update_visible_columns_menu ();
494 static const char *ui_desc_columns_menu_popup =
496 " <popup name='ColumnsPopup' action='PopupAction'>\n"
497 " <menuitem name='ColumnPreferences' action='/Column Preferences'/>\n"
498 " <menu name='DisplayedColumns' action='/Displayed Columns'>\n"
499 " <menuitem name='Display All' action='/Displayed Columns/Display All'/>\n"
501 " <menuitem name='HideColumn' action='/Hide Column'/>\n"
505 static const GtkActionEntry columns_menu_popup_action_entries[] = {
506 { "/Column Preferences", GTK_STOCK_PREFERENCES, "Column Preferences...", NULL, NULL, G_CALLBACK(columns_pref_cb) },
507 { "/Displayed Columns", NULL, "Displayed Columns", NULL, NULL, NULL },
508 { "/Displayed Columns/Display All", NULL, "Display All", NULL, NULL, G_CALLBACK(columns_activate_all_columns_cb) },
509 { "/Hide Column", NULL, "Hide Column", NULL, NULL, G_CALLBACK(columns_hide_col_cb) },
512 #ifdef HAVE_PCAP_CREATE
514 activate_monitor(GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer,
515 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
519 init_columns_menu(void)
521 GtkActionGroup *columns_action_group;
522 GError *error = NULL;
524 columns_menu_object = gtk_menu_new();
525 /* columns pop-up menu */
526 columns_action_group = gtk_action_group_new ("ColumnsPopUpMenuActionGroup");
528 gtk_action_group_add_actions (columns_action_group, /* the action group */
529 (const GtkActionEntry *)columns_menu_popup_action_entries, /* an array of action descriptions */
530 G_N_ELEMENTS(columns_menu_popup_action_entries), /* the number of entries */
531 columns_menu_object); /* data to pass to the action callbacks */
533 ui_manager_columns = gtk_ui_manager_new ();
534 gtk_ui_manager_insert_action_group (ui_manager_columns,
535 columns_action_group,
536 0); /* the position at which the group will be inserted. */
538 gtk_ui_manager_add_ui_from_string (ui_manager_columns, ui_desc_columns_menu_popup, -1, &error);
541 fprintf (stderr, "Warning: building Packet List Heading Pop-Up failed: %s\n", error->message);
542 g_error_free (error);
546 g_object_set_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY,
547 gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup"));
549 popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_columns);
552 /* stop the currently running capture */
554 capture_stop_cb(GtkWidget *w _U_, gpointer d _U_)
557 if (airpcap_if_active)
558 airpcap_set_toolbar_stop_capture(airpcap_if_active);
561 capture_stop(&global_capture_session);
564 /* restart (stop - delete old file - start) running capture */
566 capture_restart_cb(GtkWidget *w _U_, gpointer d _U_)
569 if (airpcap_if_active)
570 airpcap_set_toolbar_start_capture(airpcap_if_active);
573 capture_restart(&global_capture_session);
583 typedef struct capture_filter_check {
584 enum cfc_state_t state;
586 GtkWidget *filter_te;
588 } capture_filter_check_t;
592 * Idle: filter_text = NULL, state = ?
593 * Pending: filter_text != NULL, state = CFC_PENDING
594 * Unknown: filter_text != NULL, state = CFC_UNKNOWN
595 * Known: filter_text != NULL, state = CFC_VALID || CFC_INVALID
597 * We assume that only one text entry is active at a time.
600 /* We could make this smarter by caching results */
601 static capture_filter_check_t cfc_data;
603 static GMutex *pcap_compile_mtx;
604 static GCond *cfc_data_cond;
605 static GMutex *cfc_data_mtx;
608 #define DEBUG_SYNTAX_CHECK(state1, state2) g_warning("CF state %s -> %s : %s", state1, state2, cfc_data.filter_text)
610 #define DEBUG_SYNTAX_CHECK(state1, state2)
614 check_capture_filter_syntax(void *data _U_) {
615 struct bpf_program fcode;
619 g_mutex_lock(cfc_data_mtx);
620 while (!cfc_data.filter_text || cfc_data.state != CFC_PENDING) {
621 /* Do we really need to use a mutex here? We only have one thread... */
622 g_cond_wait(cfc_data_cond, cfc_data_mtx);
624 cfc_data.state = CFC_UNKNOWN;
625 DEBUG_SYNTAX_CHECK("pending", "unknown");
627 g_mutex_unlock(cfc_data_mtx);
628 g_mutex_lock(pcap_compile_mtx);
630 /* pcap_compile_nopcap will not alter the filter string, so the (char *) cast is "safe" */
631 pc_err = pcap_compile_nopcap(DUMMY_SNAPLENGTH /* use a dummy snaplength for syntax-checking */,
632 cfc_data.dlt, &fcode, cfc_data.filter_text, 1 /* Do optimize */,
633 DUMMY_NETMASK /* use a dummy netmask for syntax-checking */);
635 g_mutex_unlock(pcap_compile_mtx);
636 g_mutex_lock(cfc_data_mtx);
638 if (cfc_data.state == CFC_UNKNOWN) { /* No more input came in */
640 DEBUG_SYNTAX_CHECK("unknown", "known bad");
641 cfc_data.state = CFC_INVALID;
643 DEBUG_SYNTAX_CHECK("unknown", "known good");
644 cfc_data.state = CFC_VALID;
647 g_mutex_unlock(cfc_data_mtx);
653 update_capture_filter_te(gpointer data _U_) {
655 g_mutex_lock(cfc_data_mtx);
657 if (cfc_data.filter_text && cfc_data.filter_te) {
658 if (cfc_data.state == CFC_VALID) {
659 colorize_filter_te_as_valid(cfc_data.filter_te);
660 } else if (cfc_data.state == CFC_INVALID) {
661 colorize_filter_te_as_invalid(cfc_data.filter_te);
663 colorize_filter_te_as_empty(cfc_data.filter_te);
666 if (cfc_data.state == CFC_VALID || cfc_data.state == CFC_INVALID) {
667 DEBUG_SYNTAX_CHECK("known", "idle");
668 /* Reset the current state to idle. */
669 if (cfc_data.filter_text != NULL) {
670 g_free(cfc_data.filter_text);
672 cfc_data.filter_text = NULL;
673 cfc_data.state = CFC_PENDING;
676 g_mutex_unlock(cfc_data_mtx);
680 /** Initialize background capture filter syntax checking
682 void capture_filter_init(void) {
683 cfc_data.filter_text = NULL;
684 cfc_data.filter_te = NULL;
685 cfc_data.state = CFC_PENDING;
687 #if GLIB_CHECK_VERSION(2,31,0)
688 pcap_compile_mtx = g_new(GMutex,1);
689 g_mutex_init(pcap_compile_mtx);
690 cfc_data_cond = g_new(GCond,1);
691 g_cond_init(cfc_data_cond);
692 cfc_data_mtx = g_new(GMutex,1);
693 g_mutex_init(cfc_data_mtx);
694 g_thread_new("Capture filter syntax", check_capture_filter_syntax, NULL);
696 pcap_compile_mtx = g_mutex_new();
697 cfc_data_cond = g_cond_new();
698 cfc_data_mtx = g_mutex_new();
699 g_thread_create(check_capture_filter_syntax, NULL, FALSE, NULL);
702 g_timeout_add(200, update_capture_filter_te, NULL);
706 update_filter_string(gchar *name, gchar *text)
713 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
714 model = gtk_tree_view_get_model(if_cb);
715 gtk_tree_model_get_iter_first(model, &iter);
717 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
718 if (strcmp(name, name_str) == 0) {
719 gtk_list_store_set (GTK_LIST_STORE(model), &iter, FILTER, g_strdup(text), -1);
722 } while (gtk_tree_model_iter_next(model, &iter));
726 capture_all_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
728 GtkWidget *filter_cm, *filter_te;
729 gchar *filter_text = NULL;
732 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
737 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
742 if (global_capture_opts.num_selected > 0) {
745 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
746 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
747 if (!device.selected) {
750 if (device.active_dlt == -1) {
751 colorize_filter_te_as_empty(filter_te);
752 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The link type of interface %s was not specified.", device.name);
753 continue; /* Programming error: somehow managed to select an "unsupported" entry */
755 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
756 if (strlen(filter_text) == 0) {
757 colorize_filter_te_as_empty(filter_te);
758 if (strlen(device.cfilter) > 0) {
759 g_array_remove_index(global_capture_opts.all_ifaces, i);
760 device.cfilter = g_strdup(filter_text);
761 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
762 update_filter_string(device.name, filter_text);
767 g_assert(filter_text != NULL);
768 g_array_remove_index(global_capture_opts.all_ifaces, i);
769 device.cfilter = g_strdup(filter_text);
770 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
771 g_mutex_lock(cfc_data_mtx);
772 /* Ruthlessly clobber the current state. */
773 g_free(cfc_data.filter_text);
774 cfc_data.dlt = device.active_dlt;
775 cfc_data.filter_text = filter_text;
776 cfc_data.filter_te = filter_te;
777 cfc_data.state = CFC_PENDING;
778 DEBUG_SYNTAX_CHECK("?", "pending");
779 g_cond_signal(cfc_data_cond);
780 g_mutex_unlock(cfc_data_mtx);
781 update_filter_string(device.name, filter_text);
787 capture_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
789 GtkWidget *filter_cm, *filter_te, *linktype_combo_box;
793 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
796 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
800 linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
802 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &dlt_ptr)) {
804 * There is no guarantee that we will even know the list of link-layer
805 * header types; we will not have it if, for example, we have a named
806 * pipe rather than an interface, as a named pipe doesn't *have* a
807 * link-layer header type until the capture is started and the
808 * pcap file header or pcap-ng interface description block is
809 * written, and we can't wait for that. We won't have it if we can't
810 * open the interface, either.
812 * We also won't have an active pointer, even if we have the list of
813 * link-layer header types, if none of the types are supported.
815 * Just mark it as empty, as a way of saying "damned if I know whether
816 * this filter is valid".
818 colorize_filter_te_as_empty(filter_te);
821 if ((cfc_data.dlt = GPOINTER_TO_INT(dlt_ptr)) == -1) {
822 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
825 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
827 if (strlen(filter_text) == 0) {
828 colorize_filter_te_as_empty(filter_te);
833 g_mutex_lock(cfc_data_mtx);
834 /* Ruthlessly clobber the current state. */
835 if (cfc_data.filter_text != NULL) {
836 g_free(cfc_data.filter_text);
838 cfc_data.filter_text = filter_text;
839 cfc_data.filter_te = filter_te;
840 cfc_data.state = CFC_PENDING;
841 DEBUG_SYNTAX_CHECK("?", "pending");
842 g_cond_signal(cfc_data_cond);
843 g_mutex_unlock(cfc_data_mtx);
847 capture_filter_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
849 g_mutex_lock(cfc_data_mtx);
850 /* Reset the current state to idle. */
851 if (cfc_data.filter_text != NULL) {
852 g_free(cfc_data.filter_text);
854 cfc_data.filter_text = NULL;
855 cfc_data.filter_te = NULL;
856 cfc_data.state = CFC_PENDING;
857 g_mutex_unlock(cfc_data_mtx);
860 #define TIME_UNIT_SECOND 0
861 #define TIME_UNIT_MINUTE 1
862 #define TIME_UNIT_HOUR 2
863 #define TIME_UNIT_DAY 3
864 #define MAX_TIME_UNITS 4
865 static const char *time_unit_name[MAX_TIME_UNITS] = {
872 /* create one of the duration options */
873 /* (and select the matching unit depending on the given value) */
874 static GtkWidget *time_unit_combo_box_new(guint32 value) {
875 GtkWidget *unit_combo_box;
878 unit_combo_box = gtk_combo_box_text_new ();
879 for (i = 0; i < MAX_TIME_UNITS; i++) {
880 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), time_unit_name[i]);
882 /* the selected combo_box item can't be changed, once the combo_box
883 is created, so set the matching combo_box item now */
885 if (value >= 60 * 60 * 24) {
886 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_DAY);
889 if (value >= 60 * 60) {
890 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_HOUR);
894 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_MINUTE);
897 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_SECOND);
901 return unit_combo_box;
904 /* convert time value from raw to displayed (e.g. 60s -> 1min) */
905 static guint32 time_unit_combo_box_convert_value(
909 if (value >= 60 * 60 * 24) {
910 return value / (60 * 60 * 24);
914 if (value >= 60 * 60) {
915 return value / (60 * 60);
927 /* get raw value from unit and value fields */
928 static guint32 time_unit_combo_box_get_value(
929 GtkWidget *unit_combo_box,
934 unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
937 case(TIME_UNIT_SECOND):
939 case(TIME_UNIT_MINUTE):
941 case(TIME_UNIT_HOUR):
942 return value * 60 * 60;
944 return value * 60 * 60 * 24;
946 g_assert_not_reached();
952 #define SIZE_UNIT_KILOBYTES 0
953 #define SIZE_UNIT_MEGABYTES 1
954 #define SIZE_UNIT_GIGABYTES 2
955 #define MAX_SIZE_UNITS 3
956 static const char *size_unit_name[MAX_SIZE_UNITS] = {
962 /* create one of the size options */
963 /* (and select the matching unit depending on the given value) */
964 static GtkWidget *size_unit_combo_box_new(guint32 value) {
965 GtkWidget *unit_combo_box;
968 unit_combo_box=gtk_combo_box_text_new();
969 for (i=0; i<MAX_SIZE_UNITS; i++){
970 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), size_unit_name[i]);
972 /* the selected combo_box item can't be changed, once the combo_box
973 is created, so set the matching combo_box item now */
975 if (value >= 1000 * 1000) {
976 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_GIGABYTES);
980 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_MEGABYTES);
983 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_KILOBYTES);
986 return unit_combo_box;
989 /* convert size value from raw to displayed (e.g. 1000 Bytes -> 1 kB) */
990 static guint32 size_unit_combo_box_set_value(
994 if (value >= 1000 * 1000) {
995 return value / (1000 * 1000);
1000 return value / (1000);
1007 /* get raw value from unit and value fields */
1008 static guint32 size_unit_combo_box_convert_value(
1009 GtkWidget *unit_combo_box,
1014 unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
1017 case(SIZE_UNIT_KILOBYTES):
1018 if (value > (((guint32)G_MAXINT + 1) / 1000)) {
1023 case(SIZE_UNIT_MEGABYTES):
1024 if (value > (((guint32)G_MAXINT + 1) / (1000 * 1000))) {
1027 return value * 1000;
1029 case(SIZE_UNIT_GIGABYTES):
1030 if (value > (((guint32)G_MAXINT + 1) / (1000 * 1000 * 1000))) {
1033 return value * 1000 * 1000;
1036 g_assert_not_reached();
1043 * Sets the toolbar before calling the advanced dialog with for the right interface
1046 options_airpcap_advanced_cb(GtkWidget *w, gpointer d)
1050 from_widget = (gint*)g_malloc(sizeof(gint));
1051 *from_widget = AIRPCAP_ADVANCED_FROM_OPTIONS;
1052 g_object_set_data(G_OBJECT(wireless_tb),AIRPCAP_ADVANCED_FROM_KEY,from_widget);
1054 airpcap_if_active = airpcap_if_selected;
1055 airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
1056 display_airpcap_advanced_cb(w,d);
1060 #ifdef HAVE_PCAP_REMOTE
1061 /* PCAP interface type menu item */
1062 struct iftype_info {
1067 /* List of available types of PCAP interface */
1068 static struct iftype_info iftype[] = {
1069 { CAPTURE_IFLOCAL, "Local" },
1070 { CAPTURE_IFREMOTE, "Remote..." }
1073 #define REMOTE_HOST_START ((sizeof(iftype) / sizeof(iftype[0])) + 1)
1074 #define REMOTE_HOST_SEPARATOR "---"
1077 iftype_combo_box_add_remote_separators (GtkWidget *iftype_cbx)
1079 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), REMOTE_HOST_SEPARATOR);
1080 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), "Clear list");
1084 iftype_combo_box_add (GtkWidget *iftype_cbx, interface_t *device)
1086 GtkTreeModel *model;
1088 gboolean create_new = FALSE;
1090 guint pos = REMOTE_HOST_START;
1091 struct remote_host_info *rh;
1093 rh = g_hash_table_lookup (remote_host_list, device->remote_opts.remote_host_opts.remote_host);
1095 rh = g_malloc0 (sizeof (*rh));
1096 if (g_hash_table_size (remote_host_list) == 0) {
1097 iftype_combo_box_add_remote_separators (iftype_cbx);
1099 gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(iftype_cbx), pos, device->remote_opts.remote_host_opts.remote_host);
1100 rh->remote_host = g_strdup (device->remote_opts.remote_host_opts.remote_host);
1103 model = (GtkTreeModel *)gtk_combo_box_get_model(GTK_COMBO_BOX(iftype_cbx));
1104 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) {
1105 while (gtk_tree_model_iter_next(model, &iter)) {
1106 gtk_tree_model_get(model, &iter, 0, &string, -1);
1108 if (strcmp (device->remote_opts.remote_host_opts.remote_host, string) == 0) {
1109 /* Found match, show this position in combo box */
1119 g_free (rh->remote_port);
1120 g_free (rh->auth_username);
1121 g_free (rh->auth_password);
1124 rh->remote_port = g_strdup (device->remote_opts.remote_host_opts.remote_port);
1125 rh->auth_type = device->remote_opts.remote_host_opts.auth_type;
1126 rh->auth_username = g_strdup (device->remote_opts.remote_host_opts.auth_username);
1127 rh->auth_password = g_strdup (device->remote_opts.remote_host_opts.auth_password);
1130 g_hash_table_insert (remote_host_list, g_strdup (device->remote_opts.remote_host_opts.remote_host), rh);
1133 g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(1));
1134 gtk_combo_box_set_active(GTK_COMBO_BOX(iftype_cbx), pos);
1135 g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(0));
1139 iftype_combo_box_add_remote_host (gpointer key, gpointer value _U_, gpointer user_data)
1141 gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(user_data), REMOTE_HOST_START, key);
1143 /* if (g_array_index(global_capture_opts.ifaces, interface_options, 0).src_type == CAPTURE_IFREMOTE) {*/
1144 /* Ensure we select the correct entry */
1145 /* if (strcmp ((char *)key, g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host) == 0) {
1146 gtk_combo_box_set_active(GTK_COMBO_BOX(user_data), REMOTE_HOST_START);
1151 /* Fill the menu of available types of interfaces */
1153 iftype_combo_box_new(void)
1155 GtkWidget *iftype_cbx;
1157 iftype_cbx = gtk_combo_box_text_new_with_entry();
1159 /* for (i = 0; i < sizeof(iftype) / sizeof(iftype[0]); i++) {
1160 gtk_combo_box_text_append_text(GTK_COMBO_BOX(iftype_cbx), iftype[i].name);
1163 if (g_hash_table_size (remote_host_list) > 0) {
1164 /* Add remote hosts */
1165 g_hash_table_foreach (remote_host_list, iftype_combo_box_add_remote_host, iftype_cbx);
1166 iftype_combo_box_add_remote_separators (iftype_cbx);
1169 g_signal_connect(iftype_cbx, "changed", G_CALLBACK(select_if_type_cb), NULL);
1175 iftype_combo_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
1177 gboolean result = FALSE;
1180 gtk_tree_model_get(model, iter, 0, &string, -1);
1182 result = !strcmp (string, REMOTE_HOST_SEPARATOR);
1191 #ifdef HAVE_PCAP_REMOTE
1193 error_list_remote_interface_cb (gpointer dialog _U_, gint btn _U_, gpointer data)
1195 capture_remote_cb(GTK_WIDGET(data), FALSE);
1199 insert_new_rows(GList *list)
1205 char *if_string = NULL, *temp = NULL, *snaplen_string;
1207 if_capabilities_t *caps;
1208 gint linktype_count;
1209 gboolean monitor_mode;
1215 data_link_info_t *data_link_info;
1216 gchar *str = NULL, *link_type_name = NULL;
1217 gboolean found = FALSE;
1220 GtkTreeModel *model;
1221 link_row *linkr = NULL;
1223 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
1224 model = gtk_tree_view_get_model(if_cb);
1225 /* Scan through the list and build a list of strings to display. */
1226 for (if_entry = g_list_first(list); if_entry != NULL; if_entry = g_list_next(if_entry)) {
1227 if_info = (if_info_t *)if_entry->data;
1228 #ifdef HAVE_PCAP_REMOTE
1229 add_interface_to_remote_list(if_info);
1231 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
1232 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
1233 if (strcmp(device.name, if_info->name) == 0) {
1242 ip_str = g_string_new("");
1245 device.name = g_strdup(if_info->name);
1246 /* Is this interface hidden and, if so, should we include it
1248 descr = capture_dev_user_descr_find(if_info->name);
1249 if (descr != NULL) {
1250 /* Yes, we have a user-supplied description; use it. */
1251 if_string = g_strdup_printf("%s: %s", descr, if_info->name);
1254 /* No, we don't have a user-supplied description; did we get
1255 one from the OS or libpcap? */
1256 if (if_info->vendor_description != NULL) {
1258 if_string = g_strdup_printf("%s: %s", if_info->vendor_description, if_info->name);
1261 if_string = g_strdup(if_info->name);
1263 } /* else descr != NULL */
1264 if (if_info->loopback) {
1265 device.display_name = g_strdup_printf("%s (loopback)", if_string);
1267 device.display_name = g_strdup(if_string);
1269 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
1270 if ((device.buffer = capture_dev_user_buffersize_find(if_string)) == -1) {
1271 device.buffer = global_capture_opts.default_options.buffer_size;
1274 if ((device.pmode = capture_dev_user_pmode_find(if_string)) == -1) {
1275 device.pmode = global_capture_opts.default_options.promisc_mode;
1277 device.has_snaplen = global_capture_opts.default_options.has_snaplen;
1278 if ((device.snaplen = capture_dev_user_snaplen_find(if_string)) == -1) {
1279 device.snaplen = global_capture_opts.default_options.snaplen;
1281 device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
1282 monitor_mode = prefs_capture_device_monitor_mode(if_string);
1283 caps = capture_get_if_capabilities(if_string, monitor_mode, NULL, main_window_update);
1284 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1285 for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) {
1287 g_string_append(ip_str, "\n");
1289 addr = (if_addr_t *)curr_addr->data;
1291 switch (addr->ifat_type) {
1293 g_string_append(ip_str, ip_to_str((guint8 *)&addr->addr.ip4_addr));
1296 g_string_append(ip_str, ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr));
1299 /* In case we add non-IP addresses */
1302 } /* for curr_addr */
1304 device.links = NULL;
1306 #ifdef HAVE_PCAP_CREATE
1307 device.monitor_mode_enabled = monitor_mode;
1308 device.monitor_mode_supported = caps->can_set_rfmon;
1310 for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
1311 data_link_info = (data_link_info_t *)lt_entry->data;
1312 linkr = (link_row *)g_malloc(sizeof(link_row));
1314 * For link-layer types libpcap/WinPcap doesn't know about, the
1315 * name will be "DLT n", and the description will be null.
1316 * We mark those as unsupported, and don't allow them to be
1319 if (data_link_info->description != NULL) {
1320 str = g_strdup_printf("%s", data_link_info->description);
1321 linkr->dlt = data_link_info->dlt;
1323 str = g_strdup_printf("%s (not supported)", data_link_info->name);
1326 if (linktype_count == 0) {
1327 link_type_name = g_strdup(str);
1328 device.active_dlt = data_link_info->dlt;
1330 linkr->name = g_strdup(str);
1332 device.links = g_list_append(device.links, linkr);
1334 } /* for link_types */
1336 #if defined(HAVE_PCAP_CREATE)
1337 device.monitor_mode_enabled = FALSE;
1338 device.monitor_mode_supported = FALSE;
1340 device.active_dlt = -1;
1341 link_type_name = g_strdup("default");
1343 device.addresses = g_strdup(ip_str->str);
1344 device.no_addresses = ips;
1346 temp = g_strdup_printf("<b>%s</b>", device.display_name);
1348 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
1350 #ifdef HAVE_PCAP_REMOTE
1351 device.remote_opts.src_type= global_remote_opts.src_type;
1352 if (device.remote_opts.src_type == CAPTURE_IFREMOTE) {
1353 device.local = FALSE;
1355 device.remote_opts.remote_host_opts.remote_host = g_strdup(global_remote_opts.remote_host_opts.remote_host);
1356 device.remote_opts.remote_host_opts.remote_port = g_strdup(global_remote_opts.remote_host_opts.remote_port);
1357 device.remote_opts.remote_host_opts.auth_type = global_remote_opts.remote_host_opts.auth_type;
1358 device.remote_opts.remote_host_opts.auth_username = g_strdup(global_remote_opts.remote_host_opts.auth_username);
1359 device.remote_opts.remote_host_opts.auth_password = g_strdup(global_remote_opts.remote_host_opts.auth_password);
1360 device.remote_opts.remote_host_opts.datatx_udp = global_remote_opts.remote_host_opts.datatx_udp;
1361 device.remote_opts.remote_host_opts.nocap_rpcap = global_remote_opts.remote_host_opts.nocap_rpcap;
1362 device.remote_opts.remote_host_opts.nocap_local = global_remote_opts.remote_host_opts.nocap_local;
1364 device.local = TRUE;
1366 #ifdef HAVE_PCAP_SETSAMPLING
1367 device.remote_opts.sampling_method = global_remote_opts.sampling_method;
1368 device.remote_opts.sampling_param = global_remote_opts.sampling_param;
1370 device.selected = TRUE;
1371 global_capture_opts.num_selected++;
1372 g_array_append_val(global_capture_opts.all_ifaces, device);
1373 snaplen_string = g_strdup_printf("%d", device.snaplen);
1375 #if defined(HAVE_PCAP_CREATE)
1376 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);
1377 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
1378 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);
1380 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);
1382 g_string_free(ip_str, TRUE);
1383 #ifdef HAVE_PCAP_REMOTE
1384 add_interface_to_list(global_capture_opts.all_ifaces->len-1);
1387 gtk_tree_view_set_model(GTK_TREE_VIEW(if_cb), model);
1391 #ifdef HAVE_PCAP_REMOTE
1392 /* Retrieve the list of local or remote interfaces according to selected
1393 * options and re-fill interface name combobox */
1395 update_interface_list(void)
1397 GtkWidget *iftype_cbx;
1398 GList *if_list, *if_r_list;
1402 if (cap_open_w == NULL)
1404 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);
1405 iftype_id = CAPTURE_IFREMOTE;
1406 if (iftype_id >= CAPTURE_IFREMOTE) {
1407 if_r_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
1408 global_remote_opts.remote_host_opts.remote_port,
1409 global_remote_opts.remote_host_opts.auth_type,
1410 global_remote_opts.remote_host_opts.auth_username,
1411 global_remote_opts.remote_host_opts.auth_password,
1414 if_list = if_r_list;
1416 if_list = capture_interface_list(&err, &err_str, main_window_update); /* Warning: see capture_prep_cb() */
1417 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY, NULL);
1420 if (if_list == NULL &&
1421 (err == CANT_GET_INTERFACE_LIST || err == DONT_HAVE_PCAP)) {
1422 gpointer dialog = simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
1425 if (iftype_id >= CAPTURE_IFREMOTE) {
1426 /* Fall back to previous interface list */
1427 simple_dialog_set_cb(dialog, error_list_remote_interface_cb, iftype_cbx);
1430 } else if (iftype_id == CAPTURE_IFREMOTE) {
1431 /* New remote interface */
1432 insert_new_rows(if_list);
1433 refresh_non_local_interface_lists();
1437 /* User changed an interface entry of "Remote interface" dialog */
1439 capture_remote_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
1441 GtkWidget *auth_passwd_rb,
1442 *username_lb, *username_te,
1443 *passwd_lb, *passwd_te;
1446 auth_passwd_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1447 E_REMOTE_AUTH_PASSWD_KEY);
1448 username_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1449 E_REMOTE_USERNAME_LB_KEY);
1450 username_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1451 E_REMOTE_USERNAME_TE_KEY);
1452 passwd_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_LB_KEY);
1453 passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_TE_KEY);
1455 state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb));
1456 gtk_widget_set_sensitive(GTK_WIDGET(username_lb), state);
1457 gtk_widget_set_sensitive(GTK_WIDGET(username_te), state);
1458 gtk_widget_set_sensitive(GTK_WIDGET(passwd_lb), state);
1459 gtk_widget_set_sensitive(GTK_WIDGET(passwd_te), state);
1463 /* user requested to accept remote interface options */
1465 capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w)
1467 GtkWidget *host_te, *port_te, *username_te, *passwd_te, *auth_passwd_rb;
1470 if (remote_w == NULL) {
1474 host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
1475 hostname = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(host_te));
1476 port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
1477 username_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w),
1478 E_REMOTE_USERNAME_TE_KEY);
1479 passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
1480 auth_passwd_rb = (GtkWidget *) g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
1481 g_free(global_remote_opts.remote_host_opts.remote_host);
1482 global_remote_opts.remote_host_opts.remote_host = hostname;
1483 g_free(global_remote_opts.remote_host_opts.remote_port);
1484 global_remote_opts.remote_host_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te)));
1485 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb)))
1486 global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_PWD;
1488 global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_NULL;
1489 g_free(global_remote_opts.remote_host_opts.auth_username);
1490 global_remote_opts.remote_host_opts.auth_username =
1491 g_strdup(gtk_entry_get_text(GTK_ENTRY(username_te)));
1493 g_free(global_remote_opts.remote_host_opts.auth_password);
1494 global_remote_opts.remote_host_opts.auth_password =
1495 g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_te)));
1497 update_interface_list();
1499 window_destroy(GTK_WIDGET(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY)));
1503 capture_remote_cancel_cb(GtkWidget *win, gpointer data)
1505 window_cancel_button_cb (win, data);
1509 free_remote_host (gpointer key _U_, gpointer value, gpointer user _U_)
1511 struct remote_host *rh = value;
1513 g_free (rh->remote_host);
1514 g_free (rh->remote_port);
1515 g_free (rh->auth_username);
1516 g_free (rh->auth_password);
1522 select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_)
1525 GtkWidget *port_te, *auth_rb, *user_te, *pass_te;
1526 GtkWidget *remote_w;
1527 struct remote_host *rh;
1529 int new_iftype = gtk_combo_box_get_active(GTK_COMBO_BOX(iftype_cbx));
1530 gint num_remote = g_hash_table_size (remote_host_list);
1532 if (new_iftype != -1 && new_iftype == num_remote+1) {
1533 g_hash_table_foreach_remove (remote_host_list, free_remote_host, NULL);
1535 while (num_remote--) { /* Remove separator lines and "Clear" item */
1536 gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT(iftype_cbx), num_remote);
1538 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
1539 window_destroy(GTK_WIDGET(remote_w));
1540 capture_remote_cb(GTK_WIDGET(iftype_cbx), FALSE);
1542 string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(iftype_cbx));
1543 rh = g_hash_table_lookup (remote_host_list, string);
1546 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
1547 port_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
1548 gtk_entry_set_text(GTK_ENTRY(port_te), rh->remote_port);
1549 auth_rb = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
1550 if (rh->auth_type == CAPTURE_AUTH_PWD) {
1551 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), TRUE);
1553 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), FALSE);
1555 user_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY);
1556 gtk_entry_set_text(GTK_ENTRY(user_te), rh->auth_username);
1557 pass_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
1558 gtk_entry_set_text(GTK_ENTRY(pass_te), rh->auth_password);
1563 /* Show remote capture interface parameters dialog */
1565 capture_remote_cb(GtkWidget *w, gboolean focus_username)
1567 GtkWidget *remote_w,
1568 *main_vb, *host_grid,
1569 *host_lb, *host_te, *port_lb, *port_te,
1571 *auth_null_rb, *auth_passwd_rb, *auth_passwd_grid,
1572 *user_lb, *user_te, *passwd_lb, *passwd_te,
1573 *bbox, *ok_but, *cancel_bt;
1577 title = create_user_window_title("Wireshark: Remote Interface");
1578 remote_w = dlg_window_new(title);
1579 gtk_window_set_transient_for(GTK_WINDOW(remote_w), GTK_WINDOW(interface_management_w));
1580 g_object_set_data(G_OBJECT(remote_w), E_CAP_REMOTE_CALLER_PTR_KEY, interface_management_w);
1581 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, remote_w);
1584 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1585 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
1586 gtk_container_add(GTK_CONTAINER(remote_w), main_vb);
1588 /* Host/port table */
1589 host_grid = ws_gtk_grid_new();
1590 ws_gtk_grid_set_row_spacing(GTK_GRID(host_grid), DLG_LABEL_SPACING);
1591 ws_gtk_grid_set_column_spacing(GTK_GRID(host_grid), DLG_UNRELATED_SPACING);
1592 gtk_box_pack_start(GTK_BOX(main_vb), host_grid, FALSE, FALSE, 0);
1595 host_lb = gtk_label_new("Host:");
1596 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_lb, 0, 0, 1, 1);
1598 host_te = iftype_combo_box_new();
1599 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_te, 1, 0, 1, 1);
1602 port_lb = gtk_label_new("Port:");
1603 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_lb, 0, 1, 1, 1);
1605 port_te = gtk_entry_new();
1606 gtk_widget_set_tooltip_text(port_te, "Enter the TCP port number used by RPCAP server at remote host "
1607 "(leave it empty for default port number).");
1608 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_te, 1, 1, 1, 1);
1610 /* Authentication options frame */
1611 auth_fr = gtk_frame_new("Authentication");
1612 gtk_box_pack_start(GTK_BOX (main_vb), auth_fr, TRUE, TRUE, 0);
1614 auth_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
1615 gtk_container_set_border_width(GTK_CONTAINER(auth_vb), 5);
1616 gtk_container_add(GTK_CONTAINER(auth_fr), auth_vb);
1618 auth_null_rb = gtk_radio_button_new_with_label(NULL,
1619 "Null authentication");
1620 gtk_box_pack_start(GTK_BOX(auth_vb), auth_null_rb, TRUE, TRUE, 0);
1622 auth_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(auth_null_rb));
1623 auth_passwd_rb = gtk_radio_button_new_with_label(auth_group,
1624 "Password authentication");
1625 gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_rb, TRUE, TRUE, 0);
1626 g_signal_connect(auth_passwd_rb, "toggled",
1627 G_CALLBACK(capture_remote_adjust_sensitivity), remote_w);
1629 auth_passwd_grid = ws_gtk_grid_new();
1630 ws_gtk_grid_set_row_spacing(GTK_GRID(auth_passwd_grid), DLG_LABEL_SPACING);
1631 ws_gtk_grid_set_column_spacing(GTK_GRID(auth_passwd_grid), DLG_UNRELATED_SPACING);
1633 gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_grid, FALSE, FALSE, 0);
1635 user_lb = gtk_label_new("Username:");
1636 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_lb, 0, 0, 1, 1);
1638 user_te = gtk_entry_new();
1639 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_te, 1, 0, 1, 1);
1641 passwd_lb = gtk_label_new("Password:");
1642 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_lb, 0, 1, 1, 1);
1644 passwd_te = gtk_entry_new();
1645 gtk_entry_set_visibility(GTK_ENTRY(passwd_te), FALSE);
1646 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_te, 1, 1, 1, 1);
1648 /* Button row: "OK" and "Cancel" buttons */
1649 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
1650 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
1652 ok_but = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
1653 gtk_widget_set_can_default(ok_but, TRUE);
1654 g_signal_connect(ok_but, "clicked", G_CALLBACK(capture_remote_ok_cb), remote_w);
1655 gtk_widget_set_tooltip_text(ok_but,
1656 "Accept remote host parameters and lookup "
1657 "remote interfaces.");
1658 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_OK_BT_KEY, ok_but);
1659 cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
1660 gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
1661 window_set_cancel_button(remote_w, cancel_bt, capture_remote_cancel_cb);
1663 if (focus_username) {
1664 /* Give the initial focus to the "Username" entry box. */
1665 gtk_widget_grab_focus(user_te);
1668 gtk_widget_grab_default(ok_but);
1670 /* Catch the "activate" signal on the text
1671 entries, so that if the user types Return there, we act as if the
1672 "OK" button had been selected, as happens if Return is typed if some
1673 widget that *doesn't* handle the Return key has the input focus. */
1674 dlg_set_activate(port_te, ok_but);
1675 dlg_set_activate(user_te, ok_but);
1676 dlg_set_activate(passwd_te, ok_but);
1678 g_signal_connect(remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1680 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY, host_te);
1681 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY, port_te);
1682 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_NULL_KEY, auth_null_rb);
1683 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY, auth_passwd_rb);
1684 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_LB_KEY, user_lb);
1685 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY, user_te);
1686 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_LB_KEY, passwd_lb);
1687 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY, passwd_te);
1689 if (global_remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD)
1690 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_passwd_rb), TRUE);
1692 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_null_rb), TRUE);
1693 capture_remote_adjust_sensitivity(NULL, remote_w);
1695 gtk_widget_show_all(remote_w);
1696 window_present(remote_w);
1699 /* user requested to destroy the dialog */
1701 options_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
1705 caller = g_object_get_data(G_OBJECT(win), E_OPT_REMOTE_CALLER_PTR_KEY);
1706 g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, NULL);
1709 /* user requested to accept remote interface options */
1711 options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w)
1713 GtkWidget *datatx_udp_cb, *nocap_rpcap_cb;
1714 #ifdef HAVE_PCAP_SETSAMPLING
1715 GtkWidget *samp_none_rb, *samp_count_rb, *samp_timer_rb,
1716 *samp_count_sb, *samp_timer_sb;
1720 if (parent_w == NULL)
1723 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
1724 g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
1725 datatx_udp_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_DATATX_UDP_CB_KEY);
1726 nocap_rpcap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_NOCAP_RPCAP_CB_KEY);
1728 device.remote_opts.remote_host_opts.datatx_udp =
1729 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(datatx_udp_cb));
1730 device.remote_opts.remote_host_opts.nocap_rpcap =
1731 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb));
1733 #ifdef HAVE_PCAP_SETSAMPLING
1734 samp_none_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_NONE_RB_KEY);
1735 samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
1736 samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
1737 samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
1738 samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
1740 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_none_rb)))
1741 device.remote_opts.sampling_method = CAPTURE_SAMP_NONE;
1742 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb))) {
1743 device.remote_opts.sampling_method = CAPTURE_SAMP_BY_COUNT;
1744 device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb));
1745 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb))) {
1746 device.remote_opts.sampling_method = CAPTURE_SAMP_BY_TIMER;
1747 device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb));
1749 #endif /* HAVE_PCAP_SETSAMPLING*/
1750 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
1751 window_destroy(GTK_WIDGET(parent_w));
1753 #endif /*HAVE_PCAP_REMOTE*/
1755 #ifdef HAVE_PCAP_SETSAMPLING
1757 options_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
1759 GtkWidget *samp_count_rb, *samp_timer_rb,
1760 *samp_count_sb, *samp_timer_sb;
1762 samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
1763 samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
1764 samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
1765 samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
1767 if (samp_count_sb && samp_count_rb)
1768 gtk_widget_set_sensitive(GTK_WIDGET(samp_count_sb),
1769 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb)));
1771 if (samp_timer_sb && samp_timer_rb)
1772 gtk_widget_set_sensitive(GTK_WIDGET(samp_timer_sb),
1773 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb)));
1776 #endif /*HAVE_PCAP_SETSAMPLING*/
1777 #ifdef HAVE_PCAP_REMOTE
1779 options_remote_cb(GtkWidget *w _U_, gpointer d _U_)
1781 GtkWidget *opt_remote_w, *main_vb;
1782 GtkWidget *caller, *bbox, *ok_but, *cancel_bt;
1783 GtkWidget *capture_fr, *capture_vb;
1784 GtkWidget *nocap_rpcap_cb, *datatx_udp_cb;
1785 #ifdef HAVE_PCAP_SETSAMPLING
1786 GtkWidget *sampling_fr, *sampling_vb, *sampling_grid, *sampling_lb,
1787 *samp_none_rb, *samp_count_rb, *samp_timer_rb,
1788 *samp_count_sb, *samp_timer_sb;
1789 GtkAdjustment *samp_count_adj, *samp_timer_adj;
1794 caller = gtk_widget_get_toplevel(w);
1795 opt_remote_w = g_object_get_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY);
1796 if (opt_remote_w != NULL) {
1797 reactivate_window(opt_remote_w);
1801 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
1802 opt_remote_w = dlg_window_new("Remote Capture Settings");
1803 gtk_window_set_modal(GTK_WINDOW(opt_remote_w), TRUE);
1804 gtk_window_set_transient_for(GTK_WINDOW(opt_remote_w), GTK_WINDOW(caller));
1805 gtk_window_set_type_hint(GTK_WINDOW(opt_remote_w), GDK_WINDOW_TYPE_HINT_DIALOG);
1807 g_object_set_data(G_OBJECT(opt_remote_w), E_OPT_REMOTE_CALLER_PTR_KEY, caller);
1808 g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, opt_remote_w);
1810 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1811 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
1812 gtk_container_add(GTK_CONTAINER(opt_remote_w), main_vb);
1814 /* Remote capture options */
1815 capture_fr = gtk_frame_new("Capture Options");
1816 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
1818 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1819 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
1820 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
1822 nocap_rpcap_cb = gtk_check_button_new_with_mnemonic("Do not capture own RPCAP traffic");
1823 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb),
1824 device.remote_opts.remote_host_opts.nocap_rpcap);
1825 gtk_box_pack_start(GTK_BOX (capture_vb), nocap_rpcap_cb, TRUE, TRUE, 0);
1827 datatx_udp_cb = gtk_check_button_new_with_mnemonic("Use UDP for data transfer");
1828 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(datatx_udp_cb),
1829 device.remote_opts.remote_host_opts.datatx_udp);
1830 gtk_box_pack_start(GTK_BOX (capture_vb), datatx_udp_cb, TRUE, TRUE, 0);
1833 #ifdef HAVE_PCAP_SETSAMPLING
1834 /* Sampling options */
1835 sampling_fr = gtk_frame_new("Sampling Options");
1836 gtk_box_pack_start(GTK_BOX (main_vb), sampling_fr, TRUE, TRUE, 0);
1838 sampling_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1839 gtk_container_set_border_width(GTK_CONTAINER(sampling_vb), 5);
1840 gtk_container_add(GTK_CONTAINER(sampling_fr), sampling_vb);
1842 sampling_grid = ws_gtk_grid_new();
1843 ws_gtk_grid_set_row_spacing(GTK_GRID(sampling_grid), DLG_LABEL_SPACING);
1844 ws_gtk_grid_set_column_spacing(GTK_GRID(sampling_grid), DLG_UNRELATED_SPACING);
1845 gtk_box_pack_start(GTK_BOX(sampling_vb), sampling_grid, FALSE, FALSE, 0);
1847 /* "No sampling" row */
1848 samp_none_rb = gtk_radio_button_new_with_label(NULL, "None");
1849 if (device.remote_opts.sampling_method == CAPTURE_SAMP_NONE)
1850 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_none_rb), TRUE);
1851 g_signal_connect(samp_none_rb, "toggled",
1852 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1853 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_none_rb, 0, 0, 1, 1);
1855 /* "Sampling by counter" row */
1856 samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_none_rb));
1857 samp_count_rb = gtk_radio_button_new_with_label(samp_group, "1 of");
1858 if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_COUNT)
1859 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_count_rb), TRUE);
1860 g_signal_connect(samp_count_rb, "toggled",
1861 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1862 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_rb, 0, 1, 1, 1);
1864 samp_count_adj = (GtkAdjustment *) gtk_adjustment_new(
1865 (gfloat)device.remote_opts.sampling_param,
1866 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
1867 samp_count_sb = gtk_spin_button_new(samp_count_adj, 0, 0);
1868 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_count_sb), TRUE);
1869 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_sb, 1, 1, 1, 1);
1871 sampling_lb = gtk_label_new("packets");
1872 gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
1873 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 1, 1, 1);
1875 /* "Sampling by timer" row */
1876 samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_count_rb));
1877 samp_timer_rb = gtk_radio_button_new_with_label(samp_group, "1 every");
1878 if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_TIMER)
1879 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_timer_rb), TRUE);
1880 g_signal_connect(samp_timer_rb, "toggled",
1881 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1882 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_timer_rb, 0, 2, 1, 1);
1884 samp_timer_adj = (GtkAdjustment *) gtk_adjustment_new(
1885 (gfloat)device.remote_opts.sampling_param,
1886 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
1887 samp_timer_sb = gtk_spin_button_new(samp_timer_adj, 0, 0);
1888 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_timer_sb), TRUE);
1889 ws_gtk_grid_attach_defaults(GTK_GRID(sampling_grid), samp_timer_sb, 1, 2, 1, 1);
1891 sampling_lb = gtk_label_new("milliseconds");
1892 gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
1893 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 2, 1, 1);
1896 /* Button row: "Start" and "Cancel" buttons */
1897 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
1898 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
1900 ok_but = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
1901 g_signal_connect(ok_but, "clicked", G_CALLBACK(options_remote_ok_cb), opt_remote_w);
1902 gtk_widget_set_tooltip_text(ok_but, "Accept parameters and close dialog");
1903 cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
1904 gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
1905 window_set_cancel_button(opt_remote_w, cancel_bt, window_cancel_button_cb);
1907 gtk_widget_grab_default(ok_but);
1909 g_signal_connect(opt_remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1910 g_signal_connect(opt_remote_w, "destroy", G_CALLBACK(options_remote_destroy_cb), NULL);
1912 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_NOCAP_RPCAP_CB_KEY, nocap_rpcap_cb);
1913 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_DATATX_UDP_CB_KEY, datatx_udp_cb);
1915 #ifdef HAVE_PCAP_SETSAMPLING
1916 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_NONE_RB_KEY, samp_none_rb);
1917 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_RB_KEY, samp_count_rb);
1918 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_SB_KEY, samp_count_sb);
1919 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_RB_KEY, samp_timer_rb);
1920 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_SB_KEY, samp_timer_sb);
1923 #ifdef HAVE_PCAP_SETSAMPLING
1924 /* Set the sensitivity of various widgets as per the settings of other
1926 options_prep_adjust_sensitivity(NULL, opt_remote_w);
1929 gtk_widget_show_all(opt_remote_w);
1930 window_present(opt_remote_w);
1934 recent_print_remote_host (gpointer key _U_, gpointer value, gpointer user)
1937 struct remote_host_info *ri = value;
1939 fprintf (rf, RECENT_KEY_REMOTE_HOST ": %s,%s,%d\n", ri->remote_host, ri->remote_port, ri->auth_type);
1943 capture_remote_combo_recent_write_all(FILE *rf)
1945 if (remote_host_list && g_hash_table_size (remote_host_list) > 0) {
1946 /* Write all remote interfaces to the recent file */
1947 g_hash_table_foreach (remote_host_list, recent_print_remote_host, rf);
1952 capture_remote_combo_add_recent(const gchar *s)
1954 GList *vals = prefs_get_string_list (s);
1958 struct remote_host_info *rh;
1963 if (remote_host_list == NULL) {
1964 remote_host_list = g_hash_table_new (g_str_hash, g_str_equal);
1967 rh = g_malloc (sizeof (*rh));
1969 /* First value is the host */
1970 rh->remote_host = g_strdup (valp->data);
1971 if (strlen(rh->remote_host) == 0) {
1972 /* Empty remote host */
1973 g_free(rh->remote_host);
1977 rh->auth_type = CAPTURE_AUTH_NULL;
1981 /* Found value 2, this is the port number */
1982 rh->remote_port = g_strdup (valp->data);
1985 /* Did not find a port number */
1986 rh->remote_port = g_strdup ("");
1990 /* Found value 3, this is the authentication type */
1991 auth_type = strtol(valp->data, &p, 0);
1992 if (p != valp->data && *p == '\0') {
1993 rh->auth_type = auth_type;
1997 /* Do not store username and password */
1998 rh->auth_username = g_strdup ("");
1999 rh->auth_password = g_strdup ("");
2001 prefs_clear_string_list(vals);
2003 g_hash_table_insert (remote_host_list, g_strdup(rh->remote_host), rh);
2008 #endif /* HAVE_PCAP_REMOTE */
2010 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2013 compile_bpf_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
2015 /* Note that we no longer have an "About Wireshark" dialog box. */
2016 compile_bpf_w = NULL;
2020 select_first_entry(void)
2023 GtkTreeModel *model;
2025 GtkTreeSelection *selection;
2027 view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
2028 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
2029 gtk_tree_model_get_iter_first(model, &iter);
2030 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
2031 gtk_tree_selection_select_iter(selection, &iter);
2035 add_page(gchar *name, gchar *text, gboolean error)
2037 GtkWidget *view, *icon;
2038 GtkTreeModel *model;
2041 view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
2042 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
2043 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
2045 icon = pixbuf_to_widget(expert_error_pb_data);
2046 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 1, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
2048 icon = pixbuf_to_widget(expert_ok_pb_data);
2049 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 0, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
2051 g_hash_table_insert(compile_results, name, text);
2055 compile_tree_select_cb(GtkTreeSelection *sel, gpointer dummy _U_)
2058 GtkTreeModel *model;
2060 GtkWidget *textview;
2061 GtkTextBuffer *buffer;
2064 if (gtk_tree_selection_get_selected(sel, &model, &iter))
2066 gtk_tree_model_get(model, &iter, COMPILE_ERROR, &error, INAME, &name, -1);
2067 text = (gchar *)g_hash_table_lookup(compile_results, name);
2068 textview = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB);
2070 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
2072 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
2074 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
2075 gtk_text_buffer_set_text(buffer, text, -1);
2076 gtk_widget_show_all(compile_bpf_w);
2081 compile_results_prep(GtkWidget *w _U_, gpointer data _U_)
2083 GtkWidget *main_box, *main_vb, *bbox, *ok_btn, *top_hb, *ct_sb;
2084 GtkListStore *store;
2085 GtkWidget *view, *scrolled_win, *textview;
2086 GtkTreeSelection *selection;
2087 GtkCellRenderer *renderer;
2088 GtkTreeViewColumn *column;
2089 PangoFontDescription *font;
2091 if (compile_bpf_w != NULL) {
2092 /* There's already an "About Wireshark" dialog box; reactivate it. */
2093 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The requested dialog is already open. Please close it first.");
2097 compile_bpf_w = dlg_window_new("Compile selected BPFs");
2098 /* set the initial position (must be done, before show is called!) */
2099 /* default position is not appropriate for the about dialog */
2100 gtk_window_set_position(GTK_WINDOW(compile_bpf_w), GTK_WIN_POS_CENTER_ON_PARENT);
2101 gtk_window_set_default_size(GTK_WINDOW(compile_bpf_w), 600, 400);
2102 gtk_window_set_modal(GTK_WINDOW(compile_bpf_w), TRUE);
2103 gtk_window_set_transient_for(GTK_WINDOW(compile_bpf_w), GTK_WINDOW(cap_open_w));
2104 gtk_container_set_border_width(GTK_CONTAINER(compile_bpf_w), 6);
2106 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
2107 gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
2108 gtk_container_add(GTK_CONTAINER(compile_bpf_w), main_box);
2109 gtk_widget_show(main_box);
2111 /* Top row: Interfaces tree and notebook */
2112 top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
2113 gtk_box_pack_start(GTK_BOX(main_box), top_hb, TRUE, TRUE, 0);
2114 gtk_widget_show(top_hb);
2116 /* scrolled window on the left for the categories tree */
2117 ct_sb = scrolled_window_new(NULL, NULL);
2118 gtk_widget_set_size_request(GTK_WIDGET(ct_sb), 50, -1);
2119 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct_sb),
2121 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct_sb),
2122 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2123 gtk_box_pack_start(GTK_BOX(top_hb), ct_sb, TRUE, TRUE, 0);
2124 gtk_widget_show(ct_sb);
2125 g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_SW_SCROLLW_KEY, ct_sb);
2127 store = gtk_list_store_new(3, G_TYPE_UINT, GDK_TYPE_PIXBUF, G_TYPE_STRING);
2128 view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
2129 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL (store));
2130 g_object_set(G_OBJECT(view), "headers-visible", FALSE, NULL);
2131 g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES, view);
2132 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
2133 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
2134 column = gtk_tree_view_column_new();
2135 renderer = gtk_cell_renderer_text_new();
2136 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2137 gtk_tree_view_column_set_attributes(column, renderer, "text", COMPILE_ERROR, NULL);
2138 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2139 gtk_tree_view_column_set_visible(column, FALSE);
2140 column = gtk_tree_view_column_new();
2141 renderer = gtk_cell_renderer_pixbuf_new();
2142 gtk_tree_view_column_pack_start(column, renderer, FALSE);
2143 gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", SIGN, NULL);
2144 renderer = gtk_cell_renderer_text_new();
2145 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2146 gtk_tree_view_column_set_attributes(column, renderer, "text", INAME, NULL);
2147 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2148 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 0), TRUE);
2150 g_signal_connect(selection, "changed", G_CALLBACK(compile_tree_select_cb), NULL);
2151 gtk_container_add(GTK_CONTAINER(ct_sb), view);
2152 gtk_widget_show(view);
2154 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
2155 gtk_box_pack_start(GTK_BOX(top_hb), main_vb, TRUE, TRUE, 0);
2156 gtk_widget_show(main_vb);
2157 g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, main_vb);
2159 font = pango_font_description_from_string("Monospace");
2160 textview = gtk_text_view_new();
2161 #if GTK_CHECK_VERSION(3, 0, 0)
2162 gtk_widget_override_font(textview, font);
2164 gtk_widget_modify_font(textview, font);
2166 scrolled_win = gtk_scrolled_window_new(NULL, NULL);
2167 gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
2168 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
2169 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2170 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
2172 gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
2173 gtk_box_pack_start(GTK_BOX(main_vb), scrolled_win, TRUE, TRUE, 0);
2174 g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, textview);
2177 bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
2178 gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
2180 ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
2181 gtk_widget_grab_focus(ok_btn);
2182 gtk_widget_grab_default(ok_btn);
2183 window_set_cancel_button(compile_bpf_w, ok_btn, window_cancel_button_cb);
2185 g_signal_connect(compile_bpf_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2186 g_signal_connect(compile_bpf_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
2188 gtk_widget_show_all(compile_bpf_w);
2189 window_present(compile_bpf_w);
2191 compile_results = g_hash_table_new(g_str_hash, g_str_equal);
2195 capture_all_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
2198 struct bpf_program fcode;
2200 GtkWidget *filter_cm;
2203 gboolean set = FALSE;
2205 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
2210 if (global_capture_opts.all_ifaces->len > 0) {
2213 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
2214 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
2215 if (!device.selected || device.hidden) {
2218 if (device.active_dlt == -1) {
2219 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2223 compile_results_prep(NULL, NULL);
2225 pd = pcap_open_dead(device.active_dlt, DUMMY_SNAPLENGTH);
2227 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
2228 g_mutex_lock(pcap_compile_mtx);
2229 #ifdef PCAP_NETMASK_UNKNOWN
2230 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0)
2232 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0)
2235 g_mutex_unlock(pcap_compile_mtx);
2236 add_page(device.name, g_strdup(pcap_geterr(pd)), TRUE);
2238 GString *bpf_code_dump = g_string_new("");
2239 struct bpf_insn *insn = fcode.bf_insns;
2240 int ii, n = fcode.bf_len;
2241 gchar *bpf_code_str;
2243 for (ii = 0; ii < n; ++insn, ++ii) {
2244 g_string_append(bpf_code_dump, bpf_image(insn, ii));
2245 g_string_append(bpf_code_dump, "\n");
2247 bpf_code_str = g_string_free(bpf_code_dump, FALSE);
2248 g_mutex_unlock(pcap_compile_mtx);
2249 add_page(device.name, g_strdup(bpf_code_str), FALSE);
2250 g_free(bpf_code_str);
2252 g_free(filter_text);
2256 select_first_entry();
2258 #endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
2261 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2263 compile_results_win(gchar *text, gboolean error)
2265 GtkWidget *main_box, *bbox, *ok_btn, *results_w;
2266 GtkWidget *scrolled_win, *textview;
2267 PangoFontDescription *font;
2268 GtkTextBuffer *buffer;
2270 results_w = dlg_window_new("Compile results");
2271 /* set the initial position (must be done, before show is called!) */
2272 /* default position is not appropriate for the about dialog */
2273 gtk_window_set_position(GTK_WINDOW(results_w), GTK_WIN_POS_CENTER_ON_PARENT);
2274 gtk_window_set_default_size(GTK_WINDOW(results_w), 400, 400);
2275 gtk_window_set_modal(GTK_WINDOW(results_w), TRUE);
2276 gtk_window_set_transient_for(GTK_WINDOW(results_w), GTK_WINDOW(opt_edit_w));
2277 gtk_container_set_border_width(GTK_CONTAINER(results_w), 6);
2278 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
2279 gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
2280 gtk_container_add(GTK_CONTAINER(results_w), main_box);
2281 gtk_widget_show(main_box);
2282 font = pango_font_description_from_string("Monospace");
2283 textview = gtk_text_view_new();
2284 #if GTK_CHECK_VERSION(3, 0, 0)
2285 gtk_widget_override_font(textview, font);
2287 gtk_widget_modify_font(textview, font);
2289 scrolled_win = gtk_scrolled_window_new(NULL, NULL);
2290 gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
2291 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
2292 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2293 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
2295 gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
2296 gtk_box_pack_start(GTK_BOX(main_box), scrolled_win, TRUE, TRUE, 0);
2298 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
2300 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
2302 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
2303 gtk_text_buffer_set_text(buffer, g_strdup(text), -1);
2305 bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
2306 gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
2308 ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
2309 gtk_widget_grab_focus(ok_btn);
2310 gtk_widget_grab_default(ok_btn);
2311 window_set_cancel_button(results_w, ok_btn, window_cancel_button_cb);
2313 g_signal_connect(results_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2314 g_signal_connect(results_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
2316 gtk_widget_show_all(results_w);
2317 window_present(results_w);
2322 capture_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
2325 struct bpf_program fcode;
2327 GtkWidget *filter_cm;
2331 GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
2333 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
2334 g_assert_not_reached(); /* Programming error: somehow nothing is active */
2336 if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
2337 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2339 pd = pcap_open_dead(dlt, DUMMY_SNAPLENGTH);
2340 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
2341 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
2342 g_mutex_lock(pcap_compile_mtx);
2343 #ifdef PCAP_NETMASK_UNKNOWN
2344 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0) {
2346 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0) {
2348 g_mutex_unlock(pcap_compile_mtx);
2349 compile_results_win(g_strdup(pcap_geterr(pd)), 1);
2351 GString *bpf_code_dump = g_string_new("");
2352 struct bpf_insn *insn = fcode.bf_insns;
2353 int i, n = fcode.bf_len;
2355 gchar *bpf_code_str;
2357 g_mutex_unlock(pcap_compile_mtx);
2359 for (i = 0; i < n; ++insn, ++i) {
2360 g_string_append(bpf_code_dump, bpf_image(insn, i));
2361 g_string_append(bpf_code_dump, "\n");
2364 bpf_code_str = g_string_free(bpf_code_dump, FALSE);
2365 compile_results_win(g_strdup(bpf_code_str), 0);
2367 g_free(bpf_code_str);
2369 g_free(filter_text);
2373 #endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
2376 options_edit_destroy_cb(GtkWidget *win, gpointer user_data _U_)
2380 caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_EDIT_CALLER_PTR_KEY);
2381 g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, NULL);
2385 update_options_table(gint indx)
2390 GtkTreeModel *model;
2392 gchar *temp, *path_str, *snaplen_string, *linkname;
2394 link_row *linkr = NULL;
2397 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2399 if (!device.hidden) {
2400 if (device.no_addresses == 0) {
2401 temp = g_strdup_printf("<b>%s</b>", device.display_name);
2403 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
2406 for (list=device.links; list!=NULL; list=g_list_next(list))
2408 linkr = (link_row*)(list->data);
2409 if (linkr->dlt == device.active_dlt) {
2410 linkname = g_strdup(linkr->name);
2415 linkname = g_strdup("unknown");
2416 snaplen_string = g_strdup_printf("%d", device.snaplen);
2418 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
2419 path_str = g_strdup_printf("%d", indx);
2420 path = gtk_tree_path_new_from_string(path_str);
2421 model = gtk_tree_view_get_model(if_cb);
2422 gtk_tree_model_get_iter(model, &iter, path);
2423 gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1);
2424 if (enabled == FALSE) {
2425 device.selected = TRUE;
2426 global_capture_opts.num_selected++;
2427 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2428 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2430 #if defined(HAVE_PCAP_CREATE)
2431 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);
2432 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
2433 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);
2435 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);
2437 if (global_capture_opts.num_selected > 0) {
2438 gtk_widget_set_sensitive(ok_bt, TRUE);
2439 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2440 gtk_widget_set_sensitive(all_compile_bt, TRUE);
2443 gtk_widget_set_sensitive(ok_bt, FALSE);
2444 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2445 gtk_widget_set_sensitive(all_compile_bt, FALSE);
2448 gtk_tree_path_free (path);
2451 if (interfaces_dialog_window_present()) {
2452 update_selected_interface(g_strdup(device.name));
2454 if (get_welcome_window() != NULL) {
2455 change_interface_selection(g_strdup(device.name), device.selected);
2459 set_sensitivity_for_start_icon();
2464 save_options_cb(GtkWidget *win _U_, gpointer user_data _U_)
2466 GtkWidget *snap_cb, *snap_sb, *promisc_cb,
2467 #ifdef HAVE_PCAP_CREATE
2470 *filter_cm, *linktype_combo_box;
2471 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2472 GtkWidget *buffer_size_sb;
2476 gpointer ptr = NULL;
2480 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2481 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2482 snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
2483 snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
2484 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2485 buffer_size_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY);
2487 promisc_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY);
2488 #ifdef HAVE_PCAP_CREATE
2489 monitor_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY);
2491 filter_cm = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
2493 linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
2495 if (device.links != NULL) {
2496 if (ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
2497 /* Even though device.links != NULL, we might not have an active pointer
2498 * if all of the available links are unsupported, so the failure of
2499 * ws_combo_box_get_active_pointer() is not cause for
2500 * g_assert_not_reached().
2502 if (ptr != NULL && (dlt = GPOINTER_TO_INT(ptr)) == -1)
2503 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2506 device.active_dlt = dlt;
2507 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2508 device.buffer = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_sb));
2510 device.pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb));
2511 device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
2512 if (device.has_snaplen) {
2513 if (device.snaplen != (guint)gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb))) {
2515 device.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
2516 if (device.snaplen < 1)
2517 device.snaplen = WTAP_MAX_PACKET_SIZE;
2518 else if (device.snaplen < MIN_PACKET_SIZE)
2519 device.snaplen = MIN_PACKET_SIZE;
2521 device.snaplen = WTAP_MAX_PACKET_SIZE;
2523 filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(filter_cm));
2525 g_free(device.cfilter);
2526 g_assert(filter_text != NULL);
2527 device.cfilter = filter_text;
2528 #ifdef HAVE_PCAP_CREATE
2529 /* if dumpcap reported that the interface does not support monitor
2530 mode, we disable monitor mode even if the user explicitly selected it */
2531 device.monitor_mode_enabled = device.monitor_mode_supported ?
2532 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor_cb)) : FALSE;
2534 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2535 window_destroy(opt_edit_w);
2536 update_options_table(marked_row);
2537 update_properties_all();
2541 adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_)
2543 GtkWidget *snap_cb, *snap_sb;
2546 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2547 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2549 snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
2550 snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
2552 /* The snapshot length spinbox is sensitive if the "Limit each packet
2553 to" checkbox is on. */
2554 gtk_widget_set_sensitive(GTK_WIDGET(snap_sb),
2555 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)));
2556 device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
2557 if (!device.has_snaplen) {
2558 gtk_spin_button_set_value(GTK_SPIN_BUTTON (snap_sb), WTAP_MAX_PACKET_SIZE);
2559 device.snaplen = WTAP_MAX_PACKET_SIZE;
2561 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2564 void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata)
2566 GtkWidget *caller, *window, *swindow = NULL, *if_view,
2567 *main_vb, *if_hb, *if_lb, *if_lb_name,
2569 #if defined (HAVE_AIRPCAP) || defined (HAVE_PCAP_REMOTE) || defined (HAVE_PCAP_CREATE)
2572 *capture_fr, *capture_vb,
2573 *if_ip_hb, *if_ip_lb = NULL, *if_ip_name,
2574 *if_vb_left, *if_vb_right,
2575 *linktype_hb, *linktype_lb, *linktype_combo_box,
2576 *snap_hb, *snap_cb, *snap_sb, *snap_lb,
2578 #ifdef HAVE_PCAP_CREATE
2581 *filter_hb, *filter_bt, *filter_te, *filter_cm,
2582 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2585 *bbox, *ok_but, *cancel_bt,
2587 GList *cf_entry, *list, *cfilter_list;
2588 GtkAdjustment *snap_adj;
2589 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2590 GtkAdjustment *buffer_size_adj;
2591 GtkWidget *buffer_size_lb, *buffer_size_sb, *buffer_size_hb;
2593 #ifdef HAVE_PCAP_REMOTE
2594 GtkWidget *remote_bt;
2597 GtkWidget *advanced_bt;
2600 GtkTreeModel *model;
2603 gboolean found = FALSE;
2604 gint num_link_types, num_supported_link_types, first_supported_index;
2607 GtkCellRenderer *renderer;
2608 GtkListStore *store;
2609 const gchar *new_cfilter;
2611 window = (GtkWidget *)userdata;
2612 caller = gtk_widget_get_toplevel(GTK_WIDGET(window));
2613 opt_edit_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY);
2614 if (opt_edit_w != NULL) {
2615 reactivate_window(opt_edit_w);
2620 device.display_name = NULL;
2621 device.no_addresses = 0;
2622 device.addresses = NULL;
2623 device.links = NULL;
2624 device.active_dlt = -1;
2625 device.pmode = FALSE;
2626 #ifdef HAVE_PCAP_CREATE
2627 device.monitor_mode_enabled = FALSE;
2628 device.monitor_mode_supported = FALSE;
2630 device.has_snaplen = FALSE;
2631 device.snaplen = 65535;
2632 device.cfilter = NULL;
2633 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2634 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
2637 model = gtk_tree_view_get_model(view);
2638 gtk_tree_model_get_iter (model, &iter, path);
2640 if (window == get_welcome_window()) {
2641 gtk_tree_model_get(model, &iter, IFACE_NAME, &name, -1);
2642 } else if (window == cap_open_w) {
2643 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name, -1);
2648 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
2649 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
2650 if (strcmp(device.name, name) == 0) {
2651 marked_interface = i;
2655 marked_row = atoi(gtk_tree_path_to_string(path));
2656 opt_edit_w = dlg_window_new("Edit Interface Settings");
2657 gtk_window_set_modal(GTK_WINDOW(opt_edit_w), TRUE);
2658 gtk_window_set_type_hint (GTK_WINDOW (opt_edit_w), GDK_WINDOW_TYPE_HINT_DIALOG);
2659 g_object_set_data(G_OBJECT(opt_edit_w), E_OPT_EDIT_CALLER_PTR_KEY, caller);
2660 g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, opt_edit_w);
2662 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2663 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
2664 gtk_container_add(GTK_CONTAINER(opt_edit_w), main_vb);
2666 /* Capture-related options frame */
2667 capture_fr = gtk_frame_new("Capture");
2668 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
2670 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2671 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
2672 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
2675 if_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2676 gtk_box_pack_start(GTK_BOX(capture_vb), if_hb, FALSE, FALSE, 3);
2678 if_lb = gtk_label_new("Interface: ");
2679 gtk_box_pack_start(GTK_BOX(if_hb), if_lb, FALSE, FALSE, 3);
2681 if_lb_name = gtk_label_new(device.display_name);
2682 gtk_box_pack_start(GTK_BOX(if_hb), if_lb_name, FALSE, FALSE, 3);
2684 /* IP addresses row */
2685 if_ip_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2687 gtk_widget_set_tooltip_text(if_ip_hb, "Lists the IP address(es) "
2688 "assigned to the selected interface. ");
2689 if_vb_left = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2690 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_left, FALSE, FALSE, 3);
2691 if_vb_right = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2693 if_ip_lb = gtk_label_new("IP address:");
2694 gtk_misc_set_alignment(GTK_MISC(if_ip_lb), 0, 0); /* Left justified */
2695 gtk_box_pack_start(GTK_BOX(if_vb_left), if_ip_lb, FALSE, FALSE, 0);
2696 if (device.no_addresses > 0) {
2697 gchar *temp_addresses = g_strdup(device.addresses);
2698 gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, TRUE, TRUE, 0);
2699 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, TRUE, TRUE, 3);
2700 swindow = gtk_scrolled_window_new (NULL, NULL);
2701 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
2702 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2703 gtk_widget_set_size_request(GTK_WIDGET(swindow),-1, 50);
2704 if_view = gtk_tree_view_new ();
2705 g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL);
2706 renderer = gtk_cell_renderer_text_new();
2707 column = gtk_tree_view_column_new_with_attributes ("",
2708 GTK_CELL_RENDERER(renderer),
2711 gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
2712 store = gtk_list_store_new(1, G_TYPE_STRING);
2713 for (tok = strtok (temp_addresses, "\n"); tok; tok = strtok(NULL, "\n")) {
2714 gtk_list_store_append (store, &iter);
2715 gtk_list_store_set (store, &iter, 0, tok, -1);
2717 gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
2718 gtk_container_add (GTK_CONTAINER (swindow), if_view);
2719 gtk_box_pack_start(GTK_BOX(if_vb_right), swindow, TRUE, TRUE, 0);
2720 g_free(temp_addresses);
2722 gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, FALSE, FALSE, 0);
2723 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, FALSE, FALSE, 3);
2724 if_ip_name = gtk_label_new("none");
2725 gtk_misc_set_alignment(GTK_MISC(if_ip_name), 0, 0); /* Left justified */
2726 gtk_box_pack_start(GTK_BOX(if_vb_right), if_ip_name, FALSE, FALSE, 0);
2728 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
2729 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
2730 gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 3);
2732 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2733 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
2734 gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
2736 #if defined (HAVE_AIRPCAP) || defined (HAVE_PCAP_REMOTE) || defined (HAVE_PCAP_CREATE)
2737 /* Avoid adding the right vbox if not needed, because it steals 3 pixels */
2738 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2739 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
2740 gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 3);
2744 linktype_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2745 gtk_box_pack_start(GTK_BOX(left_vb), linktype_hb, FALSE, FALSE, 0);
2747 linktype_lb = gtk_label_new("Link-layer header type:");
2748 gtk_box_pack_start(GTK_BOX(linktype_hb), linktype_lb, FALSE, FALSE, 3);
2750 linktype_combo_box = ws_combo_box_new_text_and_pointer();
2751 g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY, linktype_lb);
2752 /* Default to "use the default" */
2753 /* Datalink menu index is not reset; it will be restored with last used value */
2755 g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_IFACE_IP_KEY, if_ip_lb);
2757 * XXX - in some cases, this is "multiple link-layer header types", e.g.
2758 * some 802.11 interfaces on FreeBSD 5.2 and later, where you can request
2759 * fake Ethernet, 802.11, or 802.11-plus-radio-information headers.
2761 * In other cases, it's "multiple link-layer types", e.g., with recent
2762 * versions of libpcap, a DAG card on an "HDLC" WAN, where you can
2763 * request Cisco HDLC or PPP depending on what type of traffic is going
2764 * over the WAN, or an Ethernet interface, where you can request Ethernet
2765 * or DOCSIS, the latter being for some Cisco cable modem equipment that
2766 * can be configured to send raw DOCSIS frames over an Ethernet inside
2767 * Ethernet low-level framing, for traffic capture purposes.
2769 * We leave it as "multiple link-layer types" for now.
2771 gtk_widget_set_tooltip_text(linktype_combo_box, "The selected interface supports multiple link-layer types; select the desired one.");
2772 gtk_box_pack_start (GTK_BOX(linktype_hb), linktype_combo_box, FALSE, FALSE, 0);
2773 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY, linktype_combo_box);
2775 num_supported_link_types = 0;
2776 first_supported_index = -1;
2777 for (list=device.links; list!=NULL; list=g_list_next(list))
2779 temp = (link_row*)(list->data);
2780 if (temp->dlt == -1)
2782 ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
2785 GINT_TO_POINTER(-1), /* Flag as "not supported" */
2790 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
2792 GINT_TO_POINTER(temp->dlt));
2793 /* Record the index of the first supported link type (and thus the first
2794 * one in the list to be active) for use determining the default selected
2796 if (first_supported_index == -1)
2798 first_supported_index = num_link_types;
2800 if (temp->dlt == device.active_dlt)
2802 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box), num_link_types);
2805 num_supported_link_types++;
2809 gtk_widget_set_sensitive(linktype_lb, num_link_types >= 2);
2810 gtk_widget_set_sensitive(linktype_combo_box, num_link_types >= 2);
2811 if (!found && first_supported_index >= 0)
2813 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),first_supported_index);
2815 g_signal_connect(linktype_combo_box, "changed", G_CALLBACK(select_link_type_cb), NULL);
2817 /* Promiscuous mode row */
2818 promisc_cb = gtk_check_button_new_with_mnemonic(
2819 "Capture packets in _promiscuous mode");
2820 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
2822 gtk_widget_set_tooltip_text(promisc_cb,
2823 "Usually a network adapter will only capture the traffic sent to its own network address. "
2824 "If you want to capture all traffic that the network adapter can \"see\", mark this option. "
2825 "See the FAQ for some more details of capturing packets from a switched network.");
2826 gtk_box_pack_start (GTK_BOX(left_vb), promisc_cb, FALSE, FALSE, 0);
2827 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY, promisc_cb);
2829 #ifdef HAVE_PCAP_CREATE
2830 /* Monitor mode row */
2831 monitor_cb = gtk_check_button_new_with_mnemonic( "Capture packets in monitor mode");
2832 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb), device.monitor_mode_enabled);
2833 gtk_widget_set_sensitive(monitor_cb, device.monitor_mode_supported);
2834 g_signal_connect(monitor_cb, "toggled", G_CALLBACK(capture_prep_monitor_changed_cb), NULL);
2836 gtk_widget_set_tooltip_text(monitor_cb,
2837 "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture the traffic on the BSS to which it's associated. "
2838 "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", mark this option. "
2839 "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
2840 "it might be necessary to turn this option on.\n\n"
2841 "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
2842 gtk_box_pack_start (GTK_BOX(left_vb), monitor_cb, FALSE, FALSE, 0);
2844 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY, monitor_cb);
2848 * This controls the sensitivity of both the link-type list and, if
2849 * you have it, the monitor mode checkbox. That's why we do this
2853 /* Capture length row */
2854 snap_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2855 gtk_box_pack_start (GTK_BOX(left_vb), snap_hb, FALSE, FALSE, 0);
2857 snap_cb = gtk_check_button_new_with_mnemonic("_Limit each packet to");
2858 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(snap_cb),
2859 device.has_snaplen);
2860 g_signal_connect(snap_cb, "toggled", G_CALLBACK(adjust_snap_sensitivity), NULL);
2861 gtk_widget_set_tooltip_text(snap_cb,
2862 "Limit the maximum number of bytes to be captured from each packet. This size includes the "
2863 "link-layer header and all subsequent headers. ");
2864 gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0);
2866 snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.snaplen,
2867 MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE, 1.0, 10.0, 0.0);
2868 snap_sb = gtk_spin_button_new (snap_adj, 0, 0);
2869 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE);
2870 gtk_widget_set_size_request(snap_sb, 80, -1);
2871 gtk_box_pack_start (GTK_BOX(snap_hb), snap_sb, FALSE, FALSE, 0);
2873 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY, snap_cb);
2874 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY, snap_sb);
2875 snap_lb = gtk_label_new("bytes");
2876 gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5f);
2877 gtk_box_pack_start(GTK_BOX(snap_hb), snap_lb, FALSE, FALSE, 0);
2878 gtk_widget_set_sensitive(GTK_WIDGET(snap_sb), device.has_snaplen);
2881 filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2882 gtk_box_pack_start(GTK_BOX(capture_vb), filter_hb, FALSE, FALSE, 0);
2884 filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
2885 g_signal_connect(filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
2886 g_signal_connect(filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
2887 gtk_widget_set_tooltip_text(filter_bt,
2888 "Select a capture filter to reduce the amount of packets to be captured. "
2889 "See \"Capture Filters\" in the online help for further information how to use it."
2891 gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, FALSE, 3);
2893 /* Create the capture filter combo box*/
2894 filter_cm = gtk_combo_box_text_new_with_entry();
2895 g_object_set_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY, filter_cm);
2896 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
2897 colorize_filter_te_as_empty(filter_te);
2898 g_signal_connect(filter_te, "changed", G_CALLBACK(capture_filter_check_syntax_cb), NULL);
2899 g_signal_connect(filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
2901 cfilter_list = recent_get_cfilter_list(name);
2902 for (cf_entry = cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
2903 new_cfilter = (const gchar *)cf_entry->data;
2904 /* If this is the current dfilter or the default cfilter, don't put
2905 it in the list, as it'll be added later. */
2906 if ((device.cfilter == NULL || strcmp(device.cfilter, new_cfilter) != 0) &&
2907 (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0)) {
2908 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), new_cfilter);
2911 if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
2912 /* If this is the current dfilter, don't put it in the list, as it'll be
2914 if (device.cfilter == NULL || strcmp(device.cfilter, global_capture_opts.default_options.cfilter) != 0) {
2915 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), global_capture_opts.default_options.cfilter);
2918 if (device.cfilter && (strlen(device.cfilter) > 0)) {
2919 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), device.cfilter);
2920 gtk_combo_box_set_active(GTK_COMBO_BOX(filter_cm), 0);
2923 gtk_widget_set_tooltip_text(filter_cm,
2924 "Enter a capture filter to reduce the amount of packets to be captured. "
2925 "See \"Capture Filters\" in the online help for further information how to use it. "
2926 "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
2928 gtk_box_pack_start(GTK_BOX(filter_hb), filter_cm, TRUE, TRUE, 3);
2930 /* let an eventually capture filters dialog know the text entry to fill in */
2931 g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
2933 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2934 compile_bt = gtk_button_new_with_label("Compile BPF");
2935 g_signal_connect(compile_bt, "clicked", G_CALLBACK(capture_filter_compile_cb), NULL);
2936 gtk_widget_set_tooltip_text(compile_bt,
2937 "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
2938 /* We can't compile without any supported link-types, so disable the button in that case */
2939 gtk_widget_set_sensitive(compile_bt, (num_supported_link_types >= 1));
2940 gtk_box_pack_start(GTK_BOX(filter_hb), compile_bt, FALSE, FALSE, 3);
2943 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2944 buffer_size_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2945 buffer_size_lb = gtk_label_new("Buffer size:");
2946 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 0);
2948 buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.buffer,
2949 1, 65535, 1.0, 10.0, 0.0);
2950 buffer_size_sb = gtk_spin_button_new (buffer_size_adj, 0, 0);
2951 gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) device.buffer);
2952 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (buffer_size_sb), TRUE);
2953 gtk_widget_set_size_request(buffer_size_sb, 80, -1);
2954 gtk_widget_set_tooltip_text(buffer_size_sb,
2955 "The memory buffer size used while capturing. If you notice packet drops, you can try to increase this size.");
2956 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_sb, FALSE, FALSE, 0);
2957 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY, buffer_size_sb);
2958 buffer_size_lb = gtk_label_new("mebibyte(s)");
2959 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 3);
2960 gtk_misc_set_alignment(GTK_MISC(buffer_size_lb), 1, 0);
2961 #ifdef HAVE_PCAP_REMOTE
2962 gtk_box_pack_start (GTK_BOX(left_vb), buffer_size_hb, FALSE, FALSE, 0);
2964 gtk_box_pack_start (GTK_BOX(right_vb), buffer_size_hb, FALSE, FALSE, 0);
2968 #ifdef HAVE_PCAP_REMOTE
2970 * *IF* this is a remote interface, add the "Remote Settings"
2971 * button. Do *not* add it for other interfaces, as that could
2972 * lead users to believe that it could somehow be enabled.
2974 /* Both the callback and the data are global */
2975 if (strncmp (device.name, "rpcap://", 8) == 0) {
2976 remote_bt = gtk_button_new_with_label("Remote Settings");
2977 gtk_widget_set_tooltip_text(remote_bt, "Various settings for remote capture.");
2979 g_signal_connect(remote_bt, "clicked", G_CALLBACK(options_remote_cb), NULL);
2981 gtk_box_pack_start(GTK_BOX(right_vb), remote_bt, FALSE, FALSE, 0);
2982 gtk_widget_show(remote_bt);
2988 * *IF* this is an AirPcap interface, add the "Wireless Settings"
2989 * button. Do *not* add it for other interfaces, as that can
2990 * confuse users, so that they ask why this is grayed out on
2991 * their non-Windows machine and ask how to enable it.
2993 airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list, device.name);
2994 if (airpcap_if_selected != NULL) {
2995 advanced_bt = gtk_button_new_with_label("Wireless Settings");
2997 /* Both the callback and the data are global */
2998 g_signal_connect(advanced_bt,"clicked", G_CALLBACK(options_airpcap_advanced_cb), wireless_tb);
3000 gtk_box_pack_start(GTK_BOX(right_vb), advanced_bt, FALSE, FALSE, 0);
3001 gtk_widget_show(advanced_bt);
3005 /* Button row: "Start", "Cancel" and "Help" buttons */
3006 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
3007 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
3009 ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
3010 g_signal_connect(ok_but, "clicked", G_CALLBACK(save_options_cb), NULL);
3011 gtk_widget_set_tooltip_text(ok_but,
3012 "Accept interface settings.");
3013 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
3014 gtk_widget_set_tooltip_text(cancel_bt,
3015 "Cancel and exit dialog.");
3016 window_set_cancel_button(opt_edit_w, cancel_bt, window_cancel_button_cb);
3017 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
3018 gtk_widget_set_tooltip_text(help_bt,
3019 "Show help about capturing.");
3020 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_OPTIONS_DIALOG);
3021 dlg_set_activate(filter_te, ok_but);
3022 gtk_widget_grab_focus(filter_te);
3023 g_signal_connect(opt_edit_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
3024 g_signal_connect(opt_edit_w, "destroy", G_CALLBACK(options_edit_destroy_cb), NULL);
3025 gtk_widget_show_all(opt_edit_w);
3026 window_present(opt_edit_w);
3029 static void toggle_callback(GtkCellRendererToggle *cell _U_,
3033 /* get the treemodel from somewhere */
3036 GtkTreeModel *model;
3037 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3039 GtkWidget *pcap_ng_cb, *filter_cm;
3045 /* Initialise device */
3046 device.locked = FALSE;
3047 device.cfilter = NULL;
3049 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3050 model = gtk_tree_view_get_model(if_cb);
3051 gtk_tree_model_get_iter (model, &iter, path);
3052 gtk_tree_model_get (model, &iter, CAPTURE, &enabled, IFACE_HIDDEN_NAME, &name, -1);
3053 /* Look for the right interface. The number of interfaces shown might be less
3054 * than the real number. Therefore the path index does not correspond
3055 * necessarily to the position in the list */
3056 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3057 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3058 if (strcmp(device.name, name) == 0) {
3063 if (!device.locked) {
3064 if (enabled == FALSE) {
3065 device.selected = TRUE;
3066 global_capture_opts.num_selected++;
3068 device.selected = FALSE;
3069 global_capture_opts.num_selected--;
3071 device.locked = TRUE;
3074 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
3075 g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
3076 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
3077 if (global_capture_opts.num_selected >= 2) {
3078 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
3079 gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
3081 gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
3083 if (global_capture_opts.num_selected > 0) {
3084 gtk_widget_set_sensitive(ok_bt, TRUE);
3085 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3086 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3089 gtk_widget_set_sensitive(ok_bt, FALSE);
3090 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3091 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3094 /* do something with the new enabled value, and set the new
3095 enabled value in your treemodel */
3096 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, -1);
3097 if (interfaces_dialog_window_present()) {
3098 update_selected_interface(g_strdup(device.name));
3100 if (get_welcome_window() != NULL) {
3101 change_interface_selection(g_strdup(device.name), device.selected);
3104 if (device.cfilter != NULL) {
3105 g_free(device.cfilter);
3106 device.cfilter = NULL;
3107 update_filter_string(device.name, NULL);
3109 device.locked = FALSE;
3110 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
3111 g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
3112 gtk_tree_path_free (path);
3113 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
3114 if (strcmp(gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm)),"") != 0) {
3115 capture_all_filter_check_syntax_cb(NULL, NULL);
3117 update_properties_all();
3120 void enable_selected_interface(gchar *name, gboolean selected)
3124 GtkTreeModel *model;
3127 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3128 model = gtk_tree_view_get_model(if_cb);
3129 gtk_tree_model_get_iter_first(model, &iter);
3131 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
3132 if (strcmp(name, name_str) == 0) {
3133 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, selected, -1);
3137 while (gtk_tree_model_iter_next(model, &iter));
3138 if (global_capture_opts.num_selected > 0) {
3139 gtk_widget_set_sensitive(ok_bt, TRUE);
3140 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3141 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3144 gtk_widget_set_sensitive(ok_bt, FALSE);
3145 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3146 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3152 static void capture_all_cb(GtkToggleButton *button, gpointer d _U_)
3156 GtkTreeModel *model;
3157 GtkWidget *filter_cm, *pcap_ng_cb;
3158 gchar *interface = NULL, *filter_text = NULL;
3159 gboolean enabled = FALSE, capture_set = FALSE, pseudo = FALSE;
3160 guint16 num_temp, i;
3163 if (gtk_toggle_button_get_active(button))
3165 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3166 model = gtk_tree_view_get_model(if_cb);
3167 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
3168 num_temp = global_capture_opts.num_selected++;
3169 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
3170 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
3171 if (gtk_tree_model_get_iter_first(model, &iter)) {
3173 gtk_tree_model_get (model, &iter, CAPTURE, &capture_set, IFACE_HIDDEN_NAME, &interface, -1);
3174 if (strcmp(interface, "any") == 0) {
3177 if (!capture_set && enabled && !pseudo) {
3179 } else if (capture_set && (!enabled || (enabled && pseudo))) {
3183 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, enabled, -1);
3184 if (strlen(filter_text) != 0) {
3185 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3186 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3187 if (strcmp(device.name, interface) == 0) {
3188 g_array_remove_index(global_capture_opts.all_ifaces, i);
3189 device.cfilter = g_strdup(filter_text);
3190 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3191 update_filter_string(device.name, filter_text);
3196 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, -1);
3199 } while (gtk_tree_model_iter_next(model, &iter));
3201 if (num_temp >= 2) {
3202 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
3203 gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
3204 } else if (num_temp <= 1) {
3205 gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
3207 if (interfaces_dialog_window_present()) {
3208 select_all_interfaces(enabled);
3210 if (get_welcome_window() != NULL) {
3211 change_selection_for_all(enabled);
3213 if (global_capture_opts.num_selected != num_temp) {
3214 global_capture_opts.num_selected = num_temp;
3216 if (global_capture_opts.num_selected > 0) {
3217 gtk_widget_set_sensitive(ok_bt, TRUE);
3218 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3219 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3222 gtk_widget_set_sensitive(ok_bt, FALSE);
3223 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3224 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3227 set_sensitivity_for_start_icon();
3231 static gboolean get_all_prom_mode(void)
3233 interface_options interface_opts;
3236 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
3237 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
3238 if (!interface_opts.promisc_mode) {
3245 static void promisc_mode_callback(GtkToggleButton *button, gpointer d _U_)
3249 GtkTreeModel *model;
3250 gboolean enabled = FALSE;
3252 interface_options interface_opts;
3255 if (gtk_toggle_button_get_active(button))
3258 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3259 model = gtk_tree_view_get_model(if_cb);
3260 if (gtk_tree_model_get_iter_first(model, &iter)) {
3262 gtk_list_store_set(GTK_LIST_STORE(model), &iter, PMODE, enabled?"enabled":"disabled", -1);
3263 } while (gtk_tree_model_iter_next(model, &iter));
3266 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3267 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3268 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
3269 device.pmode = (enabled?TRUE:FALSE);
3270 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3273 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
3274 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
3275 global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
3276 interface_opts.promisc_mode = (enabled?TRUE:FALSE);
3277 g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
3281 #if defined (HAVE_PCAP_REMOTE)
3283 show_remote_dialog(GtkWidget *w)
3286 g_free(global_remote_opts.remote_host_opts.remote_host);
3287 g_free(global_remote_opts.remote_host_opts.remote_port);
3288 g_free(global_remote_opts.remote_host_opts.auth_username);
3289 g_free(global_remote_opts.remote_host_opts.auth_password);
3290 global_remote_opts.src_type = CAPTURE_IFREMOTE;
3291 global_remote_opts.remote_host_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
3292 global_remote_opts.remote_host_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
3293 global_remote_opts.remote_host_opts.auth_type = global_capture_opts.default_options.auth_type;
3294 global_remote_opts.remote_host_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
3295 global_remote_opts.remote_host_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
3296 global_remote_opts.remote_host_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
3297 global_remote_opts.remote_host_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
3298 global_remote_opts.remote_host_opts.nocap_local = global_capture_opts.default_options.nocap_local;
3299 #ifdef HAVE_PCAP_SETSAMPLING
3300 global_remote_opts.sampling_method = global_capture_opts.default_options.sampling_method;
3301 global_remote_opts.sampling_param = global_capture_opts.default_options.sampling_param;
3303 capture_remote_cb(GTK_WIDGET(w), FALSE);
3307 static void change_pipe_name_cb(gpointer dialog _U_, gint btn, gpointer data)
3311 gchar *temp, *optname, *snaplen_string/*, *oldname = ""*/;
3313 GtkTreeModel *model;
3319 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3320 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3321 if (strcmp((gchar *)data, device.name) == 0) {
3322 simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
3323 "%sA pipe with this name already exists.%s",
3324 simple_dialog_primary_start(), simple_dialog_primary_end());
3325 if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3326 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3327 model = gtk_tree_view_get_model(if_cb);
3328 if (gtk_tree_model_get_iter_first (model, &iter)) {
3330 gtk_tree_model_get(model, &iter, 0, &optname, -1);
3331 if (strcmp(optname, (gchar *) data) == 0) {
3332 gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
3333 gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
3336 } while (gtk_tree_model_iter_next(model, &iter));
3342 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3343 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3344 if (strcmp(pipe_name, device.name) == 0) {
3345 device.name = g_strdup((gchar *)data);
3346 device.display_name = g_strdup_printf("%s", device.name);
3347 g_array_remove_index(global_capture_opts.all_ifaces, i);
3348 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3349 temp = g_strdup_printf("<b>%s</b>", device.display_name);
3350 snaplen_string = g_strdup_printf("%d", device.snaplen);
3351 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3352 model = gtk_tree_view_get_model(if_cb);
3353 if (gtk_tree_model_get_iter_first (model, &iter)) {
3355 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &optname, -1);
3356 if (strcmp(optname, pipe_name) == 0) {
3357 #if defined(HAVE_PCAP_CREATE)
3358 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);
3359 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
3360 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);
3362 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);
3365 oldname = g_strdup(pipe_name);
3367 pipe_name = g_strdup(device.name);
3370 } while (gtk_tree_model_iter_next(model, &iter));
3374 if (global_capture_opts.num_selected > 0) {
3375 gtk_widget_set_sensitive(ok_bt, TRUE);
3376 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3377 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3380 gtk_widget_set_sensitive(ok_bt, FALSE);
3381 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3382 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3385 refresh_non_local_interface_lists();
3390 case(ESD_BTN_CANCEL): {
3391 if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3392 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3393 model = gtk_tree_view_get_model(if_cb);
3395 if (gtk_tree_model_get_iter_first (model, &iter)) {
3397 gtk_tree_model_get(model, &iter, 0, &optname, -1);
3398 if (strcmp(optname, (gchar *) data) == 0) {
3399 gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
3400 gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
3403 } while (gtk_tree_model_iter_next(model, &iter));
3409 g_assert_not_reached();
3414 add_pipe_cb(gpointer w _U_)
3419 GtkTreeModel *model;
3421 gchar *temp, *path_str, *snaplen_string;
3423 const gchar *g_save_file;
3431 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3432 g_save_file = gtk_entry_get_text(GTK_ENTRY(pipe_te));
3433 name = g_strdup(g_save_file);
3434 if (strcmp(name, "New pipe") == 0 || strcmp(name, "") == 0) {
3438 if (strcmp(pipe_name, "New pipe") != 0) {
3439 if (strcmp(pipe_name, name) != 0) {
3440 dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_OK_CANCEL,
3441 "%sDo you want to change %s to %s?%s",
3442 simple_dialog_primary_start(), pipe_name, name, simple_dialog_primary_end());
3443 simple_dialog_set_cb(dialog, change_pipe_name_cb, name);
3446 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3447 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3448 if (strcmp(name, device.name) == 0) {
3453 pipe_name = g_strdup(g_save_file);
3454 device.name = g_strdup(g_save_file);
3455 device.display_name = g_strdup_printf("%s", device.name);
3456 device.hidden = FALSE;
3457 device.selected = TRUE;
3458 device.type = IF_PIPE;
3459 device.pmode = global_capture_opts.default_options.promisc_mode;
3460 device.has_snaplen = global_capture_opts.default_options.has_snaplen;
3461 device.snaplen = global_capture_opts.default_options.snaplen;
3462 device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
3463 device.addresses = NULL;
3464 device.no_addresses = 0;
3465 device.last_packets = 0;
3466 device.links = NULL;
3467 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
3468 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
3470 device.active_dlt = -1;
3471 device.locked = FALSE;
3472 device.if_info.name = g_strdup(g_save_file);
3473 device.if_info.friendly_name = NULL;
3474 device.if_info.vendor_description = NULL;
3475 device.if_info.addrs = NULL;
3476 device.if_info.loopback = FALSE;
3477 device.if_info.type = IF_PIPE;
3478 #if defined(HAVE_PCAP_CREATE)
3479 device.monitor_mode_enabled = FALSE;
3480 device.monitor_mode_supported = FALSE;
3482 global_capture_opts.num_selected++;
3484 indx = global_capture_opts.all_ifaces->len;
3485 temp = g_strdup_printf("<b>%s</b>", device.display_name);
3487 snaplen_string = g_strdup_printf("%d", device.snaplen);
3489 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3490 path_str = g_strdup_printf("%d", indx);
3491 model = gtk_tree_view_get_model(if_cb);
3492 gtk_tree_model_get_iter_from_string(model, &iter, path_str);
3493 g_array_append_val(global_capture_opts.all_ifaces, device);
3494 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
3495 #if defined(HAVE_PCAP_CREATE)
3496 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);
3497 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
3498 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);
3500 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);
3502 if (global_capture_opts.num_selected > 0) {
3503 gtk_widget_set_sensitive(ok_bt, TRUE);
3504 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3505 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3508 gtk_widget_set_sensitive(ok_bt, FALSE);
3509 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3510 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3514 /* Refresh all places that are displaying an interface list
3515 that includes interfaces other than local interfaces
3517 refresh_non_local_interface_lists();
3524 pipe_new_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
3526 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3527 GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3528 GtkListStore *store;
3531 /* Add a new entry to the pipe list. */
3533 store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
3534 gtk_list_store_append(store, &iter);
3536 gtk_list_store_set(store, &iter, 0, "New pipe", -1);
3537 pipe_name = "New pipe";
3539 /* Select the item. */
3540 gtk_tree_selection_select_iter(gtk_tree_view_get_selection(pipe_l), &iter);
3542 gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
3544 gtk_widget_grab_focus(name_te);
3548 pipe_del_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
3550 GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
3551 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3552 GtkTreeSelection *sel;
3553 GtkTreeModel *model, *optmodel;
3554 GtkTreeIter iter, optiter;
3556 gchar *name, *optname = NULL;
3559 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
3560 /* If something was selected */
3562 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3563 gtk_tree_model_get(model, &iter, 0, &name, -1);
3564 if (name != NULL && atoi(gtk_tree_model_get_string_from_iter(model, &iter)) < (gint)global_capture_opts.all_ifaces->len) {
3565 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3566 if (strcmp(g_array_index(global_capture_opts.all_ifaces, interface_t, i).name, name) == 0) {
3567 g_array_remove_index(global_capture_opts.all_ifaces, i);
3571 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
3572 gtk_entry_set_text(GTK_ENTRY(name_te), "");
3573 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3574 optmodel = gtk_tree_view_get_model(if_cb);
3575 if (gtk_tree_model_get_iter_first (optmodel, &optiter)) {
3577 gtk_tree_model_get(optmodel, &optiter, IFACE_HIDDEN_NAME, &optname, -1);
3578 if (optname != NULL && strcmp(optname, name) == 0) {
3579 gtk_list_store_remove(GTK_LIST_STORE(gtk_tree_view_get_model(if_cb)), &optiter);
3582 } while (gtk_tree_model_iter_next(optmodel, &optiter));
3589 if (gtk_tree_model_get_iter_first (model, &iter)) {
3590 gtk_tree_selection_select_iter(sel, &iter);
3592 gtk_widget_set_sensitive(name_te, FALSE);
3595 /* Refresh all places that are displaying an interface list
3596 that includes interfaces other than local interfaces
3598 refresh_non_local_interface_lists();
3602 pipe_name_te_changed_cb(GtkWidget *w _U_, gpointer data _U_)
3604 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3605 GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
3607 GtkTreeSelection *sel;
3608 GtkTreeModel *model;
3611 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
3612 name = gtk_entry_get_text(GTK_ENTRY(name_te));
3614 /* if something was selected */
3615 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3616 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, name, -1);
3621 fill_pipe_list(void)
3626 GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3627 GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
3629 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3630 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3631 if (device.type == IF_PIPE) {
3632 gtk_list_store_append(store, &iter);
3633 gtk_list_store_set(store, &iter, 0, device.name, -1);
3641 pipe_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
3643 /* GtkWidget *pipe_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));*/
3644 GtkTreeModel *model;
3646 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3647 GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY);
3650 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3651 gtk_tree_model_get(model, &iter, 0, &name, -1);
3653 if (name_te != NULL) {
3654 gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
3655 gtk_widget_set_sensitive(name_te, TRUE);
3656 selected_name = gtk_entry_get_text(GTK_ENTRY(name_te));
3657 pipe_name = g_strdup(selected_name);
3659 if (del_bt != NULL) {
3660 gtk_widget_set_sensitive(del_bt, TRUE);
3668 cancel_pipe_cb (gpointer w _U_)
3670 window_destroy(GTK_WIDGET(interface_management_w));
3675 fill_local_list(void)
3680 GtkListStore *store;
3681 GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3684 store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
3686 store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
3689 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3690 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3691 if (device.local && device.type != IF_PIPE && device.type != IF_STDIN) {
3692 gtk_list_store_append(store, &iter);
3695 gtk_list_store_set(store, &iter, 0, device.friendly_name, 1, device.name, 2, device.hidden, -1);
3697 gtk_list_store_set(store, &iter, 0, device.name, 1, device.hidden, -1);
3703 gtk_tree_view_set_model(GTK_TREE_VIEW(local_l), GTK_TREE_MODEL(store));
3706 static void local_hide_cb(GtkCellRendererToggle *cell _U_,
3710 gboolean hide, hide_enabled = TRUE;
3712 GtkTreeModel *model;
3714 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3715 GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3717 model = gtk_tree_view_get_model(local_l);
3718 gtk_tree_model_get_iter (model, &iter, path);
3719 gtk_tree_model_get (model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
3721 /* See if this is the currently selected capturing device */
3722 if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0')) {
3725 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3726 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3727 if ((strcmp(device.display_name, prefs.capture_device) == 0) &&
3728 (strcmp(device.name, name) == 0)) {
3729 /* Don't allow current interface to be hidden */
3730 hide_enabled = FALSE;
3738 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, FALSE, -1);
3740 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, TRUE, -1);
3743 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Default interface cannot be hidden");
3748 apply_local_cb(GtkWidget *win _U_, gpointer *data _U_)
3751 GtkTreeModel *model;
3752 gchar *name, *new_hide;
3754 gint first_if = TRUE;
3755 GtkTreeView *local_l;
3757 if (global_capture_opts.all_ifaces->len > 0) {
3758 local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3759 model = gtk_tree_view_get_model(local_l);
3761 new_hide = (gchar*)g_malloc0(MAX_VAL_LEN);
3763 if (gtk_tree_model_get_iter_first (model, &iter)) {
3765 gtk_tree_model_get(model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
3769 if (first_if != TRUE) {
3770 g_strlcat (new_hide, ",", MAX_VAL_LEN);
3772 g_strlcat (new_hide, name, MAX_VAL_LEN);
3775 } while (gtk_tree_model_iter_next(model, &iter));
3778 /* write new "hidden" string to preferences */
3779 g_free(prefs.capture_devices_hide);
3780 prefs.capture_devices_hide = new_hide;
3781 hide_interface(g_strdup(new_hide));
3783 /* Refresh all places that are displaying an interface list
3784 that includes local interfaces, in case we've changed
3785 a property of the interface list that changes how it's
3787 refresh_local_interface_lists();
3789 /* save changes to the preferences file */
3790 if (!prefs.gui_use_pref_save) {
3797 capture_dlg_refresh_if (void)
3801 if (interface_management_w)
3804 view = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3805 create_and_fill_model(GTK_TREE_VIEW(view));
3806 update_properties_all();
3810 * We've been asked to rescan the system looking for interfaces.
3813 rescan_local_cb(GtkWidget *button _U_, gpointer *data _U_)
3815 /* Refresh all places that are displaying an interface list
3816 that includes local interfaces. */
3817 refresh_local_interface_lists();
3820 #if defined(HAVE_PCAP_REMOTE)
3822 fill_remote_list(void)
3826 GtkTreeIter iter, child;
3828 GtkTreeView *remote_l;
3829 GtkTreeStore *store;
3832 remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3833 store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
3834 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3835 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3839 /* fill the store */
3840 if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) != 0) {
3841 host = g_strdup(device.remote_opts.remote_host_opts.remote_host);
3842 gtk_tree_store_append(store, &iter, NULL);
3843 gtk_tree_store_set(store, &iter, 0, host, 3, "FALSE", -1);
3844 gtk_tree_store_append(store, &child, &iter);
3845 gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
3847 gtk_tree_store_append(store, &child, &iter);
3848 gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
3852 gtk_tree_view_set_model(GTK_TREE_VIEW(remote_l), GTK_TREE_MODEL(store));
3853 gtk_tree_view_expand_all(GTK_TREE_VIEW(remote_l));
3857 button_hide_cb(GtkTreeViewColumn *column, GtkCellRenderer *renderer,
3858 GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
3862 gtk_tree_model_get(model, iter, 3, &enabled, -1);
3863 if (strcmp(enabled, "TRUE") == 0) {
3864 g_object_set(G_OBJECT(renderer), "visible", TRUE, NULL);
3865 } else if (strcmp(enabled, "FALSE") == 0){
3866 g_object_set(G_OBJECT(renderer), "visible", FALSE, NULL);
3870 static void remote_hide_cb(GtkCellRendererToggle *cell _U_,
3875 GtkTreeModel *model;
3877 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3878 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3880 model = gtk_tree_view_get_model(remote_l);
3881 gtk_tree_model_get_iter (model, &iter, path);
3882 gtk_tree_model_get (model, &iter, 2, &hide, -1);
3885 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, FALSE, -1);
3887 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, TRUE, -1);
3892 ok_remote_cb(GtkWidget *win _U_, gpointer *data _U_)
3894 GtkTreeIter iter, child;
3895 GtkTreeModel *model;
3896 gchar *name, *new_hide;
3898 gint first_if = TRUE;
3900 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3901 model = gtk_tree_view_get_model(remote_l);
3903 new_hide = g_malloc0(MAX_VAL_LEN);
3905 if (gtk_tree_model_get_iter_first (model, &iter)) {
3907 gtk_tree_model_get(model, &iter, 1, &name, 2, &hide, -1);
3908 if (!name && gtk_tree_model_iter_children(model, &child, &iter)) {
3910 gtk_tree_model_get(model, &child, 1, &name, 2, &hide, -1);
3914 if (first_if != TRUE) {
3915 g_strlcat (new_hide, ",", MAX_VAL_LEN);
3917 g_strlcat (new_hide, name, MAX_VAL_LEN);
3920 } while (gtk_tree_model_iter_next(model, &child));
3922 } while (gtk_tree_model_iter_next(model, &iter));
3925 hide_interface(g_strdup(new_hide));
3927 /* Refresh all places that are displaying an interface list
3928 that includes interfaces other than local interfaces
3929 (such as remote interfaces). */
3930 refresh_non_local_interface_lists();
3934 select_host_cb(GtkTreeSelection *selection _U_,
3935 GtkTreeModel *model,
3937 gboolean path_currently_selected _U_,
3942 gtk_tree_model_get_iter (model, &iter, path);
3943 if (gtk_tree_model_iter_has_child(model, &iter)) {
3945 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), TRUE);
3953 remove_remote_host(GtkWidget *w _U_, gpointer data _U_)
3955 GtkTreeIter iter, child;
3956 GtkTreeModel *model;
3958 gint num_children, i;
3960 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3961 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
3963 model = gtk_tree_view_get_model(remote_l);
3964 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
3965 gtk_tree_model_get(model, &iter, 0, &host, -1);
3966 if ((num_children = gtk_tree_model_iter_n_children(model, &iter)) > 0) {
3967 for (i = num_children-1; i >= 0; i--) {
3968 if (gtk_tree_model_iter_nth_child(model, &child, &iter, i)) {
3969 gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
3973 gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
3974 if (--num_selected == 0) {
3975 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
3977 for (i = global_capture_opts.all_ifaces->len-1; i >= 0; i--) {
3978 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3982 if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) == 0) {
3983 g_array_remove_index(global_capture_opts.all_ifaces, i);
3988 /* Refresh all places that are displaying an interface list
3989 that includes interfaces other than local interfaces
3990 (such as remote interfaces). */
3991 refresh_non_local_interface_lists();
3997 show_add_interfaces_dialog(GtkWidget *bt _U_, GtkWidget *parent_win)
3999 GtkWidget *vbox, *top_hb;
4000 GtkWidget *hbox, *bbox, *list_bb, *edit_fr, *pipe_fr, *pipe_sc, *pipe_l, *props_fr, *props_vb;
4002 GtkWidget *temp_page, *tmp;
4003 GtkWidget *pipe_hb, *pipe_bt, *pipe_lb, *pipe_te, *pipe_vb;
4004 GtkWidget *add_bt, *cancel_bt, *new_bt, *del_bt, *middle_hb;
4005 GtkWidget *local_fr, *local_l, *local_sc, *local_vb;
4006 GtkWidget *apply_bt, *refresh_bt;
4007 GtkCellRenderer *renderer, *toggle_renderer;
4008 GtkTreeViewColumn *column;
4009 GtkTreeSelection *sel;
4010 GtkListStore *store;
4011 #if defined(HAVE_PCAP_REMOTE)
4012 GtkWidget *remote_fr, *remote_l, *remote_sc, *remote_vb;
4013 GtkWidget *delete_bt, *add_but, *ok_but;
4014 GtkWidget *button_hbox, *help_hbox;
4015 GtkTreeSelection *selection;
4018 if (interface_management_w != NULL && G_IS_OBJECT(interface_management_w)) {
4019 /* There's already a "Manage Interfaces" dialog box; reactivate it. */
4020 reactivate_window(interface_management_w);
4024 interface_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Interface Management");
4025 gtk_window_set_transient_for(GTK_WINDOW(interface_management_w), GTK_WINDOW(parent_win));
4026 gtk_window_set_destroy_with_parent(GTK_WINDOW(interface_management_w), TRUE);
4028 gtk_window_set_default_size(GTK_WINDOW(interface_management_w), 700, 300);
4030 vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4031 gtk_container_add(GTK_CONTAINER(interface_management_w), vbox);
4032 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
4034 main_nb = gtk_notebook_new();
4035 gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
4038 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4039 tmp = gtk_label_new("Pipes");
4040 gtk_widget_show(tmp);
4041 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4042 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
4044 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4047 pipe_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20, FALSE);
4048 gtk_container_set_border_width(GTK_CONTAINER(pipe_hb), 5);
4049 gtk_box_pack_start(GTK_BOX(temp_page), pipe_hb, TRUE, TRUE, 0);
4051 /* Container for each row of widgets */
4052 pipe_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4053 gtk_container_set_border_width(GTK_CONTAINER(pipe_vb), 0);
4054 gtk_box_pack_start(GTK_BOX (pipe_hb), pipe_vb, TRUE, TRUE, 0);
4055 gtk_widget_show(pipe_vb);
4057 /* Top row: Buttons and pipe list */
4058 top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4059 gtk_box_pack_start(GTK_BOX (pipe_vb), top_hb, TRUE, TRUE, 0);
4060 gtk_widget_show(top_hb);
4062 edit_fr = gtk_frame_new("");
4063 gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
4064 gtk_widget_show(edit_fr);
4066 list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
4067 gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
4068 gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
4069 gtk_widget_show(list_bb);
4071 new_bt = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
4072 g_signal_connect(new_bt, "clicked", G_CALLBACK(pipe_new_bt_clicked_cb), NULL);
4073 gtk_widget_show(new_bt);
4074 gtk_box_pack_start (GTK_BOX (list_bb), new_bt, FALSE, FALSE, 0);
4075 gtk_widget_set_tooltip_text (new_bt, "Add a new pipe (with default properties)");
4077 del_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
4078 g_signal_connect(del_bt, "clicked", G_CALLBACK(pipe_del_bt_clicked_cb), NULL);
4079 gtk_widget_show(del_bt);
4080 gtk_widget_set_sensitive(del_bt, FALSE);
4081 gtk_box_pack_start (GTK_BOX (list_bb), del_bt, FALSE, FALSE, 0);
4082 gtk_widget_set_tooltip_text (del_bt, "Remove the selected pipe from the list");
4083 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY, del_bt);
4085 pipe_fr = gtk_frame_new("Pipes");
4086 gtk_box_pack_start(GTK_BOX(top_hb), pipe_fr, TRUE, TRUE, 0);
4087 gtk_widget_show(pipe_fr);
4089 pipe_sc = scrolled_window_new(NULL, NULL);
4090 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pipe_sc),
4093 gtk_container_set_border_width (GTK_CONTAINER (pipe_sc), 5);
4094 gtk_container_add(GTK_CONTAINER(pipe_fr), pipe_sc);
4095 gtk_widget_show(pipe_sc);
4097 store = gtk_list_store_new(1, G_TYPE_STRING);
4098 pipe_l = tree_view_new(GTK_TREE_MODEL(store));
4099 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pipe_l), FALSE);
4101 renderer = gtk_cell_renderer_text_new();
4102 column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
4103 gtk_tree_view_column_set_expand(column, TRUE);
4104 gtk_tree_view_column_set_sort_column_id(column, 0);
4105 gtk_tree_view_append_column(GTK_TREE_VIEW(pipe_l), column);
4107 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
4108 gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
4109 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY, pipe_l);
4110 g_signal_connect(sel, "changed", G_CALLBACK(pipe_sel_list_cb), pipe_vb);
4111 gtk_container_add(GTK_CONTAINER(pipe_sc), pipe_l);
4112 gtk_widget_show(pipe_l);
4116 g_object_unref(G_OBJECT(store));
4118 props_fr = gtk_frame_new("");
4119 gtk_box_pack_start(GTK_BOX(pipe_vb), props_fr, FALSE, FALSE, 0);
4120 gtk_widget_show(props_fr);
4122 props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4123 gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
4124 gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
4125 gtk_widget_show(props_vb);
4127 middle_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4128 gtk_box_pack_start(GTK_BOX (props_vb), middle_hb, TRUE, TRUE, 0);
4129 gtk_widget_show(middle_hb);
4131 pipe_lb = gtk_label_new("Pipe:");
4132 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_lb, FALSE, FALSE, 3);
4133 pipe_te = gtk_entry_new();
4134 gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_te),
4135 "Enter the name of the pipe data should be captured from. "
4137 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_te, TRUE, TRUE, 3);
4138 gtk_widget_set_sensitive(pipe_te, FALSE);
4139 pipe_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
4140 gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_bt),
4141 "Select a pipe from which data should be captured, "
4142 "instead of entering the pipe name directly. "
4144 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_bt, FALSE, FALSE, 0);
4145 g_signal_connect(pipe_te, "changed", G_CALLBACK(pipe_name_te_changed_cb), NULL);
4146 g_signal_connect(pipe_bt, "clicked", G_CALLBACK(capture_prep_pipe_cb), pipe_te);
4148 bbox = dlg_button_row_new(GTK_STOCK_SAVE, GTK_STOCK_CLOSE, NULL);
4149 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4151 add_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
4152 g_signal_connect(add_bt, "clicked", G_CALLBACK(add_pipe_cb), interface_management_w);
4153 gtk_widget_set_tooltip_text(GTK_WIDGET(add_bt), "Add pipe to the list of interfaces.");
4155 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
4156 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4157 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4159 gtk_widget_show(bbox);
4160 gtk_widget_show(temp_page);
4162 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY, pipe_te);
4164 /* --- Local interfaces --- */
4165 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4166 tmp = gtk_label_new("Local Interfaces");
4167 gtk_widget_show(tmp);
4168 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4169 gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
4170 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4172 local_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4173 gtk_container_set_border_width(GTK_CONTAINER(local_vb), 0);
4174 gtk_box_pack_start(GTK_BOX(temp_page), local_vb, TRUE, TRUE, 0);
4175 gtk_widget_show(local_vb);
4177 local_fr = gtk_frame_new("Local Interfaces");
4178 gtk_box_pack_start(GTK_BOX(local_vb), local_fr, TRUE, TRUE, 0);
4179 gtk_widget_show(local_fr);
4181 local_sc = scrolled_window_new(NULL, NULL);
4182 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(local_sc),
4185 gtk_container_set_border_width (GTK_CONTAINER (local_sc), 5);
4186 gtk_container_add(GTK_CONTAINER(local_fr), local_sc);
4187 gtk_widget_show(local_sc);
4189 local_l = gtk_tree_view_new();
4192 renderer = gtk_cell_renderer_text_new();
4193 column = gtk_tree_view_column_new_with_attributes("Friendly Name", renderer, "text", 0, NULL);
4194 gtk_tree_view_column_set_expand(column, TRUE);
4195 gtk_tree_view_column_set_sort_column_id(column, 0);
4196 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4199 renderer = gtk_cell_renderer_text_new();
4200 column = gtk_tree_view_column_new_with_attributes("Interface Name", renderer, "text", 0+LOCAL_OFFSET, NULL);
4201 gtk_tree_view_column_set_expand(column, TRUE);
4202 gtk_tree_view_column_set_sort_column_id(column, 0+LOCAL_OFFSET);
4203 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4205 toggle_renderer = gtk_cell_renderer_toggle_new();
4206 column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 1+LOCAL_OFFSET, NULL);
4207 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (local_hide_cb), NULL);
4208 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4209 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
4211 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY, local_l);
4212 gtk_container_add(GTK_CONTAINER(local_sc), local_l);
4213 gtk_widget_show(local_l);
4217 bbox = dlg_button_row_new(GTK_STOCK_REFRESH, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL);
4219 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4220 refresh_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_REFRESH);
4221 g_signal_connect(refresh_bt, "clicked", G_CALLBACK(rescan_local_cb), NULL);
4222 gtk_widget_set_tooltip_text(GTK_WIDGET(refresh_bt), "Rescan the local interfaces and refresh the list");
4224 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
4225 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4226 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4228 apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
4229 g_signal_connect(GTK_WIDGET(apply_bt), "clicked", G_CALLBACK(apply_local_cb), NULL);
4230 gtk_widget_set_tooltip_text(GTK_WIDGET(apply_bt), "Apply the changes to the general list of local interfaces");
4232 gtk_widget_show(bbox);
4233 gtk_widget_show(temp_page);
4236 #if defined (HAVE_PCAP_REMOTE)
4237 /* --- remote interfaces --- */
4238 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4239 tmp = gtk_label_new("Remote Interfaces");
4240 gtk_widget_show(tmp);
4241 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4242 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
4243 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4245 remote_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4246 gtk_container_set_border_width(GTK_CONTAINER(remote_vb), 0);
4247 gtk_box_pack_start(GTK_BOX(temp_page), remote_vb, TRUE, TRUE, 0);
4248 gtk_widget_show(remote_vb);
4250 remote_fr = gtk_frame_new("Remote Interfaces");
4251 gtk_box_pack_start(GTK_BOX(remote_vb), remote_fr, TRUE, TRUE, 0);
4252 gtk_widget_show(remote_fr);
4254 remote_sc = scrolled_window_new(NULL, NULL);
4255 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(remote_sc),
4258 gtk_container_set_border_width (GTK_CONTAINER (remote_sc), 5);
4259 gtk_container_add(GTK_CONTAINER(remote_fr), remote_sc);
4260 gtk_widget_show(remote_sc);
4262 remote_l = gtk_tree_view_new();
4264 renderer = gtk_cell_renderer_text_new();
4265 column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", 0, NULL);
4266 gtk_tree_view_column_set_expand(column, TRUE);
4267 gtk_tree_view_column_set_sort_column_id(column, 0);
4268 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4270 renderer = gtk_cell_renderer_text_new();
4271 column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", 1, NULL);
4272 gtk_tree_view_column_set_expand(column, TRUE);
4273 gtk_tree_view_column_set_sort_column_id(column, 1);
4274 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4276 toggle_renderer = gtk_cell_renderer_toggle_new();
4277 column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 2, NULL);
4278 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (remote_hide_cb), NULL);
4279 gtk_tree_view_column_set_cell_data_func(column, toggle_renderer, button_hide_cb, NULL, FALSE);
4280 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4281 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
4283 renderer = gtk_cell_renderer_text_new();
4284 column = gtk_tree_view_column_new_with_attributes("Control", renderer, "text", 3, NULL);
4285 gtk_tree_view_column_set_visible(column, FALSE);
4286 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4288 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
4289 gtk_tree_selection_set_select_function(selection, select_host_cb, NULL, FALSE);
4291 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY, remote_l);
4292 gtk_container_add(GTK_CONTAINER(remote_sc), remote_l);
4293 gtk_widget_show(remote_l);
4297 bbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4298 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4299 gtk_widget_show(bbox);
4301 button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
4302 gtk_box_pack_end(GTK_BOX(bbox), button_hbox, FALSE, FALSE, 0);
4303 gtk_widget_show(button_hbox);
4304 gtk_box_set_spacing(GTK_BOX(button_hbox), DLG_BUTTON_SPACING);
4306 help_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
4307 gtk_box_pack_start(GTK_BOX(bbox), help_hbox, FALSE, FALSE, 0);
4308 gtk_widget_show(help_hbox);
4309 gtk_box_set_spacing(GTK_BOX(help_hbox), DLG_BUTTON_SPACING);
4311 add_but = ws_gtk_button_new_from_stock(GTK_STOCK_ADD);
4312 g_object_set_data(G_OBJECT(bbox), GTK_STOCK_ADD, add_but);
4313 gtk_box_pack_start(GTK_BOX(help_hbox), add_but, FALSE, FALSE, 0);
4314 g_signal_connect(add_but, "clicked", G_CALLBACK(show_remote_dialog), NULL);
4315 gtk_widget_set_tooltip_text(GTK_WIDGET(add_but), "Add a remote host to the list");
4316 gtk_widget_show(add_but);
4318 delete_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
4319 g_object_set_data(G_OBJECT(bbox), GTK_STOCK_DELETE, delete_bt);
4320 gtk_box_pack_start(GTK_BOX(help_hbox), delete_bt, FALSE, FALSE, 0);
4321 g_signal_connect(delete_bt, "clicked", G_CALLBACK(remove_remote_host), NULL);
4322 gtk_widget_set_tooltip_text(GTK_WIDGET(delete_bt), "Remove a remote host from the list");
4323 gtk_widget_set_sensitive(GTK_WIDGET(delete_bt), FALSE);
4324 g_object_set_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY, delete_bt);
4325 gtk_widget_show(delete_bt);
4327 ok_but = ws_gtk_button_new_from_stock(GTK_STOCK_APPLY);
4328 gtk_box_pack_end(GTK_BOX(button_hbox), ok_but, FALSE, FALSE, 0);
4329 g_signal_connect(GTK_WIDGET(ok_but), "clicked", G_CALLBACK(ok_remote_cb), NULL);
4330 gtk_widget_set_tooltip_text(GTK_WIDGET(ok_but), "Apply the changes to the general list of local interfaces");
4331 gtk_widget_show(ok_but);
4333 cancel_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
4334 gtk_box_pack_end(GTK_BOX(button_hbox), cancel_bt, FALSE, FALSE, 0);
4335 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4336 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4337 gtk_widget_show(cancel_bt);
4339 gtk_widget_show(temp_page);
4342 gtk_widget_show_all(interface_management_w);
4345 /* show capture prepare (options) dialog */
4348 Note that capture_interface_list() is called directly (or indirectly) during the
4349 creation of (and changes to) the capture options dialog window.
4351 Also note that capture_interface_list() indirectly runs the gtk main loop temporarily
4352 to process queued events (which may include button-presses, key-presses, etc).
4353 (This is done while awaiting a response from dumpcap which is invoked to obtain
4354 the capture interface list).
4355 This means other Wireshark callbacks can be invoked while the capture options window
4356 is being created or updated (in effect an "interrupt" can occur).
4358 Needless to say, "race conditions" may occur in "interrupt" code which depends upon the exact
4359 state of the capture options dialog window and which may be invoked during the
4360 creation of (or changes to) the capture options dialog window.
4362 For example: if a user hits "Capture:Options" and then immediately hits "Capture:Start",
4363 capture_start_cb() may be invoked before capture_prep_cb() has been completed (i.e., during
4364 a call to capture_interface_list() in the code which creates the capture options window).
4365 capture_start_cb() depends upon certain properties of the capture options window having been
4366 initialized and thus fails if the properties have not (yet) been initialized.
4368 An interlock has been added to handle this particular situation;
4369 Ideally a more general solution should be implemented since it's probably difficult
4370 (if not nearly impossible) to identify all the possible "race conditions".
4372 ? Prevent the temporary running of the gtk main loop in cases wherein dumpcap is invoked for a
4373 simple request/reply ? (e.g., capture_interface_list()) ??
4379 columns_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
4381 GtkWidget *menu = (GtkWidget *)data;
4382 GdkEventButton *event_button = NULL;
4384 /* context menu handler */
4385 if (event->type == GDK_BUTTON_PRESS) {
4386 event_button = (GdkEventButton *) event;
4388 /* To quote the "Gdk Event Structures" doc:
4389 * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
4390 if (event_button->button == 3) {
4391 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, widget,
4392 event_button->button,
4393 event_button->time);
4394 g_signal_stop_emission_by_name(widget, "button_press_event");
4402 update_properties_all(void)
4406 gboolean capture_all;
4407 gboolean promisc_all;
4408 gboolean filter_all;
4410 GtkWidget *promisc_b;
4411 GtkWidget *capture_b;
4412 GtkWidget *all_filter_te;
4414 /* If we don't have a Capture Options dialog open, there's nothing
4419 /* Determine whether all interfaces:
4421 are selected for capturing;
4423 all selected interfaces are in promiscuous mode;
4425 all selected interfaces have the same capture filter.
4427 Start out by assuming that all three are the case, and change that
4428 once we find an interface where it's not the case. */
4433 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
4434 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
4435 if (!device.hidden) {
4436 if (!device.selected) {
4437 /* This interface isn't selected, so not all interfaces are selected. */
4438 capture_all = FALSE;
4440 /* This interface is selected; is it in promiscuous mode? */
4441 if (!device.pmode) {
4442 /* No, so not all selected interfaces are in promiscuous mode. */
4443 promisc_all = FALSE;
4445 /* Have we seen the same capture filter on all interfaces at
4446 which we've looked so far? */
4447 if (device.cfilter != NULL && filter_all) {
4448 /* Yes. Is this the first interface for which we've seen a
4450 if (filter_str == NULL) {
4451 /* First selected interface - save its capture filter;
4452 there aren't any filters against which to compare. */
4453 filter_str = g_strdup(device.cfilter);
4455 /* Not the first selected interface; is its capture filter
4456 the same as the one the other interfaces we've looked
4458 if (strcmp(device.cfilter, filter_str) != 0) {
4459 /* No, so not all selected interfaces have the same capture
4461 if (filter_str != NULL) {
4473 /* If all interfaces are selected, check the "capture on all interfaces"
4474 checkbox, otherwise un-check it. */
4475 capture_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL);
4476 g_signal_handler_block(capture_b, capture_all_handler_id);
4477 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(capture_b), capture_all);
4478 g_signal_handler_unblock(capture_b, capture_all_handler_id);
4480 /* If all selected interfaces are in promiscuous mode, check the global
4481 "promiscuous mode" checkbox, otherwise un-check it. */
4482 promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
4483 g_signal_handler_block(promisc_b, promisc_all_handler_id);
4484 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), promisc_all);
4485 g_signal_handler_unblock(promisc_b, promisc_all_handler_id);
4487 /* If all selected interfaces have the same filter string, set the
4488 global filter string to it. */
4489 all_filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY)));
4491 /* Either no interfaces were selected, or all selected interfaces
4492 have the same filter. In the former case, make the global capture
4493 filter empty; in the latter case, make it that filter. */
4494 if (filter_str != NULL) {
4495 gtk_entry_set_text(GTK_ENTRY(all_filter_te), filter_str);
4498 gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
4501 /* Not all selected interfaces have the same filter, so there is no
4502 global capture filter; make it empty to reflect that. */
4503 gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
4509 column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
4511 GtkWidget *col = (GtkWidget *) data;
4513 GtkWidget *menu = (GtkWidget *)g_object_get_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY);
4515 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
4516 g_object_set_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY, col);
4517 return columns_menu_handler (widget, event, menu);
4522 capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
4525 *main_hb, *left_vb, *right_vb,
4526 *capture_fr, *capture_vb,
4528 *promisc_cb, *pcap_ng_cb,
4530 *file_hb, *file_bt, *file_lb, *file_te,
4531 *multi_hb, *multi_grid, *multi_files_on_cb,
4532 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
4533 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
4534 *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
4535 *stop_files_cb, *stop_files_sb, *stop_files_lb,
4536 *limit_fr, *limit_vb, *limit_hb, *limit_grid,
4537 *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
4538 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
4539 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
4540 *display_fr, *display_vb,
4541 *sync_cb, *auto_scroll_cb, *hide_info_cb,
4542 *resolv_fr, *resolv_vb,
4543 *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb,
4545 *all_filter_cm, *all_filter_te, *all_filter_bt, *all_filter_hb,
4549 GtkWidget *decryption_cb;
4553 GtkWidget *iftype_cbx;
4555 GtkAdjustment *ringbuffer_nbf_adj,
4556 *stop_packets_adj, *stop_filesize_adj, *stop_duration_adj, *stop_files_adj,
4557 *ring_filesize_adj, *file_duration_adj;
4563 GtkCellRenderer *renderer;
4564 GtkCellRenderer *toggle_renderer;
4565 GtkTreeSelection *selection;
4566 GtkTreeViewColumn *column;
4567 gboolean if_present = TRUE;
4568 GList *all_cfilter_list, *cf_entry;
4569 window_geometry_t tl_geom;
4570 const gchar *new_cfilter;
4572 if (interfaces_dialog_window_present()) {
4573 destroy_if_window();
4575 if (cap_open_w != NULL && G_IS_OBJECT(cap_open_w)) {
4576 /* There's already a "Capture Options" dialog box; reactivate it. */
4577 reactivate_window(cap_open_w);
4580 init_columns_menu();
4582 /* use user-defined title if preference is set */
4584 cap_title = create_user_window_title("Wireshark: Capture Options");
4586 cap_open_complete = FALSE;
4587 cap_open_w = dlg_window_new(cap_title);
4591 /* update airpcap interface list */
4593 /* load the airpcap interfaces */
4594 airpcap_if_list = get_airpcap_interface_list(&err, &err_str);
4596 /* If we don't get a list don't do any thing.
4597 * If the error is AIRPCAP_NOT_LOADED it avoids an unnecessary rescan of the packet list
4598 * ( see airpcap_loader.h for error codes).
4600 if (airpcap_if_list == NULL) {
4601 if (err == CANT_GET_AIRPCAP_INTERFACE_LIST) {
4602 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
4606 decryption_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
4607 /* XXXX update_decryption_mode_list() triggers a rescan, should only be done if the mode is changed */
4608 update_decryption_mode_list(decryption_cb);
4609 /* select the first as default (THIS SHOULD BE CHANGED) */
4610 airpcap_if_active = airpcap_get_default_if(airpcap_if_list);
4614 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4615 gtk_container_set_border_width(GTK_CONTAINER(main_vb), DLG_OUTER_MARGIN);
4616 gtk_container_add(GTK_CONTAINER(cap_open_w), main_vb);
4618 /* Capture-related options frame */
4619 capture_fr = frame_new("Capture");
4620 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
4622 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
4623 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), DLG_OUTER_MARGIN);
4624 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
4626 #if defined (HAVE_PCAP_REMOTE)
4627 if (remote_host_list == NULL) {
4628 remote_host_list = g_hash_table_new (g_str_hash, g_str_equal);
4632 swindow = gtk_scrolled_window_new (NULL, NULL);
4633 gtk_widget_set_size_request(swindow, 676, 100);
4634 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
4636 view = gtk_tree_view_new ();
4637 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (view), TRUE);
4638 g_signal_connect(view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)cap_open_w);
4640 toggle_renderer = gtk_cell_renderer_toggle_new();
4641 column = gtk_tree_view_column_new_with_attributes("Capture", GTK_CELL_RENDERER(toggle_renderer), "active", CAPTURE, NULL);
4642 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4643 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (toggle_callback), NULL);
4644 g_object_set (GTK_TREE_VIEW(view), "has-tooltip", TRUE, NULL);
4645 g_signal_connect (GTK_TREE_VIEW(view), "query-tooltip", G_CALLBACK (query_tooltip_tree_view_cb), NULL);
4647 renderer = gtk_cell_renderer_text_new();
4648 column = gtk_tree_view_column_new_with_attributes ("",
4649 GTK_CELL_RENDERER(renderer),
4650 "text", IFACE_HIDDEN_NAME,
4652 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4653 gtk_tree_view_column_set_visible(column, FALSE);
4655 renderer = gtk_cell_renderer_text_new ();
4656 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), -1, "Interface", renderer, "markup", INTERFACE, NULL);
4657 column = gtk_tree_view_get_column(GTK_TREE_VIEW (view), INTERFACE);
4658 gtk_tree_view_column_set_min_width(column, 200);
4659 gtk_tree_view_column_set_resizable(column, TRUE );
4660 gtk_tree_view_column_set_alignment(column, 0.5f);
4661 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(INTERFACE));
4662 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("INTERFACE"))
4663 gtk_tree_view_column_set_visible(column, TRUE);
4665 gtk_tree_view_column_set_visible(column, FALSE);
4666 g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
4668 renderer = gtk_cell_renderer_text_new();
4669 column = gtk_tree_view_column_new_with_attributes ("Link-layer header", renderer, "text", LINK, NULL);
4670 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4671 gtk_tree_view_column_set_clickable(column, TRUE);
4672 gtk_tree_view_column_set_reorderable(column, TRUE);
4673 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW (view),LINK), TRUE );
4674 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(LINK));
4675 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4676 G_CALLBACK(column_button_pressed_cb), column);
4677 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("LINK"))
4678 gtk_tree_view_column_set_visible(column, TRUE);
4680 gtk_tree_view_column_set_visible(column, FALSE);
4681 gtk_tree_view_column_set_alignment(column, 0.5f);
4683 renderer = gtk_cell_renderer_text_new();
4684 column = gtk_tree_view_column_new_with_attributes("Prom. Mode", renderer, "text", PMODE, NULL);
4685 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4686 g_object_set(renderer, "xalign", 0.5f, NULL);
4687 gtk_tree_view_column_set_clickable(column, TRUE);
4688 gtk_tree_view_column_set_reorderable(column, TRUE);
4689 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(PMODE));
4690 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4691 G_CALLBACK(column_button_pressed_cb), column);
4692 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("PMODE"))
4693 gtk_tree_view_column_set_visible(column, TRUE);
4695 gtk_tree_view_column_set_visible(column, FALSE);
4696 gtk_tree_view_column_set_alignment(column, 0.5f);
4698 renderer = gtk_cell_renderer_text_new();
4699 column = gtk_tree_view_column_new_with_attributes("Snaplen [B]", renderer, "text", SNAPLEN, NULL);
4700 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4701 gtk_tree_view_column_set_clickable(column, TRUE);
4702 gtk_tree_view_column_set_reorderable(column, TRUE);
4703 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(SNAPLEN));
4704 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4705 G_CALLBACK(column_button_pressed_cb), column);
4706 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("SNAPLEN"))
4707 gtk_tree_view_column_set_visible(column, TRUE);
4709 gtk_tree_view_column_set_visible(column, FALSE);
4710 g_object_set(renderer, "xalign", 0.5f, NULL);
4712 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
4713 renderer = gtk_cell_renderer_text_new();
4714 column = gtk_tree_view_column_new_with_attributes("Buffer [MiB]", renderer, "text", BUFFER, NULL);
4715 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4716 gtk_tree_view_column_set_reorderable(column, TRUE);
4717 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(BUFFER));
4718 gtk_tree_view_column_set_clickable(column, TRUE);
4719 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4720 G_CALLBACK(column_button_pressed_cb), column);
4721 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("BUFFER"))
4722 gtk_tree_view_column_set_visible(column, TRUE);
4724 gtk_tree_view_column_set_visible(column, FALSE);
4725 g_object_set(renderer, "xalign", 0.5f, NULL);
4728 #if defined (HAVE_PCAP_CREATE)
4729 renderer = gtk_cell_renderer_text_new();
4730 column = gtk_tree_view_column_new_with_attributes ("Mon. Mode", renderer, "text", MONITOR, NULL);
4731 gtk_tree_view_column_set_cell_data_func(column, renderer, activate_monitor, NULL, FALSE);
4732 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4733 gtk_tree_view_column_set_reorderable(column, TRUE);
4734 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(MONITOR));
4735 gtk_tree_view_column_set_clickable(column, TRUE);
4736 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4737 G_CALLBACK(column_button_pressed_cb), column);
4738 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("MONITOR"))
4739 gtk_tree_view_column_set_visible(column, TRUE);
4741 gtk_tree_view_column_set_visible(column, FALSE);
4742 g_object_set(renderer, "xalign", 0.5f, NULL);
4745 renderer = gtk_cell_renderer_text_new();
4746 column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", FILTER, NULL);
4747 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4748 gtk_tree_view_column_set_alignment(column, 0.5f);
4749 create_and_fill_model(GTK_TREE_VIEW(view));
4750 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
4751 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
4752 gtk_tree_view_column_set_clickable(column, TRUE);
4753 gtk_tree_view_column_set_reorderable(column, TRUE);
4754 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(FILTER));
4755 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4756 G_CALLBACK(column_button_pressed_cb), column);
4757 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("FILTER"))
4758 gtk_tree_view_column_set_visible(column, TRUE);
4760 gtk_tree_view_column_set_visible(column, FALSE);
4761 gtk_container_add (GTK_CONTAINER (swindow), view);
4762 gtk_box_pack_start(GTK_BOX(capture_vb), swindow, TRUE, TRUE, 0);
4764 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY, view);
4766 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4767 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
4768 gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 0);
4769 all_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4770 gtk_container_set_border_width(GTK_CONTAINER(all_vb), 0);
4771 gtk_box_pack_start(GTK_BOX(main_hb), all_vb, TRUE, TRUE, 0);
4773 all_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4774 gtk_container_set_border_width(GTK_CONTAINER(all_hb), 0);
4775 gtk_box_pack_start(GTK_BOX(all_vb), all_hb, TRUE, TRUE, 0);
4777 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4778 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
4779 gtk_box_pack_start(GTK_BOX(all_hb), left_vb, TRUE, TRUE, 0);
4781 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4782 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
4783 gtk_box_pack_start(GTK_BOX(all_hb), right_vb, FALSE, FALSE, 3);
4785 all_cb = gtk_check_button_new_with_mnemonic( "Capture on all interfaces");
4786 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(all_cb), FALSE);
4787 capture_all_handler_id = g_signal_connect(all_cb, "toggled", G_CALLBACK(capture_all_cb), NULL);
4788 gtk_widget_set_tooltip_text(all_cb, "Activate the box to capture on all interfaces. "
4789 "Deactivate it to capture on none and set the interfaces individually.");
4790 gtk_box_pack_start(GTK_BOX(left_vb), all_cb, TRUE, TRUE, 0);
4792 gtk_widget_set_sensitive(GTK_WIDGET(all_cb), if_present);
4793 /* Promiscuous mode row */
4794 promisc_cb = gtk_check_button_new_with_mnemonic("Use _promiscuous mode on all interfaces");
4795 if (!global_capture_session.session_started) {
4796 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
4798 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), get_all_prom_mode());
4800 promisc_all_handler_id = g_signal_connect(promisc_cb, "toggled", G_CALLBACK(promisc_mode_callback), NULL);
4802 gtk_widget_set_tooltip_text(promisc_cb,
4803 "Usually a network adapter will only capture the traffic sent to its own network address. "
4804 "If you want to capture all traffic that all network adapters can \"see\", select this option. "
4805 "If you want to set this option on a per-interface basis, do not select this option. "
4806 "Instead, select the individual checkboxes in the interface list's \"Prom. Mode\" column. "
4807 "See the FAQ for some more details of capturing packets from a switched network.");
4808 gtk_box_pack_start(GTK_BOX(left_vb), promisc_cb, TRUE, TRUE, DLG_LABEL_SPACING);
4810 iftype_cbx = gtk_button_new_with_label("Manage Interfaces");
4811 gtk_widget_set_tooltip_text(iftype_cbx, "Add a new interface or pipe to capture from or remove "
4812 "an interface from the list.");
4813 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFTYPE_CBX_KEY, iftype_cbx);
4815 gtk_box_pack_start(GTK_BOX(right_vb), iftype_cbx, FALSE, FALSE, 0);
4816 g_signal_connect(iftype_cbx, "clicked", G_CALLBACK(show_add_interfaces_dialog), NULL);
4817 gtk_widget_show(iftype_cbx);
4819 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4820 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
4821 gtk_box_pack_start(GTK_BOX(main_vb), main_hb, FALSE, FALSE, 0);
4823 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4824 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
4825 gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
4827 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4828 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
4829 gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 0);
4832 all_filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4833 gtk_box_pack_start(GTK_BOX(all_vb), all_filter_hb, FALSE, FALSE, DLG_LABEL_SPACING);
4835 all_filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
4836 g_signal_connect(all_filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
4837 g_signal_connect(all_filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
4838 gtk_widget_set_tooltip_text(all_filter_bt,
4839 "Select a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
4840 "See \"Capture Filters\" in the online help for further information how to use it."
4842 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_bt, FALSE, FALSE, 0);
4844 /* Create the capture filter combo box*/
4845 all_filter_cm = gtk_combo_box_text_new_with_entry();
4846 g_object_set_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY, all_filter_cm);
4847 all_filter_te = gtk_bin_get_child(GTK_BIN(all_filter_cm));
4848 colorize_filter_te_as_empty(all_filter_te);
4849 g_signal_connect(all_filter_te, "changed", G_CALLBACK(capture_all_filter_check_syntax_cb), NULL);
4850 g_signal_connect(all_filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
4852 all_cfilter_list = recent_get_cfilter_list(NULL);
4853 for (cf_entry = all_cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
4854 new_cfilter = (const gchar *)cf_entry->data;
4855 /* If this is the default cfilter, don't put it in the list, as it'll
4857 if (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0) {
4858 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), new_cfilter);
4861 if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
4862 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), global_capture_opts.default_options.cfilter);
4863 gtk_combo_box_set_active(GTK_COMBO_BOX(all_filter_cm), 0);
4866 gtk_widget_set_tooltip_text(all_filter_cm,
4867 "Enter a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
4868 "See \"Capture Filters\" in the online help for further information how to use it. "
4869 "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
4871 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_cm, TRUE, TRUE, DLG_BUTTON_SPACING);
4873 /* let an eventually capture filters dialog know the text entry to fill in */
4874 g_object_set_data(G_OBJECT(all_filter_bt), E_FILT_TE_PTR_KEY, all_filter_te);
4876 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
4877 all_compile_bt = gtk_button_new_with_label("Compile selected BPFs");
4878 g_signal_connect(all_compile_bt, "clicked", G_CALLBACK(capture_all_filter_compile_cb), NULL);
4879 gtk_widget_set_tooltip_text(all_compile_bt,
4880 "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
4881 /* We can't compile without any supported link-types, so disable the button in that case */
4882 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_compile_bt, FALSE, FALSE, DLG_BUTTON_SPACING);
4883 if (global_capture_opts.num_selected > 0) {
4884 gtk_widget_set_sensitive(all_compile_bt, TRUE);
4886 gtk_widget_set_sensitive(all_compile_bt, FALSE);
4890 /* Capture file-related options frame */
4891 file_fr = frame_new("Capture Files");
4892 gtk_box_pack_start(GTK_BOX (left_vb), file_fr, TRUE, TRUE, 0);
4894 file_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
4895 gtk_container_set_border_width(GTK_CONTAINER(file_vb), DLG_OUTER_MARGIN);
4896 gtk_container_add(GTK_CONTAINER(file_fr), file_vb);
4899 file_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4900 gtk_box_pack_start(GTK_BOX(file_vb), file_hb, FALSE, FALSE, 0);
4902 file_lb = gtk_label_new("File:");
4903 gtk_box_pack_start(GTK_BOX(file_hb), file_lb, FALSE, FALSE, 3);
4905 file_te = gtk_entry_new();
4906 gtk_widget_set_tooltip_text(file_te,
4907 "Enter the file name to which captured data will be written. "
4908 "If you don't enter something here, a temporary file will be used."
4910 gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 3);
4912 file_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
4913 gtk_widget_set_tooltip_text(file_bt,
4914 "Select a file to which captured data will be written, "
4915 "instead of entering the file name directly. "
4917 gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 0);
4919 g_signal_connect(file_bt, "clicked", G_CALLBACK(capture_prep_file_cb), file_te);
4921 /* multiple files table */
4922 /* XXX We want multi_grid to shrink to its minimum size horizontally
4923 * and be left-aligned within file_fr. Using a horizontal GtkBox works
4924 * in Gtk2 but not Gtk3. The situation gets sillier below with limit_fr
4925 * and limit_grid because we have both horizontal and vertical GtkBoxes.
4927 multi_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4928 gtk_box_pack_start(GTK_BOX(file_vb), multi_hb, FALSE, FALSE, 0);
4929 multi_grid = ws_gtk_grid_new();
4930 ws_gtk_grid_set_row_spacing(GTK_GRID(multi_grid), DLG_LABEL_SPACING);
4931 ws_gtk_grid_set_column_spacing(GTK_GRID(multi_grid), DLG_UNRELATED_SPACING);
4932 gtk_box_pack_start(GTK_BOX(multi_hb), multi_grid, FALSE, FALSE, 0);
4935 /* multiple files row */
4936 multi_files_on_cb = gtk_check_button_new_with_mnemonic("Use _multiple files");
4937 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb),
4938 global_capture_opts.multi_files_on);
4939 g_signal_connect(multi_files_on_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity),
4941 gtk_widget_set_tooltip_text(multi_files_on_cb,
4942 "Instead of using a single capture file, multiple files will be created. "
4943 "The generated file names will contain an incrementing number and the start time of the capture.");
4944 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), multi_files_on_cb, 0, row, 1, 1,
4945 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4948 pcap_ng_cb = gtk_check_button_new_with_mnemonic("Use pcap-ng format");
4949 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), global_capture_opts.use_pcapng);
4950 gtk_widget_set_tooltip_text(pcap_ng_cb, "Capture packets in the next-generation capture file format. "
4951 "This is still experimental.");
4952 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), pcap_ng_cb, 2, row, 1, 1,
4953 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4956 /* Ring buffer filesize row */
4957 ring_filesize_cb = gtk_check_button_new_with_label("Next file every");
4958 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb),
4959 global_capture_opts.has_autostop_filesize || !global_capture_opts.has_file_duration);
4960 g_signal_connect(ring_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
4961 gtk_widget_set_tooltip_text(ring_filesize_cb,
4962 "If the selected file size is exceeded, capturing switches to the next file.\n"
4963 "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
4964 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cb, 0, row, 1, 1,
4965 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4967 ring_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
4968 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
4969 ring_filesize_sb = gtk_spin_button_new (ring_filesize_adj, 0, 0);
4970 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ring_filesize_sb), TRUE);
4971 gtk_widget_set_size_request(ring_filesize_sb, 80, -1);
4972 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_sb, 1, row, 1, 1,
4973 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4975 ring_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
4976 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cbx, 2, row, 1, 1,
4977 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4979 value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
4980 gtk_adjustment_set_value(ring_filesize_adj, (gdouble) value);
4984 /* Ring buffer duration row */
4985 file_duration_cb = gtk_check_button_new_with_label("Next file every");
4986 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_duration_cb),
4987 global_capture_opts.has_file_duration);
4988 g_signal_connect(file_duration_cb, "toggled",
4989 G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
4990 gtk_widget_set_tooltip_text(file_duration_cb,
4991 "If the selected duration is exceeded, capturing switches to the next file.\n"
4992 "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
4993 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_cb, 0, row, 1, 1,
4994 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4996 file_duration_adj = (GtkAdjustment *)gtk_adjustment_new(0.0,
4997 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
4998 file_duration_sb = gtk_spin_button_new (file_duration_adj, 0, 0);
4999 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (file_duration_sb), TRUE);
5000 gtk_widget_set_size_request(file_duration_sb, 80, -1);
5001 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_sb, 1, row, 1, 1,
5002 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5004 file_duration_cbx = time_unit_combo_box_new(global_capture_opts.file_duration);
5005 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_cbx, 2, row, 1, 1,
5006 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5008 value = time_unit_combo_box_convert_value(global_capture_opts.file_duration);
5009 gtk_adjustment_set_value(file_duration_adj, (gdouble) value);
5012 /* Ring buffer files row */
5013 ringbuffer_nbf_cb = gtk_check_button_new_with_label("Ring buffer with");
5014 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb),
5015 global_capture_opts.has_ring_num_files);
5016 g_signal_connect(ringbuffer_nbf_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5017 gtk_widget_set_tooltip_text(ringbuffer_nbf_cb,
5018 "After capturing has switched to the next file and the given number of files has exceeded, "
5019 "the oldest file will be removed."
5021 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_cb, 0, row, 1, 1,
5022 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5024 ringbuffer_nbf_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.ring_num_files,
5025 2/*RINGBUFFER_MIN_NUM_FILES*/, RINGBUFFER_MAX_NUM_FILES, 1.0, 10.0, 0.0);
5026 ringbuffer_nbf_sb = gtk_spin_button_new (ringbuffer_nbf_adj, 0, 0);
5027 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ringbuffer_nbf_sb), TRUE);
5028 gtk_widget_set_size_request(ringbuffer_nbf_sb, 80, -1);
5029 g_signal_connect(ringbuffer_nbf_sb, "changed", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5030 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_sb, 1, row, 1, 1,
5031 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5033 ringbuffer_nbf_lb = gtk_label_new("files");
5034 gtk_misc_set_alignment(GTK_MISC(ringbuffer_nbf_lb), 0, 0.5f);
5035 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_lb, 2, row, 1, 1,
5036 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5040 /* Capture limits frame */
5041 limit_fr = frame_new("Stop Capture Automatically After...");
5042 gtk_box_pack_start(GTK_BOX (left_vb), limit_fr, TRUE, TRUE, 0);
5044 limit_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5045 gtk_container_set_border_width(GTK_CONTAINER(limit_vb), DLG_OUTER_MARGIN);
5046 gtk_container_add(GTK_CONTAINER(limit_fr), limit_vb);
5049 limit_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
5050 gtk_box_pack_start(GTK_BOX(limit_vb), limit_hb, FALSE, FALSE, 0);
5051 limit_grid = ws_gtk_grid_new();
5052 ws_gtk_grid_set_row_spacing(GTK_GRID(limit_grid), DLG_LABEL_SPACING);
5053 ws_gtk_grid_set_column_spacing(GTK_GRID(limit_grid), DLG_UNRELATED_SPACING);
5054 gtk_box_pack_start(GTK_BOX(limit_hb), limit_grid, FALSE, FALSE, 0);
5057 /* Packet count row */
5058 stop_packets_cb = gtk_check_button_new();
5059 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_packets_cb),
5060 global_capture_opts.has_autostop_packets);
5061 g_signal_connect(stop_packets_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5062 gtk_widget_set_tooltip_text(stop_packets_cb, "Stop capturing after the specified number of packets have been captured.");
5063 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_cb, 0, row, 1, 1,
5064 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5066 stop_packets_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_packets,
5067 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5068 stop_packets_sb = gtk_spin_button_new (stop_packets_adj, 0, 0);
5069 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_packets_sb), TRUE);
5070 gtk_widget_set_size_request(stop_packets_sb, 80, -1);
5071 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_sb, 1, row, 1, 1,
5072 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5074 stop_packets_lb = gtk_label_new("packet(s)");
5075 gtk_misc_set_alignment(GTK_MISC(stop_packets_lb), 0, 0.5f);
5076 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_lb, 2, row, 1, 1,
5077 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5080 stop_filesize_cb = gtk_check_button_new();
5081 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_filesize_cb),
5082 global_capture_opts.has_autostop_filesize);
5083 g_signal_connect(stop_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5084 gtk_widget_set_tooltip_text(stop_filesize_cb, "Stop capturing after the specified amount of data has been captured.");
5085 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cb, 3, row, 1, 1,
5086 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5088 stop_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
5089 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5090 stop_filesize_sb = gtk_spin_button_new (stop_filesize_adj, 0, 0);
5091 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_filesize_sb), TRUE);
5092 gtk_widget_set_size_request(stop_filesize_sb, 80, -1);
5093 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_sb, 4, row, 1, 1,
5094 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5096 stop_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
5097 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cbx, 5, row, 1, 1,
5098 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5100 value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
5101 gtk_adjustment_set_value(stop_filesize_adj, (gdouble) value);
5106 stop_files_cb = gtk_check_button_new();
5107 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_files_cb),
5108 global_capture_opts.has_autostop_files);
5109 g_signal_connect(stop_files_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5110 gtk_widget_set_tooltip_text(stop_files_cb, "Stop capturing after the given number of \"file switches\" have been done.");
5111 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_cb, 0, row, 1, 1,
5112 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5114 stop_files_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_files,
5115 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5116 stop_files_sb = gtk_spin_button_new (stop_files_adj, 0, 0);
5117 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_files_sb), TRUE);
5118 gtk_widget_set_size_request(stop_files_sb, 80, -1);
5119 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_sb, 1, row, 1, 1,
5120 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5122 stop_files_lb = gtk_label_new("file(s)");
5123 gtk_misc_set_alignment(GTK_MISC(stop_files_lb), 0, 0.5f);
5124 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_lb, 2, row, 1, 1,
5125 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5128 stop_duration_cb = gtk_check_button_new();
5129 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_duration_cb),
5130 global_capture_opts.has_autostop_duration);
5131 g_signal_connect(stop_duration_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5132 gtk_widget_set_tooltip_text(stop_duration_cb, "Stop capturing after the specified amount of time has passed.");
5133 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cb, 3, row, 1, 1,
5134 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5136 stop_duration_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
5137 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5138 stop_duration_sb = gtk_spin_button_new (stop_duration_adj, 0, 0);
5139 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_duration_sb), TRUE);
5140 gtk_widget_set_size_request(stop_duration_sb, 80, -1);
5141 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_sb, 4, row, 1, 1,
5142 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5144 stop_duration_cbx = time_unit_combo_box_new(global_capture_opts.autostop_duration);
5145 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cbx, 5, row, 1, 1,
5146 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5148 value = time_unit_combo_box_convert_value(global_capture_opts.autostop_duration);
5149 gtk_adjustment_set_value(stop_duration_adj, (gdouble) value);
5152 /* Display-related options frame */
5153 display_fr = frame_new("Display Options");
5154 gtk_box_pack_start(GTK_BOX (right_vb), display_fr, TRUE, TRUE, 0);
5156 display_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
5157 gtk_container_set_border_width(GTK_CONTAINER(display_vb), DLG_OUTER_MARGIN);
5158 gtk_container_add(GTK_CONTAINER(display_fr), display_vb);
5160 /* "Update display in real time" row */
5161 sync_cb = gtk_check_button_new_with_mnemonic(
5162 "_Update list of packets in real time");
5163 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sync_cb),
5164 global_capture_opts.real_time_mode);
5165 g_signal_connect(sync_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5166 gtk_widget_set_tooltip_text(sync_cb,
5167 "Using this option will show the captured packets immediately on the main screen. "
5168 "Please note: this will slow down capturing, so increased packet drops might appear.");
5169 gtk_box_pack_start(GTK_BOX (display_vb), sync_cb, FALSE, TRUE, 0);
5171 /* "Auto-scroll live update" row */
5172 auto_scroll_cb = gtk_check_button_new_with_mnemonic("_Automatically scroll during live capture");
5173 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_scroll_cb), auto_scroll_live);
5174 gtk_widget_set_tooltip_text(auto_scroll_cb,
5175 "This will scroll the \"Packet List\" automatically to the latest captured packet, "
5176 "when the \"Update List of packets in real time\" option is used.");
5177 gtk_box_pack_start(GTK_BOX (display_vb), auto_scroll_cb, FALSE, TRUE, 0);
5179 /* "Hide capture info" row */
5180 hide_info_cb = gtk_check_button_new_with_mnemonic("_Hide capture info dialog");
5181 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hide_info_cb), !global_capture_opts.show_info);
5182 gtk_widget_set_tooltip_text(hide_info_cb, "Hide the capture info dialog while capturing.");
5183 gtk_box_pack_start(GTK_BOX (display_vb), hide_info_cb, FALSE, TRUE, 0);
5185 /* Name Resolution frame */
5186 resolv_fr = frame_new("Name Resolution");
5187 gtk_box_pack_start(GTK_BOX (right_vb), resolv_fr, TRUE, TRUE, 0);
5189 resolv_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
5190 gtk_container_set_border_width(GTK_CONTAINER(resolv_vb), DLG_OUTER_MARGIN);
5191 gtk_container_add(GTK_CONTAINER(resolv_fr), resolv_vb);
5193 m_resolv_cb = gtk_check_button_new_with_mnemonic(
5194 "Resolve _MAC addresses");
5195 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_resolv_cb),
5196 gbl_resolv_flags.mac_name);
5197 gtk_widget_set_tooltip_text(m_resolv_cb, "Perform MAC layer name resolution while capturing.");
5198 gtk_box_pack_start(GTK_BOX (resolv_vb), m_resolv_cb, FALSE, TRUE, 0);
5200 n_resolv_cb = gtk_check_button_new_with_mnemonic(
5201 "Resolve _network-layer names");
5202 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(n_resolv_cb),
5203 gbl_resolv_flags.network_name);
5204 gtk_widget_set_tooltip_text(n_resolv_cb, "Perform network layer name resolution while capturing.");
5205 gtk_box_pack_start(GTK_BOX (resolv_vb), n_resolv_cb, FALSE, TRUE, 0);
5207 t_resolv_cb = gtk_check_button_new_with_mnemonic(
5208 "Resolve _transport-layer name");
5209 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(t_resolv_cb),
5210 gbl_resolv_flags.transport_name);
5211 gtk_widget_set_tooltip_text(t_resolv_cb,
5212 "Perform transport layer name resolution while capturing.");
5213 gtk_box_pack_start(GTK_BOX (resolv_vb), t_resolv_cb, FALSE, TRUE, 0);
5215 e_resolv_cb = gtk_check_button_new_with_mnemonic(
5216 "Use _external network name resolver");
5217 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e_resolv_cb),
5218 gbl_resolv_flags.use_external_net_name_resolver);
5219 gtk_widget_set_tooltip_text(e_resolv_cb,
5220 "Use the (system's) configured name resolver (e.g., DNS) to resolve network names.");
5221 gtk_box_pack_start(GTK_BOX (resolv_vb), e_resolv_cb, FALSE, TRUE, 0);
5223 /* Button row: "Start", "Cancel" and "Help" buttons */
5224 bbox = dlg_button_row_new(WIRESHARK_STOCK_CAPTURE_START, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
5225 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
5227 ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_START);
5228 g_signal_connect(ok_bt, "clicked", G_CALLBACK(capture_start_cb), NULL);
5229 gtk_widget_set_tooltip_text(ok_bt, "Start the capture process.");
5230 if (global_capture_opts.num_selected > 0) {
5231 gtk_widget_set_sensitive(ok_bt, TRUE);
5233 gtk_widget_set_sensitive(ok_bt, FALSE);
5236 close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
5237 gtk_widget_set_tooltip_text(close_bt,
5239 window_set_cancel_button(cap_open_w, close_bt, window_cancel_button_cb);
5241 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
5242 gtk_widget_set_tooltip_text(help_bt,
5243 "Show help about capturing.");
5244 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), GUINT_TO_POINTER(HELP_CAPTURE_OPTIONS_DIALOG));
5245 gtk_widget_grab_default(ok_bt);
5247 /* Attach pointers to needed widgets to the capture prefs window/object */
5248 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL, all_cb);
5249 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL, promisc_cb);
5250 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY, pcap_ng_cb);
5251 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_TE_KEY, file_te);
5252 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_MULTI_FILES_ON_CB_KEY, multi_files_on_cb);
5253 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_CB_KEY, ringbuffer_nbf_cb);
5254 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb);
5255 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb);
5256 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CB_KEY, ring_filesize_cb);
5257 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_SB_KEY, ring_filesize_sb);
5258 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CBX_KEY, ring_filesize_cbx);
5259 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_CB_KEY, file_duration_cb);
5260 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_SB_KEY, file_duration_sb);
5261 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_CBX_KEY, file_duration_cbx);
5262 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb);
5263 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb);
5264 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_HIDE_INFO_KEY, hide_info_cb);
5265 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_CB_KEY, stop_packets_cb);
5266 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_SB_KEY, stop_packets_sb);
5267 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_LB_KEY, stop_packets_lb);
5268 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CB_KEY, stop_filesize_cb);
5269 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_SB_KEY, stop_filesize_sb);
5270 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CBX_KEY, stop_filesize_cbx);
5271 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CB_KEY, stop_duration_cb);
5272 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_SB_KEY, stop_duration_sb);
5273 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CBX_KEY, stop_duration_cbx);
5274 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_CB_KEY, stop_files_cb);
5275 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_SB_KEY, stop_files_sb);
5276 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_LB_KEY, stop_files_lb);
5277 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb);
5278 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb);
5279 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb);
5280 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_E_RESOLVE_KEY, e_resolv_cb);
5282 /* Set the sensitivity of various widgets as per the settings of other
5284 capture_prep_adjust_sensitivity(NULL, cap_open_w);
5286 update_properties_all();
5287 update_visible_columns_menu ();
5289 /* Catch the "activate" signal on the text
5290 entries, so that if the user types Return there, we act as if the
5291 "OK" button had been selected, as happens if Return is typed if some
5292 widget that *doesn't* handle the Return key has the input focus. */
5293 /*dlg_set_activate(gtk_bin_get_child(GTK_BIN(if_cb)), ok_bt);*/
5294 dlg_set_activate(file_te, ok_bt);
5295 dlg_set_activate(all_filter_te, ok_bt);
5296 gtk_widget_grab_focus(all_filter_te);
5298 g_signal_connect(cap_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
5299 g_signal_connect(cap_open_w, "destroy", G_CALLBACK(capture_prep_destroy_cb), NULL);
5301 window_get_geometry(top_level, &tl_geom);
5302 gtk_window_set_default_size(GTK_WINDOW(cap_open_w), tl_geom.width * 8 / 10, -1);
5304 gtk_widget_show_all(cap_open_w);
5305 window_present(cap_open_w);
5307 cap_open_complete = TRUE; /* "Capture:Start" is now OK */
5308 global_capture_session.session_started = TRUE;
5311 /* user pressed the "Start" button (in dialog or toolbar) */
5313 capture_start_cb(GtkWidget *w _U_, gpointer d _U_)
5315 interface_options interface_opts;
5320 airpcap_if_active = airpcap_if_selected;
5321 if (airpcap_if_active)
5322 airpcap_set_toolbar_start_capture(airpcap_if_active);
5325 /* XXX - will closing this remove a temporary file? */
5326 if(!do_file_close(&cfile, FALSE, " before starting a new capture")){
5331 * There's an options dialog; get the values from it and close it.
5335 /* Determine if "capture start" while building of the "capture options" window */
5336 /* is in progress. If so, ignore the "capture start. */
5337 /* XXX: Would it be better/cleaner for the "capture options" window code to */
5338 /* disable the capture start button temporarily ? */
5339 if (cap_open_complete == FALSE) {
5340 return; /* Building options window: ignore "capture start" */
5342 success = capture_dlg_prep(cap_open_w);
5344 window_destroy(GTK_WIDGET(cap_open_w));
5346 return; /* error in options dialog */
5348 if (global_capture_opts.num_selected == 0) {
5349 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5350 "You didn't specify an interface on which to capture packets.");
5354 /* everything's prepared, now it's really time to start the capture */
5356 /* XXX - we might need to init other pref data as well... */
5357 main_auto_scroll_live_changed(auto_scroll_live);
5359 /* XXX - can this ever happen? */
5360 if (global_capture_session.state != CAPTURE_STOPPED)
5363 /* close the currently loaded capture file */
5364 cf_close((capture_file *)global_capture_session.cf);
5366 /* Copy the selected interfaces to the set of interfaces to use for
5368 collect_ifaces(&global_capture_opts);
5370 if (capture_start(&global_capture_opts, &global_capture_session, main_window_update)) {
5371 /* The capture succeeded, which means the capture filters specified are
5372 valid; add them to the recent capture filter lists for the interfaces.
5374 If the same capture filter is used for all the selected interfaces,
5375 add it to the global recent capture filter list as well. */
5377 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
5378 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
5379 if (interface_opts.cfilter) {
5380 recent_add_cfilter(interface_opts.name, interface_opts.cfilter);
5381 if (filter_str == NULL) {
5382 /* First selected interface - save its capture filter. */
5383 filter_str = g_strdup(interface_opts.cfilter);
5385 /* Not the first selected interface; is its capture filter
5386 the same as the one the other interfaces we've looked
5388 if (strcmp(interface_opts.cfilter, filter_str) != 0) {
5389 /* No, so not all selected interfaces have the same capture
5391 if (filter_str != NULL) {
5399 if (filter_str != NULL) {
5400 if (filter_str[0] != '\0') {
5401 recent_add_cfilter(NULL, filter_str);
5409 /* user change linktype selection;, convert to internal DLT value */
5411 select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_)
5417 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
5418 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
5419 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
5420 g_assert_not_reached(); /* Programming error: somehow nothing is active */
5422 if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
5423 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
5425 device.active_dlt = dlt;
5426 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
5427 capture_filter_check_syntax_cb(linktype_combo_box, data);
5430 /* user pressed "File" button */
5432 capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te)
5434 file_selection_browse(file_bt, file_te, "Wireshark: Specify a Capture File", FILE_SELECTION_WRITE_BROWSE);
5437 /* user pressed "Pipe" button */
5439 capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te)
5441 file_selection_browse(pipe_bt, pipe_te, "Wireshark: Specify a Pipe", FILE_SELECTION_WRITE_BROWSE);
5445 /* convert dialog settings into capture_opts values */
5447 capture_dlg_prep(gpointer parent_w) {
5448 GtkWidget *pcap_ng_cb,
5449 *file_te, *multi_files_on_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_cb,
5450 *sync_cb, *auto_scroll_cb, *hide_info_cb,
5451 *stop_packets_cb, *stop_packets_sb,
5452 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
5453 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
5454 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
5455 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
5456 *stop_files_cb, *stop_files_sb,
5457 *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb;
5458 const gchar *g_save_file;
5463 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_PCAP_NG_KEY);
5464 file_te = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_TE_KEY);
5465 multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
5466 ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
5467 ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
5468 ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
5469 ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
5470 ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
5471 file_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CB_KEY);
5472 file_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_SB_KEY);
5473 file_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CBX_KEY);
5474 sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
5475 auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
5476 hide_info_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_HIDE_INFO_KEY);
5477 stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
5478 stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
5479 stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
5480 stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
5481 stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
5482 stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
5483 stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
5484 stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
5485 stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
5486 stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
5487 m_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY);
5488 n_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY);
5489 t_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY);
5490 e_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_E_RESOLVE_KEY);
5492 if (global_capture_opts.num_selected == 0) {
5493 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5494 "You didn't specify an interface on which to capture packets.");
5497 global_capture_opts.use_pcapng =
5498 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pcap_ng_cb));
5499 /* Wireshark always saves to a capture file. */
5500 global_capture_opts.saving_to_file = TRUE;
5501 g_save_file = gtk_entry_get_text(GTK_ENTRY(file_te));
5502 if (g_save_file && g_save_file[0]) {
5503 /* User specified a file to which the capture should be written. */
5504 global_capture_opts.save_file = g_strdup(g_save_file);
5505 global_capture_opts.orig_save_file = g_strdup(g_save_file);
5506 /* Save the directory name for future file dialogs. */
5507 cf_name = g_strdup(g_save_file);
5508 dirname = get_dirname(cf_name); /* Overwrites cf_name */
5509 set_last_open_dir(dirname);
5512 /* User didn't specify a file; save to a temporary file. */
5513 global_capture_opts.save_file = NULL;
5516 global_capture_opts.has_autostop_packets =
5517 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb));
5518 if (global_capture_opts.has_autostop_packets)
5519 global_capture_opts.autostop_packets =
5520 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_packets_sb));
5522 global_capture_opts.has_autostop_duration =
5523 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb));
5524 if (global_capture_opts.has_autostop_duration) {
5525 global_capture_opts.autostop_duration =
5526 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_duration_sb));
5527 global_capture_opts.autostop_duration =
5528 time_unit_combo_box_get_value(stop_duration_cbx, global_capture_opts.autostop_duration);
5531 global_capture_opts.real_time_mode =
5532 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb));
5535 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb));
5537 global_capture_opts.show_info =
5538 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hide_info_cb));
5540 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_resolv_cb)))
5541 gbl_resolv_flags.mac_name = TRUE;
5543 gbl_resolv_flags.mac_name = FALSE;
5544 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(n_resolv_cb)))
5545 gbl_resolv_flags.network_name = TRUE;
5547 gbl_resolv_flags.network_name = FALSE;
5548 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t_resolv_cb)))
5549 gbl_resolv_flags.transport_name = TRUE;
5551 gbl_resolv_flags.transport_name = FALSE;
5552 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(e_resolv_cb)))
5553 gbl_resolv_flags.use_external_net_name_resolver = TRUE;
5555 gbl_resolv_flags.use_external_net_name_resolver = FALSE;
5557 global_capture_opts.has_ring_num_files =
5558 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb));
5560 global_capture_opts.ring_num_files =
5561 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ringbuffer_nbf_sb));
5562 if (global_capture_opts.ring_num_files > RINGBUFFER_MAX_NUM_FILES)
5563 global_capture_opts.ring_num_files = RINGBUFFER_MAX_NUM_FILES;
5564 #if RINGBUFFER_MIN_NUM_FILES > 0
5565 else if (global_capture_opts.ring_num_files < RINGBUFFER_MIN_NUM_FILES)
5566 global_capture_opts.ring_num_files = RINGBUFFER_MIN_NUM_FILES;
5569 global_capture_opts.multi_files_on =
5570 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb));
5572 global_capture_opts.has_file_duration =
5573 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb));
5574 if (global_capture_opts.has_file_duration) {
5575 global_capture_opts.file_duration =
5576 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(file_duration_sb));
5577 global_capture_opts.file_duration =
5578 time_unit_combo_box_get_value(file_duration_cbx, global_capture_opts.file_duration);
5581 global_capture_opts.has_autostop_files =
5582 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb));
5583 if (global_capture_opts.has_autostop_files)
5584 global_capture_opts.autostop_files =
5585 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_files_sb));
5587 if (global_capture_opts.multi_files_on) {
5588 global_capture_opts.has_autostop_filesize =
5589 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb));
5590 if (global_capture_opts.has_autostop_filesize) {
5591 tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ring_filesize_sb));
5592 tmp = size_unit_combo_box_convert_value(ring_filesize_cbx, tmp);
5594 global_capture_opts.autostop_filesize = tmp;
5596 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5597 "%sMultiple files: Requested filesize too large!%s\n\n"
5598 "The setting \"Next file every x byte(s)\" can't be greater than %u bytes (2GiB).",
5599 simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
5604 /* test if the settings are ok for a ringbuffer */
5605 if (global_capture_opts.save_file == NULL) {
5606 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5607 "%sMultiple files: No capture file name given!%s\n\n"
5608 "You must specify a filename if you want to use multiple files.",
5609 simple_dialog_primary_start(), simple_dialog_primary_end());
5611 } else if (!global_capture_opts.has_autostop_filesize && !global_capture_opts.has_file_duration) {
5612 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5613 "%sMultiple files: No file limit given!%s\n\n"
5614 "You must specify a file size or duration at which is switched to the next capture file\n"
5615 "if you want to use multiple files.",
5616 simple_dialog_primary_start(), simple_dialog_primary_end());
5617 g_free(global_capture_opts.save_file);
5618 global_capture_opts.save_file = NULL;
5622 global_capture_opts.has_autostop_filesize =
5623 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb));
5624 if (global_capture_opts.has_autostop_filesize) {
5625 tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_filesize_sb));
5626 tmp = size_unit_combo_box_convert_value(stop_filesize_cbx, tmp);
5628 global_capture_opts.autostop_filesize = tmp;
5630 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5631 "%sStop Capture: Requested filesize too large!%s\n\n"
5632 "The setting \"after x byte(s)\" can't be greater than %u bytes (2GiB).",
5633 simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
5637 } /* multi_files_on */
5641 static GtkTreeModel *
5642 create_and_fill_model(GtkTreeView *view)
5644 GtkListStore *store;
5647 char *temp, *snaplen_string, *linkname;
5649 link_row *linkr = NULL;
5651 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
5655 gboolean hassnap, pmode;
5657 #if defined(HAVE_PCAP_CREATE)
5658 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);
5659 #elif defined(_WIN32) && !defined (HAVE_PCAP_CREATE)
5660 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);
5662 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);
5665 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
5666 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
5667 if (!device.hidden) {
5668 if (device.no_addresses == 0) {
5669 temp = g_strdup_printf("<b>%s</b>", device.display_name);
5671 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
5674 if(capture_dev_user_linktype_find(device.name) != -1) {
5675 device.active_dlt = capture_dev_user_linktype_find(device.name);
5677 for (list = device.links; list != NULL; list = g_list_next(list)) {
5678 linkr = (link_row*)(list->data);
5679 if (linkr->dlt == device.active_dlt) {
5680 linkname = g_strdup(linkr->name);
5685 linkname = g_strdup("unknown");
5686 pmode = capture_dev_user_pmode_find(device.name);
5688 device.pmode = pmode;
5690 hassnap = capture_dev_user_hassnap_find(device.name);
5691 snaplen = capture_dev_user_snaplen_find(device.name);
5692 if(snaplen != -1 && hassnap != -1) {
5693 /* Default snap length set in preferences */
5694 device.snaplen = snaplen;
5695 device.has_snaplen = hassnap;
5697 /* No preferences set yet, use default values */
5698 device.snaplen = WTAP_MAX_PACKET_SIZE;
5699 device.has_snaplen = FALSE;
5702 snaplen_string = g_strdup_printf("%d", device.snaplen);
5704 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
5705 if (capture_dev_user_buffersize_find(device.name) != -1) {
5706 buffer = capture_dev_user_buffersize_find(device.name);
5707 device.buffer = buffer;
5709 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
5712 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
5713 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
5714 gtk_list_store_append (store, &iter);
5715 #if defined(HAVE_PCAP_CREATE)
5716 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);
5717 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
5718 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);
5720 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);
5725 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
5726 return GTK_TREE_MODEL(store);
5730 query_tooltip_tree_view_cb (GtkWidget *widget,
5733 gboolean keyboard_tip,
5734 GtkTooltip *tooltip,
5738 GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
5739 GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
5740 GtkTreePath *path = NULL;
5742 GtkTreeViewColumn *column;
5743 GtkCellRenderer* renderer = NULL;
5744 GList *renderer_list;
5749 if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
5752 gtk_tree_model_get (model, &iter, 0, &tmp, -1);
5754 if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), (gint) x, (gint) y, NULL, &column, NULL, NULL)) {
5755 idx = col_title_to_index((const gchar *)gtk_tree_view_column_get_title(column));
5759 case CAPTURE: g_snprintf (buffer, sizeof(buffer), "Choose which interface (network adapter) will be used to capture packets from. "
5760 "Be sure to select the correct one, as it's a common mistake to select the wrong interface.");
5762 case INTERFACE: g_snprintf (buffer, sizeof(buffer), "Lists the interface name and the IP address(es) assigned to it. ");
5764 case LINK: g_snprintf (buffer, sizeof(buffer), "Link-layer type the interface supports.");
5766 case PMODE: g_snprintf (buffer, sizeof(buffer), "Usually a network adapter will only capture the traffic sent to its own network address. "
5767 "If you want to capture all traffic that the network adapter can \"see\", promiscuous mode should be configured.");
5769 case SNAPLEN: g_snprintf(buffer, sizeof(buffer), "Limit the maximum number of bytes to be captured from each packet. This size includes the "
5770 "link-layer header and all subsequent headers.");
5772 #if defined(HAVE_PCAP_CREATE)
5773 case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
5774 "If you notice packet drops, you can try increasing this size.");
5776 case MONITOR: g_snprintf (buffer, sizeof(buffer), "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture "
5777 "the traffic on the BSS to which it's associated. "
5778 "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", select this option. "
5779 "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
5780 "it might be necessary to turn this option on.\n\n"
5781 "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
5783 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
5784 case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
5785 "If you notice packet drops, you can try increasing this size.");
5788 case FILTER: g_snprintf(buffer, sizeof(buffer), "Selected capture filter to reduce the amount of packets to be captured.");
5790 default: g_snprintf(buffer, sizeof(buffer), "another option");
5793 gtk_tooltip_set_markup (tooltip, buffer);
5794 renderer_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
5795 /* get the first renderer */
5796 if (g_list_first(renderer_list)) {
5797 renderer = (GtkCellRenderer*)g_list_nth_data(renderer_list, 0);
5798 gtk_tree_view_set_tooltip_cell (tree_view, tooltip, path, column, renderer);
5801 gtk_tree_path_free (path);
5806 #if defined (HAVE_PCAP_CREATE)
5808 activate_monitor(GtkTreeViewColumn *tree_column _U_, GtkCellRenderer *renderer,
5809 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data _U_)
5812 GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
5813 int indx = atoi(gtk_tree_path_to_string(path));
5815 device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
5817 if (device.monitor_mode_supported == TRUE) {
5818 g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
5820 g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_INERT, NULL);
5825 /* user requested to destroy the dialog */
5827 capture_prep_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
5830 #ifdef HAVE_PCAP_REMOTE
5832 GtkWidget *remote_w;
5835 if (!cap_open_w || !G_IS_OBJECT(cap_open_w))
5837 /* Is there a file selection dialog associated with this
5838 Capture Options dialog? */
5839 fs = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_FILE_SEL_DIALOG_PTR_KEY);
5841 #ifdef HAVE_PCAP_REMOTE
5842 if_list = (GList *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY);
5843 if (if_list && g_list_length(if_list)>0) {
5844 free_interface_list(if_list);
5848 if (fs != NULL && G_IS_OBJECT(fs)) {
5849 /* Yes. Destroy it. */
5853 /* Note that we no longer have a "Capture Options" dialog box. */
5857 /* update airpcap toolbar */
5858 if (airpcap_if_active)
5859 airpcap_set_toolbar_stop_capture(airpcap_if_active);
5862 #ifdef HAVE_PCAP_REMOTE
5863 if (interface_management_w && G_IS_OBJECT(interface_management_w)) {
5864 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
5866 if (remote_w != NULL)
5867 window_destroy(remote_w);
5872 #ifdef HAVE_PCAP_CREATE
5873 /* user changed the setting of the monitor-mode checkbox */
5875 capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp _U_)
5879 gboolean monitor_mode;
5880 if_capabilities_t *caps;
5881 gint linktype_count = 0, i;
5882 data_link_info_t *data_link_info;
5885 GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
5886 GtkWidget *linktype_lb = (GtkWidget *)g_object_get_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY);
5888 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
5889 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
5892 if_string = g_strdup(device.name);
5893 monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor));
5894 caps = capture_get_if_capabilities(if_string, monitor_mode, NULL, main_window_update);
5897 g_signal_handlers_disconnect_by_func(linktype_combo_box, G_CALLBACK(select_link_type_cb), NULL );
5898 ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box));
5899 for (i = (gint)g_list_length(device.links)-1; i >= 0; i--) {
5900 GList* rem = g_list_nth(device.links, i);
5901 device.links = g_list_remove_link(device.links, rem);
5904 device.active_dlt = -1;
5906 device.monitor_mode_supported = caps->can_set_rfmon;
5907 device.monitor_mode_enabled = monitor_mode;
5908 for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
5909 linkr = (link_row *)g_malloc(sizeof(link_row));
5910 data_link_info = (data_link_info_t *)lt_entry->data;
5912 * For link-layer types libpcap/WinPcap doesn't know about, the
5913 * name will be "DLT n", and the description will be null.
5914 * We mark those as unsupported, and don't allow them to be
5915 * used - capture filters won't work on them, for example.
5917 if (data_link_info->description != NULL) {
5918 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
5919 data_link_info->description,
5920 GINT_TO_POINTER(data_link_info->dlt));
5921 linkr->dlt = data_link_info->dlt;
5922 if (linktype_count == 0) {
5923 device.active_dlt = data_link_info->dlt;
5925 linkr->name = g_strdup(data_link_info->description);
5928 /* XXX - should we just omit them? */
5929 str = g_strdup_printf("%s (not supported)", data_link_info->name);
5930 ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
5933 GINT_TO_POINTER(-1), /* Flag as "not supported" */
5936 linkr->name = g_strdup(str);
5939 device.links = g_list_append(device.links, linkr);
5942 free_if_capabilities(caps);
5944 /* We don't know whether this supports monitor mode or not;
5945 don't ask for monitor mode. */
5946 device.monitor_mode_enabled = FALSE;
5947 device.monitor_mode_supported = FALSE;
5949 gtk_widget_set_sensitive(linktype_lb, linktype_count >= 2);
5950 gtk_widget_set_sensitive(linktype_combo_box, linktype_count >= 2);
5951 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),0);
5952 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
5957 * Adjust the sensitivity of various widgets as per the current setting
5961 capture_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
5963 GtkWidget *multi_files_on_cb, *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
5964 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
5965 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
5966 *sync_cb, *auto_scroll_cb,
5967 *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
5968 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
5969 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
5970 *stop_files_cb, *stop_files_sb, *stop_files_lb;
5972 multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
5973 ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
5974 ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
5975 ringbuffer_nbf_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_LB_KEY);
5976 ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
5977 ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
5978 ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
5979 file_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CB_KEY);
5980 file_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_SB_KEY);
5981 file_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CBX_KEY);
5982 sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
5983 auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
5984 stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
5985 stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
5986 stop_packets_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_LB_KEY);
5987 stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
5988 stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
5989 stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
5990 stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
5991 stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
5992 stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
5993 stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
5994 stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
5995 stop_files_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_LB_KEY);
5997 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb))) {
5998 /* "Update list of packets in real time" captures enabled; we don't
5999 support ring buffer mode for those captures, so turn ring buffer
6000 mode off if it's on, and make its toggle button, and the spin
6001 button for the number of ring buffer files (and the spin button's
6002 label), insensitive. */
6004 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb), FALSE);
6005 gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), FALSE);
6008 /* Auto-scroll mode is meaningful only in "Update list of packets
6009 in real time" captures, so make its toggle button sensitive. */
6010 gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), TRUE);
6012 /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), TRUE);*/
6014 /* "Update list of packets in real time" captures disabled; that
6015 means ring buffer mode is OK, so make its toggle button
6017 /* gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), TRUE);*/
6019 /* Auto-scroll mode is meaningful only in "Update list of packets
6020 in real time" captures, so make its toggle button insensitive. */
6021 gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), FALSE);
6023 /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), FALSE);*/
6026 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb))) {
6027 /* Ring buffer mode enabled. */
6029 /* Force at least one of the "file switch" conditions (we need at least one) */
6030 if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)) == FALSE) &&
6031 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)) == FALSE)) {
6032 if (tb == ring_filesize_cb)
6033 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_duration_cb), TRUE);
6035 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb), TRUE);
6038 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), TRUE);
6039 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb),
6040 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
6041 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb),
6042 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
6044 /* The ring filesize spinbox is sensitive if the "Next capture file
6045 after N kilobytes" checkbox is on. */
6046 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), TRUE);
6047 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),
6048 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
6049 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),
6050 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
6052 /* The ring duration spinbox is sensitive if the "Next capture file
6053 after N seconds" checkbox is on. */
6054 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cb), TRUE);
6055 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_sb),
6056 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)));
6057 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cbx),
6058 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)));
6060 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), FALSE);
6061 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb), FALSE);
6062 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx), FALSE);
6064 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), TRUE);
6065 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb),
6066 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
6067 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb),
6068 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
6070 /* Ring buffer mode disabled. */
6071 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), FALSE);
6072 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), FALSE);
6073 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), FALSE);
6075 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), FALSE);
6076 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),FALSE);
6077 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),FALSE);
6079 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cb), FALSE);
6080 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_sb),FALSE);
6081 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cbx),FALSE);
6083 /* The maximum file size spinbox is sensitive if the "Stop capture
6084 after N kilobytes" checkbox is on. */
6085 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), TRUE);
6086 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb),
6087 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
6088 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx),
6089 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
6091 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), FALSE);
6092 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb), FALSE);
6093 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb), FALSE);
6096 /* The maximum packet count spinbox is sensitive if the "Stop capture
6097 after N packets" checkbox is on. */
6098 gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_sb),
6099 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
6100 gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_lb),
6101 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
6103 /* The capture duration spinbox is sensitive if the "Stop capture
6104 after N seconds" checkbox is on. */
6105 gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_sb),
6106 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
6107 gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_cbx),
6108 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
6111 gboolean capture_dlg_window_present(void)
6113 return (cap_open_w?TRUE:FALSE);
6117 * Refresh everything visible that shows an interface list that
6118 * includes local interfaces.
6121 refresh_local_interface_lists(void)
6123 /* Reload the local interface list. */
6124 scan_local_interfaces(main_window_update);
6126 /* If there's an interfaces dialog up, refresh it. */
6127 if (interfaces_dialog_window_present())
6128 refresh_if_window();
6130 /* If there's a capture options dialog up, refresh it. */
6131 if (capture_dlg_window_present())
6132 capture_dlg_refresh_if();
6134 /* If the welcome screen is up, refresh its interface list. */
6135 if (get_welcome_window() != NULL)
6136 welcome_if_panel_reload();
6138 /* Refresh the 802.11 toolbar. */
6139 tb80211_refresh_interfaces();
6143 * Refresh everything visible that shows an interface list that
6144 * includes non-local interfaces.
6147 refresh_non_local_interface_lists(void)
6149 /* If there's a capture options dialog up, refresh it. */
6150 if (capture_dlg_window_present())
6151 capture_dlg_refresh_if();
6153 /* If the welcome screen is up, refresh its interface list. */
6154 if (get_welcome_window() != NULL)
6155 welcome_if_panel_reload();
6158 #endif /* HAVE_LIBPCAP */
6166 * indent-tabs-mode: nil
6169 * ex: set shiftwidth=2 tabstop=8 expandtab:
6170 * :indentSize=2:tabSize=8:noTabs=true: