2 * Routines for the "Capture Options" dialog and dialog windows popped
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
36 #include <epan/packet.h>
37 #include <epan/addr_resolv.h>
38 #include <epan/prefs.h>
39 #include <wsutil/filesystem.h>
41 #include "../capture.h"
42 #include "../capture_ifinfo.h"
43 #include "../capture-pcap-util.h"
44 #include "../capture_ui_utils.h"
45 #include "../ringbuffer.h"
47 #include "ui/capture_globals.h"
48 #include "ui/iface_lists.h"
49 #include "ui/preference_utils.h"
50 #include "ui/recent.h"
51 #include "ui/recent_utils.h"
52 #include "ui/simple_dialog.h"
55 #include "ui/gtk/main.h"
56 #include "ui/gtk/gui_utils.h"
57 #include "ui/gtk/capture_dlg.h"
58 #include "ui/gtk/filter_dlg.h"
59 #include "ui/gtk/dlg_utils.h"
60 #include "ui/gtk/file_dlg.h"
61 #include "ui/gtk/stock_icons.h"
62 #include "ui/gtk/capture_file_dlg.h"
63 #include "ui/gtk/help_dlg.h"
64 #include "ui/gtk/gtkglobals.h"
65 #include "ui/gtk/cfilter_combo_utils.h"
66 #include "ui/gtk/capture_if_dlg.h"
67 #include "ui/gtk/main_welcome.h"
68 #include "ui/gtk/network_icons.h"
69 #include "ui/gtk/menus.h"
70 #include "ui/gtk/prefs_dlg.h"
71 #include "ui/gtk/main_80211_toolbar.h"
73 #include "ui/gtk/keys.h"
75 #include "ui/gtk/old-gtk-compat.h"
76 #include "ui/gtk/expert_indicators.h"
80 #include "airpcap_loader.h"
81 #include "airpcap_gui_utils.h"
82 #include "airpcap_dlg.h"
86 * Symbolic names for column indices.
96 #if defined(HAVE_PCAP_CREATE)
99 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
114 #define LOCAL_OFFSET 1
116 #define LOCAL_OFFSET 0
119 /* Capture callback data keys */
120 #define E_CAP_IFACE_KEY "cap_iface"
121 #define E_CAP_IFACE_IP_KEY "cap_iface_ip"
122 #define E_CAP_SNAP_CB_KEY "cap_snap_cb"
123 #define E_CAP_LT_CBX_KEY "cap_lt_cbx"
124 #define E_CAP_LT_CBX_LABEL_KEY "cap_lt_cbx_label"
125 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
126 #define E_CAP_BUFFER_SIZE_SB_KEY "cap_buffer_size_sb"
128 #define E_CAP_SNAP_SB_KEY "cap_snap_sb"
129 #define E_CAP_PROMISC_KEY "cap_promisc"
130 #define E_CAP_PROMISC_KEY_ALL "cap_promisc_all"
131 #define E_CAP_KEY_ALL "cap_all"
132 #ifdef HAVE_PCAP_CREATE
133 #define E_CAP_MONITOR_KEY "cap_monitor"
135 #define E_CAP_PCAP_NG_KEY "cap_pcap_ng"
136 #define E_CAP_FILT_KEY "cap_filter_te"
137 #define E_OPT_EDIT_DIALOG_PTR_KEY "cap_edit_opt_dialog"
138 #define E_OPT_EDIT_CALLER_PTR_KEY "cap_edit_opt_caller"
139 #define E_CAP_FILE_TE_KEY "cap_file_te"
140 #define E_CAP_MULTI_FILES_ON_CB_KEY "cap_multi_files_on_cb"
141 #define E_CAP_RING_FILESIZE_CB_KEY "cap_ring_filesize_cb"
142 #define E_CAP_RING_FILESIZE_SB_KEY "cap_ring_filesize_sb"
143 #define E_CAP_RING_FILESIZE_CBX_KEY "cap_ring_filesize_cbx"
144 #define E_CAP_FILE_DURATION_CB_KEY "cap_file_duration_cb"
145 #define E_CAP_FILE_DURATION_SB_KEY "cap_file_duration_sb"
146 #define E_CAP_FILE_DURATION_CBX_KEY "cap_file_duration_cbx"
147 #define E_CAP_RING_NBF_CB_KEY "cap_ring_nbf_cb"
148 #define E_CAP_RING_NBF_SB_KEY "cap_ring_nbf_sb"
149 #define E_CAP_RING_NBF_LB_KEY "cap_ring_nbf_lb"
150 #define E_CAP_STOP_FILES_CB_KEY "cap_stop_files_cb"
151 #define E_CAP_STOP_FILES_SB_KEY "cap_stop_files_sb"
152 #define E_CAP_STOP_FILES_LB_KEY "cap_stop_files_lb"
153 #define E_CAP_SYNC_KEY "cap_sync"
154 #define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll"
155 #define E_CAP_HIDE_INFO_KEY "cap_hide_info"
156 #define E_CAP_STOP_PACKETS_CB_KEY "cap_stop_packets_cb"
157 #define E_CAP_STOP_PACKETS_SB_KEY "cap_stop_packets_sb"
158 #define E_CAP_STOP_PACKETS_LB_KEY "cap_stop_packets_lb"
159 #define E_CAP_STOP_FILESIZE_CB_KEY "cap_stop_filesize_cb"
160 #define E_CAP_STOP_FILESIZE_SB_KEY "cap_stop_filesize_sb"
161 #define E_CAP_STOP_FILESIZE_CBX_KEY "cap_stop_filesize_cbx"
162 #define E_CAP_STOP_DURATION_CB_KEY "cap_stop_duration_cb"
163 #define E_CAP_STOP_DURATION_SB_KEY "cap_stop_duration_sb"
164 #define E_CAP_STOP_DURATION_CBX_KEY "cap_stop_duration_cbx"
165 #define E_CAP_M_RESOLVE_KEY "cap_m_resolve"
166 #define E_CAP_N_RESOLVE_KEY "cap_n_resolve"
167 #define E_CAP_T_RESOLVE_KEY "cap_t_resolve"
168 #define E_CAP_E_RESOLVE_KEY "cap_e_resolve"
170 #define E_CAP_IFTYPE_CBX_KEY "cap_iftype_cbx"
171 #ifdef HAVE_PCAP_REMOTE
172 #define E_CAP_IF_LIST_KEY "cap_if_list"
173 #define E_CAP_DATATX_UDP_CB_KEY "cap_datatx_udp_cb"
174 #define E_CAP_NOCAP_RPCAP_CB_KEY "cap_nocap_rpcap_cb"
175 #define E_CAP_REMOTE_DIALOG_PTR_KEY "cap_remote_dialog"
176 #define E_CAP_REMOTE_CALLER_PTR_KEY "cap_remote_caller"
177 #define E_REMOTE_HOST_TE_KEY "cap_remote_host"
178 #define E_REMOTE_PORT_TE_KEY "cap_remote_port"
179 #define E_REMOTE_AUTH_NULL_KEY "cap_remote_auth_null"
180 #define E_REMOTE_AUTH_PASSWD_KEY "cap_remote_auth_passwd"
181 #define E_REMOTE_USERNAME_LB_KEY "cap_remote_username_lb"
182 #define E_REMOTE_USERNAME_TE_KEY "cap_remote_username_te"
183 #define E_REMOTE_PASSWD_LB_KEY "cap_remote_passwd_lb"
184 #define E_REMOTE_PASSWD_TE_KEY "cap_remote_passwd_te"
185 #define E_REMOTE_OK_BT_KEY "cap_remote_ok_bt"
186 #define E_REMOTE_DEL_BT_KEY "cap_remote_delete_bt"
187 #define E_CAP_CBX_IFTYPE_NOUPDATE_KEY "cap_cbx_iftype_noupdate"
188 #define E_OPT_REMOTE_DIALOG_PTR_KEY "cap_remote_opt_dialog"
189 #define E_OPT_REMOTE_CALLER_PTR_KEY "cap_remote_opt_caller"
191 #ifdef HAVE_PCAP_SETSAMPLING
192 #define E_CAP_SAMP_NONE_RB_KEY "cap_samp_none_rb"
193 #define E_CAP_SAMP_COUNT_RB_KEY "cap_samp_count_rb"
194 #define E_CAP_SAMP_COUNT_SB_KEY "cap_samp_count_sb"
195 #define E_CAP_SAMP_TIMER_RB_KEY "cap_samp_timer_rb"
196 #define E_CAP_SAMP_TIMER_SB_KEY "cap_samp_timer_sb"
198 #define E_CAP_PIPE_TE_KEY "cap_pipe_te"
199 #define E_CAP_PIPE_L_KEY "cap_pipe_list"
200 #define E_CAP_PIPE_DEL_KEY "cap_pipe_delete_key"
201 #define E_CAP_LOCAL_L_KEY "cap_local_list"
202 #define E_CAP_REMOTE_L_KEY "cap_remote_list"
204 #define E_COMPILE_SW_SCROLLW_KEY "compileScrolledWindowInterfaces"
205 #define E_COMPILE_TREE_VIEW_INTERFACES "compileTreeViewInterfaces"
207 #define DUMMY_SNAPLENGTH 65535
208 #define DUMMY_NETMASK 0xFF000000
218 * Keep a static pointer to the current "Capture Options" window, if
219 * any, so that if somebody tries to do "Capture:Options" while there's
220 * already a "Capture Options" window up, we just pop up the existing
221 * one, rather than creating a new one.
222 * Also: Capture:Start obtains info from the "Capture Options" window
223 * if it exists and if its creation is complete.
225 static GtkWidget *cap_open_w = NULL, *opt_edit_w = NULL, *ok_bt, *interface_management_w = NULL;
226 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
227 static GtkWidget *compile_bpf_w = NULL;
229 static gboolean cap_open_complete; /* valid only if cap_open_w != NULL */
230 static const gchar *pipe_name;
231 static const gchar *selected_name;
232 static GtkWidget *columns_menu_object;
233 static GtkUIManager *ui_manager_columns = NULL;
234 static GSList *popup_menu_list = NULL;
235 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
236 static GHashTable *compile_results = NULL;
237 static GtkWidget *all_compile_bt;
240 static gint marked_interface;
241 static gint marked_row;
243 #ifdef HAVE_PCAP_REMOTE
244 static GHashTable *remote_host_list=NULL;
245 static remote_options global_remote_opts;
246 static guint num_selected = 0;
249 static gulong capture_all_handler_id;
250 static gulong promisc_all_handler_id;
253 capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te);
256 capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te);
259 select_link_type_cb(GtkWidget *w, gpointer data);
261 #ifdef HAVE_PCAP_REMOTE
263 capture_remote_cb(GtkWidget *w, gboolean focus_username);
266 select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data);
269 fill_remote_list(void);
273 capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w);
276 capture_prep_destroy_cb(GtkWidget *win, gpointer user_data);
278 #ifdef HAVE_PCAP_CREATE
280 capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp);
284 capture_dlg_prep(gpointer parent_w);
287 create_and_fill_model(GtkTreeView *view);
290 update_options_table(gint indx);
293 update_properties_all(void);
296 query_tooltip_tree_view_cb (GtkWidget *widget,
299 gboolean keyboard_tip,
304 gchar *col_index_to_name(gint indx)
310 case INTERFACE: col_name = g_strdup("INTERFACE");
312 case LINK: col_name = g_strdup("LINK");
314 case PMODE: col_name = g_strdup("PMODE");
316 case SNAPLEN: col_name = g_strdup("SNAPLEN");
318 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
319 case BUFFER: col_name = g_strdup("BUFFER");
322 #if defined (HAVE_PCAP_CREATE)
323 case MONITOR: col_name = g_strdup("MONITOR");
326 case FILTER: col_name = g_strdup("FILTER");
328 default: return NULL;
334 gint col_title_to_index(const gchar *name)
336 if (strcmp(name, "Capture") == 0) return CAPTURE;
337 if (strcmp(name, "Interface") == 0) return INTERFACE;
338 if (strcmp(name, "Link-layer header") == 0) return LINK;
339 if (strcmp(name, "Prom. Mode") == 0) return PMODE;
340 if (strcmp(name, "Snaplen [B]") == 0) return SNAPLEN;
341 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
342 if (strcmp(name, "Buffer [MB]") == 0) return BUFFER;
344 #if defined (HAVE_PCAP_CREATE)
345 if (strcmp(name, "Mon. Mode") == 0) return MONITOR;
347 if (strcmp(name, "Capture Filter") == 0) return FILTER;
352 set_capture_column_visible(gchar *col, gboolean visible _U_)
357 if (visible && !prefs_capture_options_dialog_column_is_visible(col)) {
358 prefs.capture_columns = g_list_append(prefs.capture_columns, col);
359 } else if (!visible && prefs_capture_options_dialog_column_is_visible(col)) {
360 for (curr = g_list_first(prefs.capture_columns); curr; curr = g_list_next(curr)) {
361 col_name = (gchar *)curr->data;
362 if (col_name && (g_ascii_strcasecmp(col_name, col) == 0)) {
363 prefs.capture_columns = g_list_remove(prefs.capture_columns, curr->data);
371 toggle_visible_column_cb (GtkWidget *w _U_, gpointer data)
374 GtkTreeViewColumn *col;
378 col_id = GPOINTER_TO_INT(data);
379 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
380 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
381 col_name = col_index_to_name(col_id);
382 gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
383 set_capture_column_visible(col_name, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
388 set_all_columns_visible (void)
390 GtkTreeViewColumn *col;
395 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
396 for (col_id = 2; col_id < NUM_COLUMNS; col_id++) {
397 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
398 gtk_tree_view_column_set_visible(col, TRUE);
399 if ((name = col_index_to_name(col_id)) != NULL) {
400 set_capture_column_visible(name, TRUE);
404 if (!prefs.gui_use_pref_save) {
408 update_visible_columns_menu ();
412 columns_activate_all_columns_cb(GtkAction *action _U_, gpointer user_data _U_)
414 set_all_columns_visible ();
418 update_visible_tree_view_columns(void)
422 GtkTreeViewColumn *col;
424 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
425 gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(view), INTERFACE), TRUE);
426 for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
427 col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
428 gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_index_to_name(col_id))?TRUE:FALSE);
434 update_visible_columns_menu (void)
436 GtkWidget *menu_columns, *menu_item;
441 menu_columns = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/DisplayedColumns");
444 fprintf (stderr, "Warning: couldn't find menu_columns path=/ColumnsPopup/DisplayedColumns");
447 sub_menu = gtk_menu_new();
448 gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_columns), sub_menu);
450 for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
451 title = col_index_to_name(col_id);
452 menu_item = gtk_check_menu_item_new_with_label(title);
453 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), prefs_capture_options_dialog_column_is_visible(title));
454 g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(toggle_visible_column_cb), GINT_TO_POINTER(col_id));
455 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
456 gtk_widget_show (menu_item);
458 menu_item = gtk_menu_item_new();
459 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
460 gtk_widget_show (menu_item);
462 menu_item = gtk_menu_item_new_with_label ("Display All");
463 gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
464 g_signal_connect(menu_item, "activate", G_CALLBACK(columns_activate_all_columns_cb), NULL);
465 gtk_widget_show (menu_item);
469 columns_pref_cb(GtkAction *action _U_, gpointer user_data)
471 GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/ColumnPreferences");
472 prefs_page_cb( widget , user_data, PREFS_PAGE_CAPTURE);
476 columns_hide_col_cb(GtkAction *action _U_, gpointer user_data _U_)
479 GtkTreeViewColumn *col;
483 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
484 col = (GtkTreeViewColumn *)g_object_get_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY);
485 gtk_tree_view_column_set_visible(col, FALSE);
486 num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MCAPTURE_COLUMNS_COL_KEY));
487 if ((name = col_index_to_name(num)) != NULL) {
488 set_capture_column_visible(name, FALSE);
489 if (!prefs.gui_use_pref_save) {
492 update_visible_columns_menu ();
496 static const char *ui_desc_columns_menu_popup =
498 " <popup name='ColumnsPopup' action='PopupAction'>\n"
499 " <menuitem name='ColumnPreferences' action='/Column Preferences'/>\n"
500 " <menu name='DisplayedColumns' action='/Displayed Columns'>\n"
501 " <menuitem name='Display All' action='/Displayed Columns/Display All'/>\n"
503 " <menuitem name='HideColumn' action='/Hide Column'/>\n"
507 static const GtkActionEntry columns_menu_popup_action_entries[] = {
508 { "/Column Preferences", GTK_STOCK_PREFERENCES, "Column Preferences...", NULL, NULL, G_CALLBACK(columns_pref_cb) },
509 { "/Displayed Columns", NULL, "Displayed Columns", NULL, NULL, NULL },
510 { "/Displayed Columns/Display All", NULL, "Display All", NULL, NULL, G_CALLBACK(columns_activate_all_columns_cb) },
511 { "/Hide Column", NULL, "Hide Column", NULL, NULL, G_CALLBACK(columns_hide_col_cb) },
514 #ifdef HAVE_PCAP_CREATE
516 activate_monitor(GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer,
517 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
521 init_columns_menu(void)
523 GtkActionGroup *columns_action_group;
524 GError *error = NULL;
526 columns_menu_object = gtk_menu_new();
527 /* columns pop-up menu */
528 columns_action_group = gtk_action_group_new ("ColumnsPopUpMenuActionGroup");
530 gtk_action_group_add_actions (columns_action_group, /* the action group */
531 (const GtkActionEntry *)columns_menu_popup_action_entries, /* an array of action descriptions */
532 G_N_ELEMENTS(columns_menu_popup_action_entries), /* the number of entries */
533 columns_menu_object); /* data to pass to the action callbacks */
535 ui_manager_columns = gtk_ui_manager_new ();
536 gtk_ui_manager_insert_action_group (ui_manager_columns,
537 columns_action_group,
538 0); /* the position at which the group will be inserted. */
540 gtk_ui_manager_add_ui_from_string (ui_manager_columns, ui_desc_columns_menu_popup, -1, &error);
543 fprintf (stderr, "Warning: building Packet List Heading Pop-Up failed: %s\n", error->message);
544 g_error_free (error);
548 g_object_set_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY,
549 gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup"));
551 popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_columns);
554 /* stop the currently running capture */
556 capture_stop_cb(GtkWidget *w _U_, gpointer d _U_)
559 if (airpcap_if_active)
560 airpcap_set_toolbar_stop_capture(airpcap_if_active);
563 capture_stop(&global_capture_session);
566 /* restart (stop - delete old file - start) running capture */
568 capture_restart_cb(GtkWidget *w _U_, gpointer d _U_)
571 if (airpcap_if_active)
572 airpcap_set_toolbar_start_capture(airpcap_if_active);
575 capture_restart(&global_capture_session);
585 typedef struct capture_filter_check {
586 enum cfc_state_t state;
588 GtkWidget *filter_te;
590 } capture_filter_check_t;
594 * Idle: filter_text = NULL, state = ?
595 * Pending: filter_text != NULL, state = CFC_PENDING
596 * Unknown: filter_text != NULL, state = CFC_UNKNOWN
597 * Known: filter_text != NULL, state = CFC_VALID || CFC_INVALID
599 * We assume that only one text entry is active at a time.
602 /* We could make this smarter by caching results */
603 static capture_filter_check_t cfc_data;
605 static GMutex *pcap_compile_mtx;
606 static GCond *cfc_data_cond;
607 static GMutex *cfc_data_mtx;
610 #define DEBUG_SYNTAX_CHECK(state1, state2) g_warning("CF state %s -> %s : %s", state1, state2, cfc_data.filter_text)
612 #define DEBUG_SYNTAX_CHECK(state1, state2)
616 check_capture_filter_syntax(void *data _U_) {
617 struct bpf_program fcode;
621 g_mutex_lock(cfc_data_mtx);
622 while (!cfc_data.filter_text || cfc_data.state != CFC_PENDING) {
623 /* Do we really need to use a mutex here? We only have one thread... */
624 g_cond_wait(cfc_data_cond, cfc_data_mtx);
626 cfc_data.state = CFC_UNKNOWN;
627 DEBUG_SYNTAX_CHECK("pending", "unknown");
629 g_mutex_unlock(cfc_data_mtx);
630 g_mutex_lock(pcap_compile_mtx);
632 /* pcap_compile_nopcap will not alter the filter string, so the (char *) cast is "safe" */
633 pc_err = pcap_compile_nopcap(DUMMY_SNAPLENGTH /* use a dummy snaplength for syntax-checking */,
634 cfc_data.dlt, &fcode, cfc_data.filter_text, 1 /* Do optimize */,
635 DUMMY_NETMASK /* use a dummy netmask for syntax-checking */);
637 g_mutex_unlock(pcap_compile_mtx);
638 g_mutex_lock(cfc_data_mtx);
640 if (cfc_data.state == CFC_UNKNOWN) { /* No more input came in */
642 DEBUG_SYNTAX_CHECK("unknown", "known bad");
643 cfc_data.state = CFC_INVALID;
645 DEBUG_SYNTAX_CHECK("unknown", "known good");
646 cfc_data.state = CFC_VALID;
649 g_mutex_unlock(cfc_data_mtx);
655 update_capture_filter_te(gpointer data _U_) {
657 g_mutex_lock(cfc_data_mtx);
659 if (cfc_data.filter_text && cfc_data.filter_te) {
660 if (cfc_data.state == CFC_VALID) {
661 colorize_filter_te_as_valid(cfc_data.filter_te);
662 } else if (cfc_data.state == CFC_INVALID) {
663 colorize_filter_te_as_invalid(cfc_data.filter_te);
665 colorize_filter_te_as_empty(cfc_data.filter_te);
668 if (cfc_data.state == CFC_VALID || cfc_data.state == CFC_INVALID) {
669 DEBUG_SYNTAX_CHECK("known", "idle");
670 /* Reset the current state to idle. */
671 if (cfc_data.filter_text != NULL) {
672 g_free(cfc_data.filter_text);
674 cfc_data.filter_text = NULL;
675 cfc_data.state = CFC_PENDING;
678 g_mutex_unlock(cfc_data_mtx);
682 /** Initialize background capture filter syntax checking
684 void capture_filter_init(void) {
685 cfc_data.filter_text = NULL;
686 cfc_data.filter_te = NULL;
687 cfc_data.state = CFC_PENDING;
689 #if GLIB_CHECK_VERSION(2,31,0)
690 pcap_compile_mtx = g_new(GMutex,1);
691 g_mutex_init(pcap_compile_mtx);
692 cfc_data_cond = g_new(GCond,1);
693 g_cond_init(cfc_data_cond);
694 cfc_data_mtx = g_new(GMutex,1);
695 g_mutex_init(cfc_data_mtx);
696 g_thread_new("Capture filter syntax", check_capture_filter_syntax, NULL);
698 pcap_compile_mtx = g_mutex_new();
699 cfc_data_cond = g_cond_new();
700 cfc_data_mtx = g_mutex_new();
701 g_thread_create(check_capture_filter_syntax, NULL, FALSE, NULL);
704 g_timeout_add(200, update_capture_filter_te, NULL);
708 update_filter_string(gchar *name, gchar *text)
715 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
716 model = gtk_tree_view_get_model(if_cb);
717 gtk_tree_model_get_iter_first(model, &iter);
719 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
720 if (strcmp(name, name_str) == 0) {
721 gtk_list_store_set (GTK_LIST_STORE(model), &iter, FILTER, g_strdup(text), -1);
724 } while (gtk_tree_model_iter_next(model, &iter));
728 capture_all_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
730 GtkWidget *filter_cm, *filter_te;
731 gchar *filter_text = NULL;
734 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
739 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
744 if (global_capture_opts.num_selected > 0) {
747 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
748 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
749 if (!device.selected) {
752 if (device.active_dlt == -1) {
753 colorize_filter_te_as_empty(filter_te);
754 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The link type of interface %s was not specified.", device.name);
755 continue; /* Programming error: somehow managed to select an "unsupported" entry */
757 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
758 if (strlen(filter_text) == 0) {
759 colorize_filter_te_as_empty(filter_te);
760 if (strlen(device.cfilter) > 0) {
761 g_array_remove_index(global_capture_opts.all_ifaces, i);
762 device.cfilter = g_strdup(filter_text);
763 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
764 update_filter_string(device.name, filter_text);
769 g_assert(filter_text != NULL);
770 g_array_remove_index(global_capture_opts.all_ifaces, i);
771 device.cfilter = g_strdup(filter_text);
772 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
773 g_mutex_lock(cfc_data_mtx);
774 /* Ruthlessly clobber the current state. */
775 g_free(cfc_data.filter_text);
776 cfc_data.dlt = device.active_dlt;
777 cfc_data.filter_text = filter_text;
778 cfc_data.filter_te = filter_te;
779 cfc_data.state = CFC_PENDING;
780 DEBUG_SYNTAX_CHECK("?", "pending");
781 g_cond_signal(cfc_data_cond);
782 g_mutex_unlock(cfc_data_mtx);
783 update_filter_string(device.name, filter_text);
789 capture_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
791 GtkWidget *filter_cm, *filter_te, *linktype_combo_box;
795 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
798 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
802 linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
804 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &dlt_ptr)) {
806 * There is no guarantee that we will even know the list of link-layer
807 * header types; we will not have it if, for example, we have a named
808 * pipe rather than an interface, as a named pipe doesn't *have* a
809 * link-layer header type until the capture is started and the
810 * pcap file header or pcap-ng interface description block is
811 * written, and we can't wait for that. We won't have it if we can't
812 * open the interface, either.
814 * We also won't have an active pointer, even if we have the list of
815 * link-layer header types, if none of the types are supported.
817 * Just mark it as empty, as a way of saying "damned if I know whether
818 * this filter is valid".
820 colorize_filter_te_as_empty(filter_te);
823 if ((cfc_data.dlt = GPOINTER_TO_INT(dlt_ptr)) == -1) {
824 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
827 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
829 if (strlen(filter_text) == 0) {
830 colorize_filter_te_as_empty(filter_te);
835 g_mutex_lock(cfc_data_mtx);
836 /* Ruthlessly clobber the current state. */
837 if (cfc_data.filter_text != NULL) {
838 g_free(cfc_data.filter_text);
840 cfc_data.filter_text = filter_text;
841 cfc_data.filter_te = filter_te;
842 cfc_data.state = CFC_PENDING;
843 DEBUG_SYNTAX_CHECK("?", "pending");
844 g_cond_signal(cfc_data_cond);
845 g_mutex_unlock(cfc_data_mtx);
849 capture_filter_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
851 g_mutex_lock(cfc_data_mtx);
852 /* Reset the current state to idle. */
853 if (cfc_data.filter_text != NULL) {
854 g_free(cfc_data.filter_text);
856 cfc_data.filter_text = NULL;
857 cfc_data.filter_te = NULL;
858 cfc_data.state = CFC_PENDING;
859 g_mutex_unlock(cfc_data_mtx);
862 #define TIME_UNIT_SECOND 0
863 #define TIME_UNIT_MINUTE 1
864 #define TIME_UNIT_HOUR 2
865 #define TIME_UNIT_DAY 3
866 #define MAX_TIME_UNITS 4
867 static const char *time_unit_name[MAX_TIME_UNITS] = {
874 /* create one of the duration options */
875 /* (and select the matching unit depending on the given value) */
876 static GtkWidget *time_unit_combo_box_new(guint32 value) {
877 GtkWidget *unit_combo_box;
880 unit_combo_box = gtk_combo_box_text_new ();
881 for (i = 0; i < MAX_TIME_UNITS; i++) {
882 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), time_unit_name[i]);
884 /* the selected combo_box item can't be changed, once the combo_box
885 is created, so set the matching combo_box item now */
887 if (value >= 60 * 60 * 24) {
888 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_DAY);
891 if (value >= 60 * 60) {
892 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_HOUR);
896 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_MINUTE);
899 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_SECOND);
903 return unit_combo_box;
906 /* convert time value from raw to displayed (e.g. 60s -> 1min) */
907 static guint32 time_unit_combo_box_convert_value(
911 if (value >= 60 * 60 * 24) {
912 return value / (60 * 60 * 24);
916 if (value >= 60 * 60) {
917 return value / (60 * 60);
929 /* get raw value from unit and value fields */
930 static guint32 time_unit_combo_box_get_value(
931 GtkWidget *unit_combo_box,
936 unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
939 case(TIME_UNIT_SECOND):
941 case(TIME_UNIT_MINUTE):
943 case(TIME_UNIT_HOUR):
944 return value * 60 * 60;
946 return value * 60 * 60 * 24;
948 g_assert_not_reached();
954 #define SIZE_UNIT_KILOBYTES 0
955 #define SIZE_UNIT_MEGABYTES 1
956 #define SIZE_UNIT_GIGABYTES 2
957 #define MAX_SIZE_UNITS 3
958 static const char *size_unit_name[MAX_SIZE_UNITS] = {
964 /* create one of the size options */
965 /* (and select the matching unit depending on the given value) */
966 static GtkWidget *size_unit_combo_box_new(guint32 value) {
967 GtkWidget *unit_combo_box;
970 unit_combo_box=gtk_combo_box_text_new();
971 for (i=0; i<MAX_SIZE_UNITS; i++){
972 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), size_unit_name[i]);
974 /* the selected combo_box item can't be changed, once the combo_box
975 is created, so set the matching combo_box item now */
977 if (value >= 1024 * 1024) {
978 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_GIGABYTES);
982 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_MEGABYTES);
985 gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_KILOBYTES);
988 return unit_combo_box;
991 /* convert size value from raw to displayed (e.g. 1024 Bytes -> 1 KB) */
992 static guint32 size_unit_combo_box_set_value(
996 if (value >= 1024 * 1024) {
997 return value / (1024 * 1024);
1001 if (value >= 1024) {
1002 return value / (1024);
1009 /* get raw value from unit and value fields */
1010 static guint32 size_unit_combo_box_convert_value(
1011 GtkWidget *unit_combo_box,
1016 unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
1019 case(SIZE_UNIT_KILOBYTES):
1020 if (value > (((guint32)G_MAXINT + 1) / 1024)) {
1025 case(SIZE_UNIT_MEGABYTES):
1026 if (value > (((guint32)G_MAXINT + 1) / (1024 * 1024))) {
1029 return value * 1024;
1031 case(SIZE_UNIT_GIGABYTES):
1032 if (value > (((guint32)G_MAXINT + 1) / (1024 * 1024 * 1024))) {
1035 return value * 1024 * 1024;
1038 g_assert_not_reached();
1045 * Sets the toolbar before calling the advanced dialog with for the right interface
1048 options_airpcap_advanced_cb(GtkWidget *w, gpointer d)
1052 from_widget = (gint*)g_malloc(sizeof(gint));
1053 *from_widget = AIRPCAP_ADVANCED_FROM_OPTIONS;
1054 g_object_set_data(G_OBJECT(wireless_tb),AIRPCAP_ADVANCED_FROM_KEY,from_widget);
1056 airpcap_if_active = airpcap_if_selected;
1057 airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
1058 display_airpcap_advanced_cb(w,d);
1062 #ifdef HAVE_PCAP_REMOTE
1063 /* PCAP interface type menu item */
1064 struct iftype_info {
1069 /* List of available types of PCAP interface */
1070 static struct iftype_info iftype[] = {
1071 { CAPTURE_IFLOCAL, "Local" },
1072 { CAPTURE_IFREMOTE, "Remote..." }
1075 #define REMOTE_HOST_START ((sizeof(iftype) / sizeof(iftype[0])) + 1)
1076 #define REMOTE_HOST_SEPARATOR "---"
1079 iftype_combo_box_add_remote_separators (GtkWidget *iftype_cbx)
1081 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), REMOTE_HOST_SEPARATOR);
1082 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), "Clear list");
1086 iftype_combo_box_add (GtkWidget *iftype_cbx, interface_t *device)
1088 GtkTreeModel *model;
1090 gboolean create_new = FALSE;
1092 guint i, pos = REMOTE_HOST_START;
1093 struct remote_host_info *rh;
1095 rh = g_hash_table_lookup (remote_host_list, device->remote_opts.remote_host_opts.remote_host);
1097 rh = g_malloc0 (sizeof (*rh));
1098 if (g_hash_table_size (remote_host_list) == 0) {
1099 iftype_combo_box_add_remote_separators (iftype_cbx);
1101 gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(iftype_cbx), pos, device->remote_opts.remote_host_opts.remote_host);
1102 rh->remote_host = g_strdup (device->remote_opts.remote_host_opts.remote_host);
1105 model = gtk_combo_box_get_model(GTK_COMBO_BOX(iftype_cbx));
1106 if (gtk_tree_model_get_iter_first(model, &iter)) {
1107 /* Skip the first entries */
1108 for (i = 0; i < REMOTE_HOST_START; i++)
1109 gtk_tree_model_iter_next(model, &iter);
1111 gtk_tree_model_get(model, &iter, 0, &string, -1);
1113 if (strcmp (device->remote_opts.remote_host_opts.remote_host, string) == 0) {
1114 /* Found match, show this position in combo box */
1121 } while (gtk_tree_model_iter_next(model, &iter));
1124 g_free (rh->remote_port);
1125 g_free (rh->auth_username);
1126 g_free (rh->auth_password);
1129 rh->remote_port = g_strdup (device->remote_opts.remote_host_opts.remote_port);
1130 rh->auth_type = device->remote_opts.remote_host_opts.auth_type;
1131 rh->auth_username = g_strdup (device->remote_opts.remote_host_opts.auth_username);
1132 rh->auth_password = g_strdup (device->remote_opts.remote_host_opts.auth_password);
1135 g_hash_table_insert (remote_host_list, g_strdup (device->remote_opts.remote_host_opts.remote_host), rh);
1138 g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(1));
1139 gtk_combo_box_set_active(GTK_COMBO_BOX(iftype_cbx), pos);
1140 g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(0));
1144 iftype_combo_box_add_remote_host (gpointer key, gpointer value _U_, gpointer user_data)
1146 gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(user_data), REMOTE_HOST_START, key);
1148 /* if (g_array_index(global_capture_opts.ifaces, interface_options, 0).src_type == CAPTURE_IFREMOTE) {*/
1149 /* Ensure we select the correct entry */
1150 /* if (strcmp ((char *)key, g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host) == 0) {
1151 gtk_combo_box_set_active(GTK_COMBO_BOX(user_data), REMOTE_HOST_START);
1156 /* Fill the menu of available types of interfaces */
1158 iftype_combo_box_new(void)
1160 GtkWidget *iftype_cbx;
1162 iftype_cbx = gtk_combo_box_text_new_with_entry();
1164 /* for (i = 0; i < sizeof(iftype) / sizeof(iftype[0]); i++) {
1165 gtk_combo_box_text_append_text(GTK_COMBO_BOX(iftype_cbx), iftype[i].name);
1168 if (g_hash_table_size (remote_host_list) > 0) {
1169 /* Add remote hosts */
1170 g_hash_table_foreach (remote_host_list, iftype_combo_box_add_remote_host, iftype_cbx);
1171 iftype_combo_box_add_remote_separators (iftype_cbx);
1174 g_signal_connect(iftype_cbx, "changed", G_CALLBACK(select_if_type_cb), NULL);
1180 iftype_combo_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
1182 gboolean result = FALSE;
1185 gtk_tree_model_get(model, iter, 0, &string, -1);
1187 result = !strcmp (string, REMOTE_HOST_SEPARATOR);
1196 #ifdef HAVE_PCAP_REMOTE
1198 error_list_remote_interface_cb (gpointer dialog _U_, gint btn _U_, gpointer data)
1200 capture_remote_cb(GTK_WIDGET(data), FALSE);
1204 insert_new_rows(GList *list)
1210 char *if_string = NULL, *temp = NULL, *snaplen_string;
1212 if_capabilities_t *caps;
1213 gint linktype_count;
1214 gboolean monitor_mode;
1220 data_link_info_t *data_link_info;
1221 gchar *str = NULL, *link_type_name = NULL;
1222 gboolean found = FALSE;
1225 GtkTreeModel *model;
1226 link_row *linkr = NULL;
1228 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
1229 model = gtk_tree_view_get_model(if_cb);
1230 /* Scan through the list and build a list of strings to display. */
1231 for (if_entry = g_list_first(list); if_entry != NULL; if_entry = g_list_next(if_entry)) {
1232 if_info = (if_info_t *)if_entry->data;
1233 #ifdef HAVE_PCAP_REMOTE
1234 add_interface_to_remote_list(if_info);
1236 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
1237 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
1238 if (strcmp(device.name, if_info->name) == 0) {
1247 ip_str = g_string_new("");
1250 device.name = g_strdup(if_info->name);
1251 /* Is this interface hidden and, if so, should we include it
1253 descr = capture_dev_user_descr_find(if_info->name);
1254 if (descr != NULL) {
1255 /* Yes, we have a user-supplied description; use it. */
1256 if_string = g_strdup_printf("%s: %s", descr, if_info->name);
1259 /* No, we don't have a user-supplied description; did we get
1260 one from the OS or libpcap? */
1261 if (if_info->vendor_description != NULL) {
1263 if_string = g_strdup_printf("%s: %s", if_info->vendor_description, if_info->name);
1266 if_string = g_strdup(if_info->name);
1268 } /* else descr != NULL */
1269 if (if_info->loopback) {
1270 device.display_name = g_strdup_printf("%s (loopback)", if_string);
1272 device.display_name = g_strdup(if_string);
1274 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
1275 if ((device.buffer = capture_dev_user_buffersize_find(if_string)) == -1) {
1276 device.buffer = global_capture_opts.default_options.buffer_size;
1279 if ((device.pmode = capture_dev_user_pmode_find(if_string)) == -1) {
1280 device.pmode = global_capture_opts.default_options.promisc_mode;
1282 device.has_snaplen = global_capture_opts.default_options.has_snaplen;
1283 if ((device.snaplen = capture_dev_user_snaplen_find(if_string)) == -1) {
1284 device.snaplen = global_capture_opts.default_options.snaplen;
1286 device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
1287 monitor_mode = prefs_capture_device_monitor_mode(if_string);
1288 caps = capture_get_if_capabilities(if_string, monitor_mode, NULL, main_window_update);
1289 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1290 for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) {
1292 g_string_append(ip_str, "\n");
1294 addr = (if_addr_t *)curr_addr->data;
1296 switch (addr->ifat_type) {
1298 g_string_append(ip_str, ip_to_str((guint8 *)&addr->addr.ip4_addr));
1301 g_string_append(ip_str, ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr));
1304 /* In case we add non-IP addresses */
1307 } /* for curr_addr */
1309 device.links = NULL;
1311 #ifdef HAVE_PCAP_CREATE
1312 device.monitor_mode_enabled = monitor_mode;
1313 device.monitor_mode_supported = caps->can_set_rfmon;
1315 for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
1316 data_link_info = (data_link_info_t *)lt_entry->data;
1317 linkr = (link_row *)g_malloc(sizeof(link_row));
1319 * For link-layer types libpcap/WinPcap doesn't know about, the
1320 * name will be "DLT n", and the description will be null.
1321 * We mark those as unsupported, and don't allow them to be
1324 if (data_link_info->description != NULL) {
1325 str = g_strdup_printf("%s", data_link_info->description);
1326 linkr->dlt = data_link_info->dlt;
1328 str = g_strdup_printf("%s (not supported)", data_link_info->name);
1331 if (linktype_count == 0) {
1332 link_type_name = g_strdup(str);
1333 device.active_dlt = data_link_info->dlt;
1335 linkr->name = g_strdup(str);
1337 device.links = g_list_append(device.links, linkr);
1339 } /* for link_types */
1341 #if defined(HAVE_PCAP_CREATE)
1342 device.monitor_mode_enabled = FALSE;
1343 device.monitor_mode_supported = FALSE;
1345 device.active_dlt = -1;
1346 link_type_name = g_strdup("default");
1348 device.addresses = g_strdup(ip_str->str);
1349 device.no_addresses = ips;
1351 temp = g_strdup_printf("<b>%s</b>", device.display_name);
1353 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
1355 #ifdef HAVE_PCAP_REMOTE
1356 device.remote_opts.src_type= global_remote_opts.src_type;
1357 if (device.remote_opts.src_type == CAPTURE_IFREMOTE) {
1358 device.local = FALSE;
1360 device.remote_opts.remote_host_opts.remote_host = g_strdup(global_remote_opts.remote_host_opts.remote_host);
1361 device.remote_opts.remote_host_opts.remote_port = g_strdup(global_remote_opts.remote_host_opts.remote_port);
1362 device.remote_opts.remote_host_opts.auth_type = global_remote_opts.remote_host_opts.auth_type;
1363 device.remote_opts.remote_host_opts.auth_username = g_strdup(global_remote_opts.remote_host_opts.auth_username);
1364 device.remote_opts.remote_host_opts.auth_password = g_strdup(global_remote_opts.remote_host_opts.auth_password);
1365 device.remote_opts.remote_host_opts.datatx_udp = global_remote_opts.remote_host_opts.datatx_udp;
1366 device.remote_opts.remote_host_opts.nocap_rpcap = global_remote_opts.remote_host_opts.nocap_rpcap;
1367 device.remote_opts.remote_host_opts.nocap_local = global_remote_opts.remote_host_opts.nocap_local;
1369 device.local = TRUE;
1371 #ifdef HAVE_PCAP_SETSAMPLING
1372 device.remote_opts.sampling_method = global_remote_opts.sampling_method;
1373 device.remote_opts.sampling_param = global_remote_opts.sampling_param;
1375 device.selected = TRUE;
1376 global_capture_opts.num_selected++;
1377 g_array_append_val(global_capture_opts.all_ifaces, device);
1378 if (device.has_snaplen) {
1379 snaplen_string = g_strdup_printf("%d", device.snaplen);
1381 snaplen_string = g_strdup("default");
1384 #if defined(HAVE_PCAP_CREATE)
1385 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);
1386 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
1387 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);
1389 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);
1391 g_string_free(ip_str, TRUE);
1392 #ifdef HAVE_PCAP_REMOTE
1393 add_interface_to_list(global_capture_opts.all_ifaces->len-1);
1396 gtk_tree_view_set_model(GTK_TREE_VIEW(if_cb), model);
1400 #ifdef HAVE_PCAP_REMOTE
1401 /* Retrieve the list of local or remote interfaces according to selected
1402 * options and re-fill interface name combobox */
1404 update_interface_list(void)
1406 GtkWidget *iftype_cbx;
1407 GList *if_list, *if_r_list;
1411 if (cap_open_w == NULL)
1413 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);
1414 iftype_id = CAPTURE_IFREMOTE;
1415 if (iftype_id >= CAPTURE_IFREMOTE) {
1416 if_r_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
1417 global_remote_opts.remote_host_opts.remote_port,
1418 global_remote_opts.remote_host_opts.auth_type,
1419 global_remote_opts.remote_host_opts.auth_username,
1420 global_remote_opts.remote_host_opts.auth_password,
1423 if_list = if_r_list;
1425 if_list = capture_interface_list(&err, &err_str, main_window_update); /* Warning: see capture_prep_cb() */
1426 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY, NULL);
1429 if (if_list == NULL &&
1430 (err == CANT_GET_INTERFACE_LIST || err == DONT_HAVE_PCAP)) {
1431 gpointer dialog = simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
1434 if (iftype_id >= CAPTURE_IFREMOTE) {
1435 /* Fall back to previous interface list */
1436 simple_dialog_set_cb(dialog, error_list_remote_interface_cb, iftype_cbx);
1439 } else if (iftype_id == CAPTURE_IFREMOTE) {
1440 /* New remote interface */
1441 insert_new_rows(if_list);
1442 refresh_non_local_interface_lists();
1446 /* User changed an interface entry of "Remote interface" dialog */
1448 capture_remote_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
1450 GtkWidget *auth_passwd_rb,
1451 *username_lb, *username_te,
1452 *passwd_lb, *passwd_te;
1455 auth_passwd_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1456 E_REMOTE_AUTH_PASSWD_KEY);
1457 username_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1458 E_REMOTE_USERNAME_LB_KEY);
1459 username_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
1460 E_REMOTE_USERNAME_TE_KEY);
1461 passwd_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_LB_KEY);
1462 passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_TE_KEY);
1464 state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb));
1465 gtk_widget_set_sensitive(GTK_WIDGET(username_lb), state);
1466 gtk_widget_set_sensitive(GTK_WIDGET(username_te), state);
1467 gtk_widget_set_sensitive(GTK_WIDGET(passwd_lb), state);
1468 gtk_widget_set_sensitive(GTK_WIDGET(passwd_te), state);
1471 /* user requested to destroy the dialog */
1473 capture_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
1475 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, NULL);
1478 /* user requested to accept remote interface options */
1480 capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w)
1482 GtkWidget *host_te, *port_te, *username_te, *passwd_te, *auth_passwd_rb;
1485 if (remote_w == NULL) {
1489 host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
1490 hostname = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(host_te));
1491 port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
1492 username_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w),
1493 E_REMOTE_USERNAME_TE_KEY);
1494 passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
1495 auth_passwd_rb = (GtkWidget *) g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
1496 g_free(global_remote_opts.remote_host_opts.remote_host);
1497 global_remote_opts.remote_host_opts.remote_host = hostname;
1498 g_free(global_remote_opts.remote_host_opts.remote_port);
1499 global_remote_opts.remote_host_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te)));
1500 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb)))
1501 global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_PWD;
1503 global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_NULL;
1504 g_free(global_remote_opts.remote_host_opts.auth_username);
1505 global_remote_opts.remote_host_opts.auth_username =
1506 g_strdup(gtk_entry_get_text(GTK_ENTRY(username_te)));
1508 g_free(global_remote_opts.remote_host_opts.auth_password);
1509 global_remote_opts.remote_host_opts.auth_password =
1510 g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_te)));
1512 window_destroy(GTK_WIDGET(remote_w));
1513 update_interface_list();
1518 capture_remote_cancel_cb(GtkWidget *win, gpointer data)
1520 window_cancel_button_cb (win, data);
1524 free_remote_host (gpointer key _U_, gpointer value, gpointer user _U_)
1526 struct remote_host *rh = value;
1528 g_free (rh->remote_host);
1529 g_free (rh->remote_port);
1530 g_free (rh->auth_username);
1531 g_free (rh->auth_password);
1537 select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_)
1540 GtkWidget *port_te, *auth_rb, *user_te, *pass_te;
1541 GtkWidget *remote_w;
1542 struct remote_host *rh;
1544 int new_iftype = gtk_combo_box_get_active(GTK_COMBO_BOX(iftype_cbx));
1545 gint num_remote = g_hash_table_size (remote_host_list);
1547 if (new_iftype != -1 && new_iftype == num_remote+1) {
1548 g_hash_table_foreach_remove (remote_host_list, free_remote_host, NULL);
1550 while (num_remote--) { /* Remove separator lines and "Clear" item */
1551 gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT(iftype_cbx), num_remote);
1553 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
1554 window_destroy(GTK_WIDGET(remote_w));
1555 capture_remote_cb(GTK_WIDGET(iftype_cbx), FALSE);
1557 string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(iftype_cbx));
1558 rh = g_hash_table_lookup (remote_host_list, string);
1561 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
1562 port_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
1563 gtk_entry_set_text(GTK_ENTRY(port_te), rh->remote_port);
1564 auth_rb = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
1565 if (rh->auth_type == CAPTURE_AUTH_PWD) {
1566 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), TRUE);
1568 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), FALSE);
1570 user_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY);
1571 gtk_entry_set_text(GTK_ENTRY(user_te), rh->auth_username);
1572 pass_te = g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
1573 gtk_entry_set_text(GTK_ENTRY(pass_te), rh->auth_password);
1578 /* Show remote capture interface parameters dialog */
1580 capture_remote_cb(GtkWidget *w, gboolean focus_username)
1582 GtkWidget *remote_w,
1583 *main_vb, *host_grid,
1584 *host_lb, *host_te, *port_lb, *port_te,
1586 *auth_null_rb, *auth_passwd_rb, *auth_passwd_grid,
1587 *user_lb, *user_te, *passwd_lb, *passwd_te,
1588 *bbox, *ok_but, *cancel_bt;
1592 title = create_user_window_title("Wireshark: Remote Interface");
1593 remote_w = dlg_window_new(title);
1594 gtk_window_set_transient_for(GTK_WINDOW(remote_w), GTK_WINDOW(interface_management_w));
1595 g_object_set_data(G_OBJECT(remote_w), E_CAP_REMOTE_CALLER_PTR_KEY, interface_management_w);
1596 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, remote_w);
1599 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1600 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
1601 gtk_container_add(GTK_CONTAINER(remote_w), main_vb);
1603 /* Host/port table */
1604 host_grid = ws_gtk_grid_new();
1605 ws_gtk_grid_set_row_spacing(GTK_GRID(host_grid), DLG_LABEL_SPACING);
1606 ws_gtk_grid_set_column_spacing(GTK_GRID(host_grid), DLG_UNRELATED_SPACING);
1607 gtk_box_pack_start(GTK_BOX(main_vb), host_grid, FALSE, FALSE, 0);
1610 host_lb = gtk_label_new("Host:");
1611 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_lb, 0, 0, 1, 1);
1613 host_te = iftype_combo_box_new();
1614 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_te, 1, 0, 1, 1);
1617 port_lb = gtk_label_new("Port:");
1618 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_lb, 0, 1, 1, 1);
1620 port_te = gtk_entry_new();
1621 gtk_widget_set_tooltip_text(port_te, "Enter the TCP port number used by RPCAP server at remote host "
1622 "(leave it empty for default port number).");
1623 ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_te, 1, 1, 1, 1);
1625 /* Authentication options frame */
1626 auth_fr = gtk_frame_new("Authentication");
1627 gtk_box_pack_start(GTK_BOX (main_vb), auth_fr, TRUE, TRUE, 0);
1629 auth_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
1630 gtk_container_set_border_width(GTK_CONTAINER(auth_vb), 5);
1631 gtk_container_add(GTK_CONTAINER(auth_fr), auth_vb);
1633 auth_null_rb = gtk_radio_button_new_with_label(NULL,
1634 "Null authentication");
1635 gtk_box_pack_start(GTK_BOX(auth_vb), auth_null_rb, TRUE, TRUE, 0);
1637 auth_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(auth_null_rb));
1638 auth_passwd_rb = gtk_radio_button_new_with_label(auth_group,
1639 "Password authentication");
1640 gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_rb, TRUE, TRUE, 0);
1641 g_signal_connect(auth_passwd_rb, "toggled",
1642 G_CALLBACK(capture_remote_adjust_sensitivity), remote_w);
1644 auth_passwd_grid = ws_gtk_grid_new();
1645 ws_gtk_grid_set_row_spacing(GTK_GRID(auth_passwd_grid), DLG_LABEL_SPACING);
1646 ws_gtk_grid_set_column_spacing(GTK_GRID(auth_passwd_grid), DLG_UNRELATED_SPACING);
1648 gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_grid, FALSE, FALSE, 0);
1650 user_lb = gtk_label_new("Username:");
1651 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_lb, 0, 0, 1, 1);
1653 user_te = gtk_entry_new();
1654 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_te, 1, 0, 1, 1);
1656 passwd_lb = gtk_label_new("Password:");
1657 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_lb, 0, 1, 1, 1);
1659 passwd_te = gtk_entry_new();
1660 gtk_entry_set_visibility(GTK_ENTRY(passwd_te), FALSE);
1661 ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_te, 1, 1, 1, 1);
1663 /* Button row: "Start" and "Cancel" buttons */
1664 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
1665 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
1667 ok_but = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
1668 gtk_widget_set_can_default(ok_but, TRUE);
1669 g_signal_connect(ok_but, "clicked", G_CALLBACK(capture_remote_ok_cb), remote_w);
1670 gtk_widget_set_tooltip_text(ok_but,
1671 "Accept remote host parameters and lookup "
1672 "remote interfaces.");
1673 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_OK_BT_KEY, ok_but);
1674 cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
1675 gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
1676 window_set_cancel_button(remote_w, cancel_bt, capture_remote_cancel_cb);
1678 if (focus_username) {
1679 /* Give the initial focus to the "Username" entry box. */
1680 gtk_widget_grab_focus(user_te);
1683 gtk_widget_grab_default(ok_but);
1685 /* Catch the "activate" signal on the text
1686 entries, so that if the user types Return there, we act as if the
1687 "OK" button had been selected, as happens if Return is typed if some
1688 widget that *doesn't* handle the Return key has the input focus. */
1689 dlg_set_activate(host_te, ok_but);
1690 dlg_set_activate(port_te, ok_but);
1691 dlg_set_activate(user_te, ok_but);
1692 dlg_set_activate(passwd_te, ok_but);
1694 g_signal_connect(remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1695 g_signal_connect(remote_w, "destroy", G_CALLBACK(capture_remote_destroy_cb), NULL);
1697 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY, host_te);
1698 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY, port_te);
1699 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_NULL_KEY, auth_null_rb);
1700 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY, auth_passwd_rb);
1701 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_LB_KEY, user_lb);
1702 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY, user_te);
1703 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_LB_KEY, passwd_lb);
1704 g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY, passwd_te);
1706 if (global_remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD)
1707 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_passwd_rb), TRUE);
1709 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_null_rb), TRUE);
1710 capture_remote_adjust_sensitivity(NULL, remote_w);
1712 gtk_widget_show_all(remote_w);
1713 window_present(remote_w);
1716 /* user requested to destroy the dialog */
1718 options_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
1722 caller = g_object_get_data(G_OBJECT(win), E_OPT_REMOTE_CALLER_PTR_KEY);
1723 g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, NULL);
1726 /* user requested to accept remote interface options */
1728 options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w)
1730 GtkWidget *datatx_udp_cb, *nocap_rpcap_cb;
1731 #ifdef HAVE_PCAP_SETSAMPLING
1732 GtkWidget *samp_none_rb, *samp_count_rb, *samp_timer_rb,
1733 *samp_count_sb, *samp_timer_sb;
1737 if (parent_w == NULL)
1740 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
1741 g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
1742 datatx_udp_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_DATATX_UDP_CB_KEY);
1743 nocap_rpcap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_NOCAP_RPCAP_CB_KEY);
1745 device.remote_opts.remote_host_opts.datatx_udp =
1746 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(datatx_udp_cb));
1747 device.remote_opts.remote_host_opts.nocap_rpcap =
1748 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb));
1750 #ifdef HAVE_PCAP_SETSAMPLING
1751 samp_none_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_NONE_RB_KEY);
1752 samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
1753 samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
1754 samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
1755 samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
1757 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_none_rb)))
1758 device.remote_opts.sampling_method = CAPTURE_SAMP_NONE;
1759 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb))) {
1760 device.remote_opts.sampling_method = CAPTURE_SAMP_BY_COUNT;
1761 device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb));
1762 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb))) {
1763 device.remote_opts.sampling_method = CAPTURE_SAMP_BY_TIMER;
1764 device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb));
1766 #endif /* HAVE_PCAP_SETSAMPLING*/
1767 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
1768 window_destroy(GTK_WIDGET(parent_w));
1770 #endif /*HAVE_PCAP_REMOTE*/
1772 #ifdef HAVE_PCAP_SETSAMPLING
1774 options_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
1776 GtkWidget *samp_count_rb, *samp_timer_rb,
1777 *samp_count_sb, *samp_timer_sb;
1779 samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
1780 samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
1781 samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
1782 samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
1784 if (samp_count_sb && samp_count_rb)
1785 gtk_widget_set_sensitive(GTK_WIDGET(samp_count_sb),
1786 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb)));
1788 if (samp_timer_sb && samp_timer_rb)
1789 gtk_widget_set_sensitive(GTK_WIDGET(samp_timer_sb),
1790 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb)));
1793 #endif /*HAVE_PCAP_SETSAMPLING*/
1794 #ifdef HAVE_PCAP_REMOTE
1796 options_remote_cb(GtkWidget *w _U_, gpointer d _U_)
1798 GtkWidget *opt_remote_w, *main_vb;
1799 GtkWidget *caller, *bbox, *ok_but, *cancel_bt;
1800 GtkWidget *capture_fr, *capture_vb;
1801 GtkWidget *nocap_rpcap_cb, *datatx_udp_cb;
1802 #ifdef HAVE_PCAP_SETSAMPLING
1803 GtkWidget *sampling_fr, *sampling_vb, *sampling_grid, *sampling_lb,
1804 *samp_none_rb, *samp_count_rb, *samp_timer_rb,
1805 *samp_count_sb, *samp_timer_sb;
1806 GtkAdjustment *samp_count_adj, *samp_timer_adj;
1811 caller = gtk_widget_get_toplevel(w);
1812 opt_remote_w = g_object_get_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY);
1813 if (opt_remote_w != NULL) {
1814 reactivate_window(opt_remote_w);
1818 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
1819 opt_remote_w = dlg_window_new("Remote Capture Settings");
1820 gtk_window_set_modal(GTK_WINDOW(opt_remote_w), TRUE);
1821 gtk_window_set_transient_for(GTK_WINDOW(opt_remote_w), GTK_WINDOW(caller));
1822 gtk_window_set_type_hint(GTK_WINDOW(opt_remote_w), GDK_WINDOW_TYPE_HINT_DIALOG);
1824 g_object_set_data(G_OBJECT(opt_remote_w), E_OPT_REMOTE_CALLER_PTR_KEY, caller);
1825 g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, opt_remote_w);
1827 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1828 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
1829 gtk_container_add(GTK_CONTAINER(opt_remote_w), main_vb);
1831 /* Remote capture options */
1832 capture_fr = gtk_frame_new("Capture Options");
1833 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
1835 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1836 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
1837 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
1839 nocap_rpcap_cb = gtk_check_button_new_with_mnemonic("Do not capture own RPCAP traffic");
1840 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb),
1841 device.remote_opts.remote_host_opts.nocap_rpcap);
1842 gtk_box_pack_start(GTK_BOX (capture_vb), nocap_rpcap_cb, TRUE, TRUE, 0);
1844 datatx_udp_cb = gtk_check_button_new_with_mnemonic("Use UDP for data transfer");
1845 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(datatx_udp_cb),
1846 device.remote_opts.remote_host_opts.datatx_udp);
1847 gtk_box_pack_start(GTK_BOX (capture_vb), datatx_udp_cb, TRUE, TRUE, 0);
1850 #ifdef HAVE_PCAP_SETSAMPLING
1851 /* Sampling options */
1852 sampling_fr = gtk_frame_new("Sampling Options");
1853 gtk_box_pack_start(GTK_BOX (main_vb), sampling_fr, TRUE, TRUE, 0);
1855 sampling_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1856 gtk_container_set_border_width(GTK_CONTAINER(sampling_vb), 5);
1857 gtk_container_add(GTK_CONTAINER(sampling_fr), sampling_vb);
1859 sampling_grid = ws_gtk_grid_new();
1860 ws_gtk_grid_set_row_spacing(GTK_GRID(sampling_grid), DLG_LABEL_SPACING);
1861 ws_gtk_grid_set_column_spacing(GTK_GRID(sampling_grid), DLG_UNRELATED_SPACING);
1862 gtk_box_pack_start(GTK_BOX(sampling_vb), sampling_grid, FALSE, FALSE, 0);
1864 /* "No sampling" row */
1865 samp_none_rb = gtk_radio_button_new_with_label(NULL, "None");
1866 if (device.remote_opts.sampling_method == CAPTURE_SAMP_NONE)
1867 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_none_rb), TRUE);
1868 g_signal_connect(samp_none_rb, "toggled",
1869 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1870 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_none_rb, 0, 0, 1, 1);
1872 /* "Sampling by counter" row */
1873 samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_none_rb));
1874 samp_count_rb = gtk_radio_button_new_with_label(samp_group, "1 of");
1875 if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_COUNT)
1876 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_count_rb), TRUE);
1877 g_signal_connect(samp_count_rb, "toggled",
1878 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1879 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_rb, 0, 1, 1, 1);
1881 samp_count_adj = (GtkAdjustment *) gtk_adjustment_new(
1882 (gfloat)device.remote_opts.sampling_param,
1883 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
1884 samp_count_sb = gtk_spin_button_new(samp_count_adj, 0, 0);
1885 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_count_sb), TRUE);
1886 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_sb, 1, 1, 1, 1);
1888 sampling_lb = gtk_label_new("packets");
1889 gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
1890 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 1, 1, 1);
1892 /* "Sampling by timer" row */
1893 samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_count_rb));
1894 samp_timer_rb = gtk_radio_button_new_with_label(samp_group, "1 every");
1895 if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_TIMER)
1896 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_timer_rb), TRUE);
1897 g_signal_connect(samp_timer_rb, "toggled",
1898 G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
1899 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_timer_rb, 0, 2, 1, 1);
1901 samp_timer_adj = (GtkAdjustment *) gtk_adjustment_new(
1902 (gfloat)device.remote_opts.sampling_param,
1903 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
1904 samp_timer_sb = gtk_spin_button_new(samp_timer_adj, 0, 0);
1905 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_timer_sb), TRUE);
1906 ws_gtk_grid_attach_defaults(GTK_GRID(sampling_grid), samp_timer_sb, 1, 2, 1, 1);
1908 sampling_lb = gtk_label_new("milliseconds");
1909 gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
1910 ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 2, 1, 1);
1913 /* Button row: "Start" and "Cancel" buttons */
1914 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
1915 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
1917 ok_but = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
1918 g_signal_connect(ok_but, "clicked", G_CALLBACK(options_remote_ok_cb), opt_remote_w);
1919 gtk_widget_set_tooltip_text(ok_but, "Accept parameters and close dialog");
1920 cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
1921 gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
1922 window_set_cancel_button(opt_remote_w, cancel_bt, window_cancel_button_cb);
1924 gtk_widget_grab_default(ok_but);
1926 g_signal_connect(opt_remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1927 g_signal_connect(opt_remote_w, "destroy", G_CALLBACK(options_remote_destroy_cb), NULL);
1929 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_NOCAP_RPCAP_CB_KEY, nocap_rpcap_cb);
1930 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_DATATX_UDP_CB_KEY, datatx_udp_cb);
1932 #ifdef HAVE_PCAP_SETSAMPLING
1933 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_NONE_RB_KEY, samp_none_rb);
1934 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_RB_KEY, samp_count_rb);
1935 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_SB_KEY, samp_count_sb);
1936 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_RB_KEY, samp_timer_rb);
1937 g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_SB_KEY, samp_timer_sb);
1940 #ifdef HAVE_PCAP_SETSAMPLING
1941 /* Set the sensitivity of various widgets as per the settings of other
1943 options_prep_adjust_sensitivity(NULL, opt_remote_w);
1946 gtk_widget_show_all(opt_remote_w);
1947 window_present(opt_remote_w);
1951 recent_print_remote_host (gpointer key _U_, gpointer value, gpointer user)
1954 struct remote_host_info *ri = value;
1956 fprintf (rf, RECENT_KEY_REMOTE_HOST ": %s,%s,%d\n", ri->remote_host, ri->remote_port, ri->auth_type);
1960 capture_remote_combo_recent_write_all(FILE *rf)
1962 if (remote_host_list && g_hash_table_size (remote_host_list) > 0) {
1963 /* Write all remote interfaces to the recent file */
1964 g_hash_table_foreach (remote_host_list, recent_print_remote_host, rf);
1969 capture_remote_combo_add_recent(const gchar *s)
1971 GList *vals = prefs_get_string_list (s);
1975 struct remote_host_info *rh;
1980 if (remote_host_list == NULL) {
1981 remote_host_list = g_hash_table_new (g_str_hash, g_str_equal);
1984 rh = g_malloc (sizeof (*rh));
1986 /* First value is the host */
1987 rh->remote_host = g_strdup (valp->data);
1988 if (strlen(rh->remote_host) == 0) {
1989 /* Empty remote host */
1990 g_free(rh->remote_host);
1994 rh->auth_type = CAPTURE_AUTH_NULL;
1998 /* Found value 2, this is the port number */
1999 rh->remote_port = g_strdup (valp->data);
2002 /* Did not find a port number */
2003 rh->remote_port = g_strdup ("");
2007 /* Found value 3, this is the authentication type */
2008 auth_type = strtol(valp->data, &p, 0);
2009 if (p != valp->data && *p == '\0') {
2010 rh->auth_type = auth_type;
2014 /* Do not store username and password */
2015 rh->auth_username = g_strdup ("");
2016 rh->auth_password = g_strdup ("");
2018 prefs_clear_string_list(vals);
2020 g_hash_table_insert (remote_host_list, g_strdup(rh->remote_host), rh);
2025 #endif /* HAVE_PCAP_REMOTE */
2027 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2030 compile_bpf_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
2032 /* Note that we no longer have an "About Wireshark" dialog box. */
2033 compile_bpf_w = NULL;
2037 select_first_entry(void)
2040 GtkTreeModel *model;
2042 GtkTreeSelection *selection;
2044 view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
2045 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
2046 gtk_tree_model_get_iter_first(model, &iter);
2047 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
2048 gtk_tree_selection_select_iter(selection, &iter);
2052 add_page(gchar *name, gchar *text, gboolean error)
2054 GtkWidget *view, *icon;
2055 GtkTreeModel *model;
2058 view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
2059 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
2060 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
2062 icon = pixbuf_to_widget(expert_error_pb_data);
2063 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 1, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
2065 icon = pixbuf_to_widget(expert_ok_pb_data);
2066 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 0, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
2068 g_hash_table_insert(compile_results, name, text);
2072 compile_tree_select_cb(GtkTreeSelection *sel, gpointer dummy _U_)
2075 GtkTreeModel *model;
2077 GtkWidget *textview;
2078 GtkTextBuffer *buffer;
2081 if (gtk_tree_selection_get_selected(sel, &model, &iter))
2083 gtk_tree_model_get(model, &iter, COMPILE_ERROR, &error, INAME, &name, -1);
2084 text = (gchar *)g_hash_table_lookup(compile_results, name);
2085 textview = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB);
2087 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
2089 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
2091 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
2092 gtk_text_buffer_set_text(buffer, text, -1);
2093 gtk_widget_show_all(compile_bpf_w);
2098 compile_results_prep(GtkWidget *w _U_, gpointer data _U_)
2100 GtkWidget *main_box, *main_vb, *bbox, *ok_btn, *top_hb, *ct_sb;
2101 GtkListStore *store;
2102 GtkWidget *view, *scrolled_win, *textview;
2103 GtkTreeSelection *selection;
2104 GtkCellRenderer *renderer;
2105 GtkTreeViewColumn *column;
2106 PangoFontDescription *font;
2108 if (compile_bpf_w != NULL) {
2109 /* There's already an "About Wireshark" dialog box; reactivate it. */
2110 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The requested dialog is already open. Please close it first.");
2114 compile_bpf_w = dlg_window_new("Compile selected BPFs");
2115 /* set the initial position (must be done, before show is called!) */
2116 /* default position is not appropriate for the about dialog */
2117 gtk_window_set_position(GTK_WINDOW(compile_bpf_w), GTK_WIN_POS_CENTER_ON_PARENT);
2118 gtk_window_set_default_size(GTK_WINDOW(compile_bpf_w), 600, 400);
2119 gtk_window_set_modal(GTK_WINDOW(compile_bpf_w), TRUE);
2120 gtk_window_set_transient_for(GTK_WINDOW(compile_bpf_w), GTK_WINDOW(cap_open_w));
2121 gtk_container_set_border_width(GTK_CONTAINER(compile_bpf_w), 6);
2123 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
2124 gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
2125 gtk_container_add(GTK_CONTAINER(compile_bpf_w), main_box);
2126 gtk_widget_show(main_box);
2128 /* Top row: Interfaces tree and notebook */
2129 top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
2130 gtk_box_pack_start(GTK_BOX(main_box), top_hb, TRUE, TRUE, 0);
2131 gtk_widget_show(top_hb);
2133 /* scrolled window on the left for the categories tree */
2134 ct_sb = scrolled_window_new(NULL, NULL);
2135 gtk_widget_set_size_request(GTK_WIDGET(ct_sb), 50, -1);
2136 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct_sb),
2138 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct_sb),
2139 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2140 gtk_box_pack_start(GTK_BOX(top_hb), ct_sb, TRUE, TRUE, 0);
2141 gtk_widget_show(ct_sb);
2142 g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_SW_SCROLLW_KEY, ct_sb);
2144 store = gtk_list_store_new(3, G_TYPE_UINT, GDK_TYPE_PIXBUF, G_TYPE_STRING);
2145 view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
2146 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL (store));
2147 g_object_set(G_OBJECT(view), "headers-visible", FALSE, NULL);
2148 g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES, view);
2149 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
2150 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
2151 column = gtk_tree_view_column_new();
2152 renderer = gtk_cell_renderer_text_new();
2153 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2154 gtk_tree_view_column_set_attributes(column, renderer, "text", COMPILE_ERROR, NULL);
2155 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2156 gtk_tree_view_column_set_visible(column, FALSE);
2157 column = gtk_tree_view_column_new();
2158 renderer = gtk_cell_renderer_pixbuf_new();
2159 gtk_tree_view_column_pack_start(column, renderer, FALSE);
2160 gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", SIGN, NULL);
2161 renderer = gtk_cell_renderer_text_new();
2162 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2163 gtk_tree_view_column_set_attributes(column, renderer, "text", INAME, NULL);
2164 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
2165 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 0), TRUE);
2167 g_signal_connect(selection, "changed", G_CALLBACK(compile_tree_select_cb), NULL);
2168 gtk_container_add(GTK_CONTAINER(ct_sb), view);
2169 gtk_widget_show(view);
2171 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
2172 gtk_box_pack_start(GTK_BOX(top_hb), main_vb, TRUE, TRUE, 0);
2173 gtk_widget_show(main_vb);
2174 g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, main_vb);
2176 font = pango_font_description_from_string("Monospace");
2177 textview = gtk_text_view_new();
2178 #if GTK_CHECK_VERSION(3, 0, 0)
2179 gtk_widget_override_font(textview, font);
2181 gtk_widget_modify_font(textview, font);
2183 scrolled_win = gtk_scrolled_window_new(NULL, NULL);
2184 gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
2185 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
2186 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2187 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
2189 gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
2190 gtk_box_pack_start(GTK_BOX(main_vb), scrolled_win, TRUE, TRUE, 0);
2191 g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, textview);
2194 bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
2195 gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
2197 ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
2198 gtk_widget_grab_focus(ok_btn);
2199 gtk_widget_grab_default(ok_btn);
2200 window_set_cancel_button(compile_bpf_w, ok_btn, window_cancel_button_cb);
2202 g_signal_connect(compile_bpf_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2203 g_signal_connect(compile_bpf_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
2205 gtk_widget_show_all(compile_bpf_w);
2206 window_present(compile_bpf_w);
2208 compile_results = g_hash_table_new(g_str_hash, g_str_equal);
2212 capture_all_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
2215 struct bpf_program fcode;
2217 GtkWidget *filter_cm;
2220 gboolean set = FALSE;
2222 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
2227 if (global_capture_opts.all_ifaces->len > 0) {
2230 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
2231 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
2232 if (!device.selected || device.hidden) {
2235 if (device.active_dlt == -1) {
2236 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2240 compile_results_prep(NULL, NULL);
2242 pd = pcap_open_dead(device.active_dlt, DUMMY_SNAPLENGTH);
2244 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
2245 g_mutex_lock(pcap_compile_mtx);
2246 #ifdef PCAP_NETMASK_UNKNOWN
2247 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0)
2249 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0)
2252 g_mutex_unlock(pcap_compile_mtx);
2253 add_page(device.name, g_strdup(pcap_geterr(pd)), TRUE);
2255 GString *bpf_code_dump = g_string_new("");
2256 struct bpf_insn *insn = fcode.bf_insns;
2257 int ii, n = fcode.bf_len;
2258 gchar *bpf_code_str;
2260 for (ii = 0; ii < n; ++insn, ++ii) {
2261 g_string_append(bpf_code_dump, bpf_image(insn, ii));
2262 g_string_append(bpf_code_dump, "\n");
2264 bpf_code_str = g_string_free(bpf_code_dump, FALSE);
2265 g_mutex_unlock(pcap_compile_mtx);
2266 add_page(device.name, g_strdup(bpf_code_str), FALSE);
2267 g_free(bpf_code_str);
2269 g_free(filter_text);
2273 select_first_entry();
2275 #endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
2278 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2280 compile_results_win(gchar *text, gboolean error)
2282 GtkWidget *main_box, *bbox, *ok_btn, *results_w;
2283 GtkWidget *scrolled_win, *textview;
2284 PangoFontDescription *font;
2285 GtkTextBuffer *buffer;
2287 results_w = dlg_window_new("Compile results");
2288 /* set the initial position (must be done, before show is called!) */
2289 /* default position is not appropriate for the about dialog */
2290 gtk_window_set_position(GTK_WINDOW(results_w), GTK_WIN_POS_CENTER_ON_PARENT);
2291 gtk_window_set_default_size(GTK_WINDOW(results_w), 400, 400);
2292 gtk_window_set_modal(GTK_WINDOW(results_w), TRUE);
2293 gtk_window_set_transient_for(GTK_WINDOW(results_w), GTK_WINDOW(opt_edit_w));
2294 gtk_container_set_border_width(GTK_CONTAINER(results_w), 6);
2295 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
2296 gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
2297 gtk_container_add(GTK_CONTAINER(results_w), main_box);
2298 gtk_widget_show(main_box);
2299 font = pango_font_description_from_string("Monospace");
2300 textview = gtk_text_view_new();
2301 #if GTK_CHECK_VERSION(3, 0, 0)
2302 gtk_widget_override_font(textview, font);
2304 gtk_widget_modify_font(textview, font);
2306 scrolled_win = gtk_scrolled_window_new(NULL, NULL);
2307 gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
2308 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
2309 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2310 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
2312 gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
2313 gtk_box_pack_start(GTK_BOX(main_box), scrolled_win, TRUE, TRUE, 0);
2315 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
2317 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
2319 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
2320 gtk_text_buffer_set_text(buffer, g_strdup(text), -1);
2322 bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
2323 gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
2325 ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
2326 gtk_widget_grab_focus(ok_btn);
2327 gtk_widget_grab_default(ok_btn);
2328 window_set_cancel_button(results_w, ok_btn, window_cancel_button_cb);
2330 g_signal_connect(results_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2331 g_signal_connect(results_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
2333 gtk_widget_show_all(results_w);
2334 window_present(results_w);
2339 capture_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
2342 struct bpf_program fcode;
2344 GtkWidget *filter_cm;
2348 GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
2350 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
2351 g_assert_not_reached(); /* Programming error: somehow nothing is active */
2353 if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
2354 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2356 pd = pcap_open_dead(dlt, DUMMY_SNAPLENGTH);
2357 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
2358 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
2359 g_mutex_lock(pcap_compile_mtx);
2360 #ifdef PCAP_NETMASK_UNKNOWN
2361 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0) {
2363 if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0) {
2365 g_mutex_unlock(pcap_compile_mtx);
2366 compile_results_win(g_strdup(pcap_geterr(pd)), 1);
2368 GString *bpf_code_dump = g_string_new("");
2369 struct bpf_insn *insn = fcode.bf_insns;
2370 int i, n = fcode.bf_len;
2372 gchar *bpf_code_str;
2374 g_mutex_unlock(pcap_compile_mtx);
2376 for (i = 0; i < n; ++insn, ++i) {
2377 g_string_append(bpf_code_dump, bpf_image(insn, i));
2378 g_string_append(bpf_code_dump, "\n");
2381 bpf_code_str = g_string_free(bpf_code_dump, FALSE);
2382 compile_results_win(g_strdup(bpf_code_str), 0);
2384 g_free(bpf_code_str);
2386 g_free(filter_text);
2390 #endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
2393 options_edit_destroy_cb(GtkWidget *win, gpointer user_data _U_)
2397 caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_EDIT_CALLER_PTR_KEY);
2398 g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, NULL);
2402 update_options_table(gint indx)
2407 GtkTreeModel *model;
2409 gchar *temp, *path_str, *snaplen_string, *linkname;
2411 link_row *linkr = NULL;
2414 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2416 if (!device.hidden) {
2417 if (device.no_addresses == 0) {
2418 temp = g_strdup_printf("<b>%s</b>", device.display_name);
2420 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
2423 for (list=device.links; list!=NULL; list=g_list_next(list))
2425 linkr = (link_row*)(list->data);
2426 if (linkr->dlt == device.active_dlt) {
2427 linkname = g_strdup(linkr->name);
2432 linkname = g_strdup("unknown");
2433 if (device.has_snaplen) {
2434 snaplen_string = g_strdup_printf("%d", device.snaplen);
2436 snaplen_string = g_strdup("default");
2439 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
2440 path_str = g_strdup_printf("%d", indx);
2441 path = gtk_tree_path_new_from_string(path_str);
2442 model = gtk_tree_view_get_model(if_cb);
2443 gtk_tree_model_get_iter(model, &iter, path);
2444 gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1);
2445 if (enabled == FALSE) {
2446 device.selected = TRUE;
2447 global_capture_opts.num_selected++;
2448 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2449 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2451 #if defined(HAVE_PCAP_CREATE)
2452 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);
2453 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
2454 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);
2456 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);
2458 if (global_capture_opts.num_selected > 0) {
2459 gtk_widget_set_sensitive(ok_bt, TRUE);
2460 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2461 gtk_widget_set_sensitive(all_compile_bt, TRUE);
2464 gtk_widget_set_sensitive(ok_bt, FALSE);
2465 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2466 gtk_widget_set_sensitive(all_compile_bt, FALSE);
2469 gtk_tree_path_free (path);
2472 if (interfaces_dialog_window_present()) {
2473 update_selected_interface(g_strdup(device.name));
2475 if (get_welcome_window() != NULL) {
2476 change_interface_selection(g_strdup(device.name), device.selected);
2480 set_sensitivity_for_start_icon();
2485 save_options_cb(GtkWidget *win _U_, gpointer user_data _U_)
2487 GtkWidget *snap_cb, *snap_sb, *promisc_cb,
2488 #ifdef HAVE_PCAP_CREATE
2491 *filter_cm, *linktype_combo_box;
2492 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2493 GtkWidget *buffer_size_sb;
2497 gpointer ptr = NULL;
2501 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2502 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2503 snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
2504 snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
2505 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2506 buffer_size_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY);
2508 promisc_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY);
2509 #ifdef HAVE_PCAP_CREATE
2510 monitor_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY);
2512 filter_cm = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
2514 linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
2516 if (device.links != NULL) {
2517 if (ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
2518 /* Even though device.links != NULL, we might not have an active pointer
2519 * if all of the available links are unsupported, so the failure of
2520 * ws_combo_box_get_active_pointer() is not cause for
2521 * g_assert_not_reached().
2523 if (ptr != NULL && (dlt = GPOINTER_TO_INT(ptr)) == -1)
2524 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
2527 device.active_dlt = dlt;
2528 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2529 device.buffer = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_sb));
2531 device.pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb));
2532 device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
2533 if (device.has_snaplen) {
2534 if (device.snaplen != (guint)gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb))) {
2536 device.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
2537 if (device.snaplen < 1)
2538 device.snaplen = WTAP_MAX_PACKET_SIZE;
2539 else if (device.snaplen < MIN_PACKET_SIZE)
2540 device.snaplen = MIN_PACKET_SIZE;
2542 device.snaplen = WTAP_MAX_PACKET_SIZE;
2544 filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(filter_cm));
2546 g_free(device.cfilter);
2547 g_assert(filter_text != NULL);
2548 device.cfilter = filter_text;
2549 #ifdef HAVE_PCAP_CREATE
2550 /* if dumpcap reported that the interface does not support monitor
2551 mode, we disable monitor mode even if the user explicitly selected it */
2552 device.monitor_mode_enabled = device.monitor_mode_supported ?
2553 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor_cb)) : FALSE;
2555 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2556 window_destroy(opt_edit_w);
2557 update_options_table(marked_row);
2558 update_properties_all();
2562 adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_)
2564 GtkWidget *snap_cb, *snap_sb;
2567 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
2568 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
2570 snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
2571 snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
2573 /* The snapshot length spinbox is sensitive if the "Limit each packet
2574 to" checkbox is on. */
2575 gtk_widget_set_sensitive(GTK_WIDGET(snap_sb),
2576 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)));
2577 device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
2578 if (!device.has_snaplen) {
2579 gtk_spin_button_set_value(GTK_SPIN_BUTTON (snap_sb), WTAP_MAX_PACKET_SIZE);
2580 device.snaplen = WTAP_MAX_PACKET_SIZE;
2582 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
2585 void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata)
2587 GtkWidget *caller, *window, *swindow = NULL, *if_view,
2588 *main_vb, *if_hb, *if_lb, *if_lb_name,
2590 #if defined (HAVE_AIRPCAP) || defined (HAVE_PCAP_REMOTE) || defined (HAVE_PCAP_CREATE)
2593 *capture_fr, *capture_vb,
2594 *if_ip_hb, *if_ip_lb = NULL, *if_ip_name,
2595 *if_vb_left, *if_vb_right,
2596 *linktype_hb, *linktype_lb, *linktype_combo_box,
2597 *snap_hb, *snap_cb, *snap_sb, *snap_lb,
2599 #ifdef HAVE_PCAP_CREATE
2602 *filter_hb, *filter_bt, *filter_te, *filter_cm,
2603 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2606 *bbox, *ok_but, *cancel_bt,
2608 GList *cf_entry, *list, *cfilter_list;
2609 GtkAdjustment *snap_adj;
2610 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2611 GtkAdjustment *buffer_size_adj;
2612 GtkWidget *buffer_size_lb, *buffer_size_sb, *buffer_size_hb;
2614 #ifdef HAVE_PCAP_REMOTE
2615 GtkWidget *remote_bt;
2618 GtkWidget *advanced_bt;
2621 GtkTreeModel *model;
2624 gboolean found = FALSE;
2625 gint num_link_types, num_supported_link_types, first_supported_index;
2628 GtkCellRenderer *renderer;
2629 GtkListStore *store;
2630 const gchar *new_cfilter;
2632 window = (GtkWidget *)userdata;
2633 caller = gtk_widget_get_toplevel(GTK_WIDGET(window));
2634 opt_edit_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY);
2635 if (opt_edit_w != NULL) {
2636 reactivate_window(opt_edit_w);
2641 device.display_name = NULL;
2642 device.no_addresses = 0;
2643 device.addresses = NULL;
2644 device.links = NULL;
2645 device.active_dlt = -1;
2646 device.pmode = FALSE;
2647 #ifdef HAVE_PCAP_CREATE
2648 device.monitor_mode_enabled = FALSE;
2649 device.monitor_mode_supported = FALSE;
2651 device.has_snaplen = FALSE;
2652 device.snaplen = 65535;
2653 device.cfilter = NULL;
2654 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2655 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
2658 model = gtk_tree_view_get_model(view);
2659 gtk_tree_model_get_iter (model, &iter, path);
2661 if (window == get_welcome_window()) {
2662 gtk_tree_model_get(model, &iter, IFACE_NAME, &name, -1);
2663 } else if (window == cap_open_w) {
2664 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name, -1);
2669 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
2670 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
2671 if (strcmp(device.name, name) == 0) {
2672 marked_interface = i;
2676 marked_row = atoi(gtk_tree_path_to_string(path));
2677 opt_edit_w = dlg_window_new("Edit Interface Settings");
2678 gtk_window_set_modal(GTK_WINDOW(opt_edit_w), TRUE);
2679 gtk_window_set_type_hint (GTK_WINDOW (opt_edit_w), GDK_WINDOW_TYPE_HINT_DIALOG);
2680 g_object_set_data(G_OBJECT(opt_edit_w), E_OPT_EDIT_CALLER_PTR_KEY, caller);
2681 g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, opt_edit_w);
2683 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2684 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
2685 gtk_container_add(GTK_CONTAINER(opt_edit_w), main_vb);
2687 /* Capture-related options frame */
2688 capture_fr = gtk_frame_new("Capture");
2689 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
2691 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2692 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
2693 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
2696 if_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2697 gtk_box_pack_start(GTK_BOX(capture_vb), if_hb, FALSE, FALSE, 3);
2699 if_lb = gtk_label_new("Interface: ");
2700 gtk_box_pack_start(GTK_BOX(if_hb), if_lb, FALSE, FALSE, 3);
2702 if_lb_name = gtk_label_new(device.display_name);
2703 gtk_box_pack_start(GTK_BOX(if_hb), if_lb_name, FALSE, FALSE, 3);
2705 /* IP addresses row */
2706 if_ip_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2708 gtk_widget_set_tooltip_text(if_ip_hb, "Lists the IP address(es) "
2709 "assigned to the selected interface. ");
2710 if_vb_left = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2711 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_left, FALSE, FALSE, 3);
2712 if_vb_right = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2714 if_ip_lb = gtk_label_new("IP address:");
2715 gtk_misc_set_alignment(GTK_MISC(if_ip_lb), 0, 0); /* Left justified */
2716 gtk_box_pack_start(GTK_BOX(if_vb_left), if_ip_lb, FALSE, FALSE, 0);
2717 if (device.no_addresses > 0) {
2718 gchar *temp_addresses = g_strdup(device.addresses);
2719 gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, TRUE, TRUE, 0);
2720 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, TRUE, TRUE, 3);
2721 swindow = gtk_scrolled_window_new (NULL, NULL);
2722 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
2723 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2724 gtk_widget_set_size_request(GTK_WIDGET(swindow),-1, 50);
2725 if_view = gtk_tree_view_new ();
2726 g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL);
2727 renderer = gtk_cell_renderer_text_new();
2728 column = gtk_tree_view_column_new_with_attributes ("",
2729 GTK_CELL_RENDERER(renderer),
2732 gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
2733 store = gtk_list_store_new(1, G_TYPE_STRING);
2734 for (tok = strtok (temp_addresses, "\n"); tok; tok = strtok(NULL, "\n")) {
2735 gtk_list_store_append (store, &iter);
2736 gtk_list_store_set (store, &iter, 0, tok, -1);
2738 gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
2739 gtk_container_add (GTK_CONTAINER (swindow), if_view);
2740 gtk_box_pack_start(GTK_BOX(if_vb_right), swindow, TRUE, TRUE, 0);
2741 g_free(temp_addresses);
2743 gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, FALSE, FALSE, 0);
2744 gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, FALSE, FALSE, 3);
2745 if_ip_name = gtk_label_new("none");
2746 gtk_misc_set_alignment(GTK_MISC(if_ip_name), 0, 0); /* Left justified */
2747 gtk_box_pack_start(GTK_BOX(if_vb_right), if_ip_name, FALSE, FALSE, 0);
2749 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
2750 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
2751 gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 3);
2753 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2754 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
2755 gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
2757 #if defined (HAVE_AIRPCAP) || defined (HAVE_PCAP_REMOTE) || defined (HAVE_PCAP_CREATE)
2758 /* Avoid adding the right vbox if not needed, because it steals 3 pixels */
2759 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
2760 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
2761 gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 3);
2765 linktype_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2766 gtk_box_pack_start(GTK_BOX(left_vb), linktype_hb, FALSE, FALSE, 0);
2768 linktype_lb = gtk_label_new("Link-layer header type:");
2769 gtk_box_pack_start(GTK_BOX(linktype_hb), linktype_lb, FALSE, FALSE, 3);
2771 linktype_combo_box = ws_combo_box_new_text_and_pointer();
2772 g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY, linktype_lb);
2773 /* Default to "use the default" */
2774 /* Datalink menu index is not reset; it will be restored with last used value */
2776 g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_IFACE_IP_KEY, if_ip_lb);
2778 * XXX - in some cases, this is "multiple link-layer header types", e.g.
2779 * some 802.11 interfaces on FreeBSD 5.2 and later, where you can request
2780 * fake Ethernet, 802.11, or 802.11-plus-radio-information headers.
2782 * In other cases, it's "multiple link-layer types", e.g., with recent
2783 * versions of libpcap, a DAG card on an "HDLC" WAN, where you can
2784 * request Cisco HDLC or PPP depending on what type of traffic is going
2785 * over the WAN, or an Ethernet interface, where you can request Ethernet
2786 * or DOCSIS, the latter being for some Cisco cable modem equipment that
2787 * can be configured to send raw DOCSIS frames over an Ethernet inside
2788 * Ethernet low-level framing, for traffic capture purposes.
2790 * We leave it as "multiple link-layer types" for now.
2792 gtk_widget_set_tooltip_text(linktype_combo_box, "The selected interface supports multiple link-layer types; select the desired one.");
2793 gtk_box_pack_start (GTK_BOX(linktype_hb), linktype_combo_box, FALSE, FALSE, 0);
2794 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY, linktype_combo_box);
2796 num_supported_link_types = 0;
2797 first_supported_index = -1;
2798 for (list=device.links; list!=NULL; list=g_list_next(list))
2800 temp = (link_row*)(list->data);
2801 if (temp->dlt == -1)
2803 ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
2806 GINT_TO_POINTER(-1), /* Flag as "not supported" */
2811 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
2813 GINT_TO_POINTER(temp->dlt));
2814 /* Record the index of the first supported link type (and thus the first
2815 * one in the list to be active) for use determining the default selected
2817 if (first_supported_index == -1)
2819 first_supported_index = num_link_types;
2821 if (temp->dlt == device.active_dlt)
2823 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box), num_link_types);
2826 num_supported_link_types++;
2830 gtk_widget_set_sensitive(linktype_lb, num_link_types >= 2);
2831 gtk_widget_set_sensitive(linktype_combo_box, num_link_types >= 2);
2832 if (!found && first_supported_index >= 0)
2834 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),first_supported_index);
2836 g_signal_connect(linktype_combo_box, "changed", G_CALLBACK(select_link_type_cb), NULL);
2838 /* Promiscuous mode row */
2839 promisc_cb = gtk_check_button_new_with_mnemonic(
2840 "Capture packets in _promiscuous mode");
2841 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
2843 gtk_widget_set_tooltip_text(promisc_cb,
2844 "Usually a network adapter will only capture the traffic sent to its own network address. "
2845 "If you want to capture all traffic that the network adapter can \"see\", mark this option. "
2846 "See the FAQ for some more details of capturing packets from a switched network.");
2847 gtk_box_pack_start (GTK_BOX(left_vb), promisc_cb, FALSE, FALSE, 0);
2848 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY, promisc_cb);
2850 #ifdef HAVE_PCAP_CREATE
2851 /* Monitor mode row */
2852 monitor_cb = gtk_check_button_new_with_mnemonic( "Capture packets in monitor mode");
2853 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb), device.monitor_mode_enabled);
2854 gtk_widget_set_sensitive(monitor_cb, device.monitor_mode_supported);
2855 g_signal_connect(monitor_cb, "toggled", G_CALLBACK(capture_prep_monitor_changed_cb), NULL);
2857 gtk_widget_set_tooltip_text(monitor_cb,
2858 "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture the traffic on the BSS to which it's associated. "
2859 "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", mark this option. "
2860 "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
2861 "it might be necessary to turn this option on.\n\n"
2862 "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
2863 gtk_box_pack_start (GTK_BOX(left_vb), monitor_cb, FALSE, FALSE, 0);
2865 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY, monitor_cb);
2869 * This controls the sensitivity of both the link-type list and, if
2870 * you have it, the monitor mode checkbox. That's why we do this
2874 /* Capture length row */
2875 snap_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2876 gtk_box_pack_start (GTK_BOX(left_vb), snap_hb, FALSE, FALSE, 0);
2878 snap_cb = gtk_check_button_new_with_mnemonic("_Limit each packet to");
2879 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(snap_cb),
2880 device.has_snaplen);
2881 g_signal_connect(snap_cb, "toggled", G_CALLBACK(adjust_snap_sensitivity), NULL);
2882 gtk_widget_set_tooltip_text(snap_cb,
2883 "Limit the maximum number of bytes to be captured from each packet. This size includes the "
2884 "link-layer header and all subsequent headers. ");
2885 gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0);
2887 snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.snaplen,
2888 MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE, 1.0, 10.0, 0.0);
2889 snap_sb = gtk_spin_button_new (snap_adj, 0, 0);
2890 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE);
2891 gtk_widget_set_size_request(snap_sb, 80, -1);
2892 gtk_box_pack_start (GTK_BOX(snap_hb), snap_sb, FALSE, FALSE, 0);
2894 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY, snap_cb);
2895 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY, snap_sb);
2896 snap_lb = gtk_label_new("bytes");
2897 gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5f);
2898 gtk_box_pack_start(GTK_BOX(snap_hb), snap_lb, FALSE, FALSE, 0);
2899 gtk_widget_set_sensitive(GTK_WIDGET(snap_sb), device.has_snaplen);
2902 filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2903 gtk_box_pack_start(GTK_BOX(capture_vb), filter_hb, FALSE, FALSE, 0);
2905 filter_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
2906 g_signal_connect(filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
2907 g_signal_connect(filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
2908 gtk_widget_set_tooltip_text(filter_bt,
2909 "Select a capture filter to reduce the amount of packets to be captured. "
2910 "See \"Capture Filters\" in the online help for further information how to use it."
2912 gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, FALSE, 3);
2914 /* Create the capture filter combo box*/
2915 filter_cm = gtk_combo_box_text_new_with_entry();
2916 g_object_set_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY, filter_cm);
2917 filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
2918 colorize_filter_te_as_empty(filter_te);
2919 g_signal_connect(filter_te, "changed", G_CALLBACK(capture_filter_check_syntax_cb), NULL);
2920 g_signal_connect(filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
2922 cfilter_list = recent_get_cfilter_list(name);
2923 for (cf_entry = cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
2924 new_cfilter = (const gchar *)cf_entry->data;
2925 /* If this is the current dfilter or the default cfilter, don't put
2926 it in the list, as it'll be added later. */
2927 if ((device.cfilter == NULL || strcmp(device.cfilter, new_cfilter) != 0) &&
2928 (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0)) {
2929 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), new_cfilter);
2932 if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
2933 /* If this is the current dfilter, don't put it in the list, as it'll be
2935 if (device.cfilter == NULL || strcmp(device.cfilter, global_capture_opts.default_options.cfilter) != 0) {
2936 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), global_capture_opts.default_options.cfilter);
2939 if (device.cfilter && (strlen(device.cfilter) > 0)) {
2940 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), device.cfilter);
2941 gtk_combo_box_set_active(GTK_COMBO_BOX(filter_cm), 0);
2944 gtk_widget_set_tooltip_text(filter_cm,
2945 "Enter a capture filter to reduce the amount of packets to be captured. "
2946 "See \"Capture Filters\" in the online help for further information how to use it. "
2947 "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
2949 gtk_box_pack_start(GTK_BOX(filter_hb), filter_cm, TRUE, TRUE, 3);
2951 /* let an eventually capture filters dialog know the text entry to fill in */
2952 g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
2954 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
2955 compile_bt = gtk_button_new_with_label("Compile BPF");
2956 g_signal_connect(compile_bt, "clicked", G_CALLBACK(capture_filter_compile_cb), NULL);
2957 gtk_widget_set_tooltip_text(compile_bt,
2958 "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
2959 /* We can't compile without any supported link-types, so disable the button in that case */
2960 gtk_widget_set_sensitive(compile_bt, (num_supported_link_types >= 1));
2961 gtk_box_pack_start(GTK_BOX(filter_hb), compile_bt, FALSE, FALSE, 3);
2964 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
2965 buffer_size_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
2966 buffer_size_lb = gtk_label_new("Buffer size:");
2967 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 0);
2969 buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.buffer,
2970 1, 65535, 1.0, 10.0, 0.0);
2971 buffer_size_sb = gtk_spin_button_new (buffer_size_adj, 0, 0);
2972 gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) device.buffer);
2973 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (buffer_size_sb), TRUE);
2974 gtk_widget_set_size_request(buffer_size_sb, 80, -1);
2975 gtk_widget_set_tooltip_text(buffer_size_sb,
2976 "The memory buffer size used while capturing. If you notice packet drops, you can try to increase this size.");
2977 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_sb, FALSE, FALSE, 0);
2978 g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY, buffer_size_sb);
2979 buffer_size_lb = gtk_label_new("megabyte(s)");
2980 gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 3);
2981 gtk_misc_set_alignment(GTK_MISC(buffer_size_lb), 1, 0);
2982 #ifdef HAVE_PCAP_REMOTE
2983 gtk_box_pack_start (GTK_BOX(left_vb), buffer_size_hb, FALSE, FALSE, 0);
2985 gtk_box_pack_start (GTK_BOX(right_vb), buffer_size_hb, FALSE, FALSE, 0);
2989 #ifdef HAVE_PCAP_REMOTE
2991 * *IF* this is a remote interface, add the "Remote Settings"
2992 * button. Do *not* add it for other interfaces, as that could
2993 * lead users to believe that it could somehow be enabled.
2995 /* Both the callback and the data are global */
2996 if (strncmp (device.name, "rpcap://", 8) == 0) {
2997 remote_bt = gtk_button_new_with_label("Remote Settings");
2998 gtk_widget_set_tooltip_text(remote_bt, "Various settings for remote capture.");
3000 g_signal_connect(remote_bt, "clicked", G_CALLBACK(options_remote_cb), NULL);
3002 gtk_box_pack_start(GTK_BOX(right_vb), remote_bt, FALSE, FALSE, 0);
3003 gtk_widget_show(remote_bt);
3009 * *IF* this is an AirPcap interface, add the "Wireless Settings"
3010 * button. Do *not* add it for other interfaces, as that can
3011 * confuse users, so that they ask why this is grayed out on
3012 * their non-Windows machine and ask how to enable it.
3014 airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list, device.name);
3015 if (airpcap_if_selected != NULL) {
3016 advanced_bt = gtk_button_new_with_label("Wireless Settings");
3018 /* Both the callback and the data are global */
3019 g_signal_connect(advanced_bt,"clicked", G_CALLBACK(options_airpcap_advanced_cb), wireless_tb);
3021 gtk_box_pack_start(GTK_BOX(right_vb), advanced_bt, FALSE, FALSE, 0);
3022 gtk_widget_show(advanced_bt);
3026 /* Button row: "Start", "Cancel" and "Help" buttons */
3027 bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
3028 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
3030 ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
3031 g_signal_connect(ok_but, "clicked", G_CALLBACK(save_options_cb), NULL);
3032 gtk_widget_set_tooltip_text(ok_but,
3033 "Accept interface settings.");
3034 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
3035 gtk_widget_set_tooltip_text(cancel_bt,
3036 "Cancel and exit dialog.");
3037 window_set_cancel_button(opt_edit_w, cancel_bt, window_cancel_button_cb);
3038 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
3039 gtk_widget_set_tooltip_text(help_bt,
3040 "Show help about capturing.");
3041 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_OPTIONS_DIALOG);
3042 dlg_set_activate(filter_te, ok_but);
3043 gtk_widget_grab_focus(filter_te);
3044 g_signal_connect(opt_edit_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
3045 g_signal_connect(opt_edit_w, "destroy", G_CALLBACK(options_edit_destroy_cb), NULL);
3046 gtk_widget_show_all(opt_edit_w);
3047 window_present(opt_edit_w);
3050 static void toggle_callback(GtkCellRendererToggle *cell _U_,
3054 /* get the treemodel from somewhere */
3057 GtkTreeModel *model;
3058 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3060 GtkWidget *pcap_ng_cb, *filter_cm;
3066 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3067 model = gtk_tree_view_get_model(if_cb);
3068 gtk_tree_model_get_iter (model, &iter, path);
3069 gtk_tree_model_get (model, &iter, CAPTURE, &enabled, IFACE_HIDDEN_NAME, &name, -1);
3070 /* Look for the right interface. The number of interfaces shown might be less
3071 * than the real number. Therefore the path index does not correspond
3072 * necessarily to the position in the list */
3073 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3074 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3075 if (strcmp(device.name, name) == 0) {
3080 if (!device.locked) {
3081 if (enabled == FALSE) {
3082 device.selected = TRUE;
3083 global_capture_opts.num_selected++;
3085 device.selected = FALSE;
3086 global_capture_opts.num_selected--;
3088 device.locked = TRUE;
3091 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
3092 g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
3093 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
3094 if (global_capture_opts.num_selected >= 2) {
3095 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
3096 gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
3098 gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
3100 if (global_capture_opts.num_selected > 0) {
3101 gtk_widget_set_sensitive(ok_bt, TRUE);
3102 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3103 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3106 gtk_widget_set_sensitive(ok_bt, FALSE);
3107 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3108 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3111 /* do something with the new enabled value, and set the new
3112 enabled value in your treemodel */
3113 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, -1);
3114 if (interfaces_dialog_window_present()) {
3115 update_selected_interface(g_strdup(device.name));
3117 if (get_welcome_window() != NULL) {
3118 change_interface_selection(g_strdup(device.name), device.selected);
3121 if (device.cfilter != NULL) {
3122 g_free(device.cfilter);
3123 device.cfilter = NULL;
3124 update_filter_string(device.name, NULL);
3126 device.locked = FALSE;
3127 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
3128 g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
3129 gtk_tree_path_free (path);
3130 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
3131 if (strcmp(gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm)),"") != 0) {
3132 capture_all_filter_check_syntax_cb(NULL, NULL);
3134 update_properties_all();
3137 void enable_selected_interface(gchar *name, gboolean selected)
3141 GtkTreeModel *model;
3144 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3145 model = gtk_tree_view_get_model(if_cb);
3146 gtk_tree_model_get_iter_first(model, &iter);
3148 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
3149 if (strcmp(name, name_str) == 0) {
3150 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, selected, -1);
3154 while (gtk_tree_model_iter_next(model, &iter));
3155 if (global_capture_opts.num_selected > 0) {
3156 gtk_widget_set_sensitive(ok_bt, TRUE);
3157 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3158 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3161 gtk_widget_set_sensitive(ok_bt, FALSE);
3162 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3163 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3169 static void capture_all_cb(GtkToggleButton *button, gpointer d _U_)
3173 GtkTreeModel *model;
3174 GtkWidget *filter_cm, *pcap_ng_cb;
3175 gchar *interface = NULL, *filter_text = NULL;
3176 gboolean enabled = FALSE, capture_set = FALSE, pseudo = FALSE;
3177 guint16 num_temp, i;
3180 if (gtk_toggle_button_get_active(button))
3182 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3183 model = gtk_tree_view_get_model(if_cb);
3184 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
3185 num_temp = global_capture_opts.num_selected++;
3186 filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
3187 filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
3188 if (gtk_tree_model_get_iter_first(model, &iter)) {
3190 gtk_tree_model_get (model, &iter, CAPTURE, &capture_set, IFACE_HIDDEN_NAME, &interface, -1);
3191 if (strcmp(interface, "any") == 0) {
3194 if (!capture_set && enabled && !pseudo) {
3196 } else if (capture_set && (!enabled || (enabled && pseudo))) {
3200 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, enabled, -1);
3201 if (strlen(filter_text) != 0) {
3202 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3203 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3204 if (strcmp(device.name, interface) == 0) {
3205 g_array_remove_index(global_capture_opts.all_ifaces, i);
3206 device.cfilter = g_strdup(filter_text);
3207 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3208 update_filter_string(device.name, filter_text);
3213 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, -1);
3216 } while (gtk_tree_model_iter_next(model, &iter));
3218 if (num_temp >= 2) {
3219 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
3220 gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
3221 } else if (num_temp <= 1) {
3222 gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
3224 if (interfaces_dialog_window_present()) {
3225 select_all_interfaces(enabled);
3227 if (get_welcome_window() != NULL) {
3228 change_selection_for_all(enabled);
3230 if (global_capture_opts.num_selected != num_temp) {
3231 global_capture_opts.num_selected = num_temp;
3233 if (global_capture_opts.num_selected > 0) {
3234 gtk_widget_set_sensitive(ok_bt, TRUE);
3235 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3236 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3239 gtk_widget_set_sensitive(ok_bt, FALSE);
3240 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3241 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3244 set_sensitivity_for_start_icon();
3248 static gboolean get_all_prom_mode(void)
3250 interface_options interface_opts;
3253 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
3254 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
3255 if (!interface_opts.promisc_mode) {
3262 static void promisc_mode_callback(GtkToggleButton *button, gpointer d _U_)
3266 GtkTreeModel *model;
3267 gboolean enabled = FALSE;
3269 interface_options interface_opts;
3272 if (gtk_toggle_button_get_active(button))
3275 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3276 model = gtk_tree_view_get_model(if_cb);
3277 if (gtk_tree_model_get_iter_first(model, &iter)) {
3279 gtk_list_store_set(GTK_LIST_STORE(model), &iter, PMODE, enabled?"enabled":"disabled", -1);
3280 } while (gtk_tree_model_iter_next(model, &iter));
3283 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3284 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3285 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
3286 device.pmode = (enabled?TRUE:FALSE);
3287 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3290 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
3291 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
3292 global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
3293 interface_opts.promisc_mode = (enabled?TRUE:FALSE);
3294 g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
3298 #if defined (HAVE_PCAP_REMOTE)
3300 show_remote_dialog(GtkWidget *w)
3303 g_free(global_remote_opts.remote_host_opts.remote_host);
3304 g_free(global_remote_opts.remote_host_opts.remote_port);
3305 g_free(global_remote_opts.remote_host_opts.auth_username);
3306 g_free(global_remote_opts.remote_host_opts.auth_password);
3307 global_remote_opts.src_type = CAPTURE_IFREMOTE;
3308 global_remote_opts.remote_host_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
3309 global_remote_opts.remote_host_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
3310 global_remote_opts.remote_host_opts.auth_type = global_capture_opts.default_options.auth_type;
3311 global_remote_opts.remote_host_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
3312 global_remote_opts.remote_host_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
3313 global_remote_opts.remote_host_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
3314 global_remote_opts.remote_host_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
3315 global_remote_opts.remote_host_opts.nocap_local = global_capture_opts.default_options.nocap_local;
3316 #ifdef HAVE_PCAP_SETSAMPLING
3317 global_remote_opts.sampling_method = global_capture_opts.default_options.sampling_method;
3318 global_remote_opts.sampling_param = global_capture_opts.default_options.sampling_param;
3320 capture_remote_cb(GTK_WIDGET(w), FALSE);
3324 static void change_pipe_name_cb(gpointer dialog _U_, gint btn, gpointer data)
3328 gchar *temp, *optname, *snaplen_string/*, *oldname = ""*/;
3330 GtkTreeModel *model;
3336 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3337 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3338 if (strcmp((gchar *)data, device.name) == 0) {
3339 simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
3340 "%sA pipe with this name already exists.%s",
3341 simple_dialog_primary_start(), simple_dialog_primary_end());
3342 if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3343 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3344 model = gtk_tree_view_get_model(if_cb);
3345 if (gtk_tree_model_get_iter_first (model, &iter)) {
3347 gtk_tree_model_get(model, &iter, 0, &optname, -1);
3348 if (strcmp(optname, (gchar *) data) == 0) {
3349 gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
3350 gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
3353 } while (gtk_tree_model_iter_next(model, &iter));
3359 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3360 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3361 if (strcmp(pipe_name, device.name) == 0) {
3362 device.name = g_strdup((gchar *)data);
3363 device.display_name = g_strdup_printf("%s", device.name);
3364 g_array_remove_index(global_capture_opts.all_ifaces, i);
3365 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
3366 temp = g_strdup_printf("<b>%s</b>", device.display_name);
3367 if (device.has_snaplen) {
3368 snaplen_string = g_strdup_printf("%d", device.snaplen);
3370 snaplen_string = g_strdup("default");
3372 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3373 model = gtk_tree_view_get_model(if_cb);
3374 if (gtk_tree_model_get_iter_first (model, &iter)) {
3376 gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &optname, -1);
3377 if (strcmp(optname, pipe_name) == 0) {
3378 #if defined(HAVE_PCAP_CREATE)
3379 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);
3380 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
3381 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);
3383 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);
3386 oldname = g_strdup(pipe_name);
3388 pipe_name = g_strdup(device.name);
3391 } while (gtk_tree_model_iter_next(model, &iter));
3395 if (global_capture_opts.num_selected > 0) {
3396 gtk_widget_set_sensitive(ok_bt, TRUE);
3397 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3398 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3401 gtk_widget_set_sensitive(ok_bt, FALSE);
3402 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3403 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3406 refresh_non_local_interface_lists();
3411 case(ESD_BTN_CANCEL): {
3412 if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3413 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3414 model = gtk_tree_view_get_model(if_cb);
3416 if (gtk_tree_model_get_iter_first (model, &iter)) {
3418 gtk_tree_model_get(model, &iter, 0, &optname, -1);
3419 if (strcmp(optname, (gchar *) data) == 0) {
3420 gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
3421 gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
3424 } while (gtk_tree_model_iter_next(model, &iter));
3430 g_assert_not_reached();
3435 add_pipe_cb(gpointer w _U_)
3440 GtkTreeModel *model;
3442 gchar *temp, *path_str, *snaplen_string;
3444 const gchar *g_save_file;
3449 pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3450 g_save_file = gtk_entry_get_text(GTK_ENTRY(pipe_te));
3451 name = g_strdup(g_save_file);
3452 if (strcmp(name, "New pipe") == 0 || strcmp(name, "") == 0) {
3456 if (strcmp(pipe_name, "New pipe") != 0) {
3457 if (strcmp(pipe_name, name) != 0) {
3458 dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_OK_CANCEL,
3459 "%sDo you want to change %s to %s?%s",
3460 simple_dialog_primary_start(), pipe_name, name, simple_dialog_primary_end());
3461 simple_dialog_set_cb(dialog, change_pipe_name_cb, name);
3464 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3465 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3466 if (strcmp(name, device.name) == 0) {
3471 pipe_name = g_strdup(g_save_file);
3472 device.name = g_strdup(g_save_file);
3473 device.display_name = g_strdup_printf("%s", device.name);
3474 device.hidden = FALSE;
3475 device.selected = TRUE;
3476 device.type = IF_PIPE;
3477 device.pmode = global_capture_opts.default_options.promisc_mode;
3478 device.has_snaplen = global_capture_opts.default_options.has_snaplen;
3479 device.snaplen = global_capture_opts.default_options.snaplen;
3480 device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
3481 device.addresses = NULL;
3482 device.no_addresses = 0;
3483 device.last_packets = 0;
3484 device.links = NULL;
3485 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
3486 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
3488 device.active_dlt = -1;
3489 device.locked = FALSE;
3490 device.if_info.name = g_strdup(g_save_file);
3491 device.if_info.friendly_name = NULL;
3492 device.if_info.vendor_description = NULL;
3493 device.if_info.addrs = NULL;
3494 device.if_info.loopback = FALSE;
3495 #if defined(HAVE_PCAP_CREATE)
3496 device.monitor_mode_enabled = FALSE;
3497 device.monitor_mode_supported = FALSE;
3499 global_capture_opts.num_selected++;
3501 indx = global_capture_opts.all_ifaces->len;
3502 temp = g_strdup_printf("<b>%s</b>", device.display_name);
3504 if (device.has_snaplen) {
3505 snaplen_string = g_strdup_printf("%d", device.snaplen);
3507 snaplen_string = g_strdup("default");
3510 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3511 path_str = g_strdup_printf("%d", indx);
3512 model = gtk_tree_view_get_model(if_cb);
3513 gtk_tree_model_get_iter_from_string(model, &iter, path_str);
3514 g_array_append_val(global_capture_opts.all_ifaces, device);
3515 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
3516 #if defined(HAVE_PCAP_CREATE)
3517 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);
3518 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
3519 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);
3521 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);
3523 if (global_capture_opts.num_selected > 0) {
3524 gtk_widget_set_sensitive(ok_bt, TRUE);
3525 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3526 gtk_widget_set_sensitive(all_compile_bt, TRUE);
3529 gtk_widget_set_sensitive(ok_bt, FALSE);
3530 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
3531 gtk_widget_set_sensitive(all_compile_bt, FALSE);
3535 /* Refresh all places that are displaying an interface list
3536 that includes interfaces other than local interfaces
3538 refresh_non_local_interface_lists();
3545 pipe_new_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
3547 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3548 GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3549 GtkListStore *store;
3552 /* Add a new entry to the pipe list. */
3554 store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
3555 gtk_list_store_append(store, &iter);
3557 gtk_list_store_set(store, &iter, 0, "New pipe", -1);
3558 pipe_name = "New pipe";
3560 /* Select the item. */
3561 gtk_tree_selection_select_iter(gtk_tree_view_get_selection(pipe_l), &iter);
3563 gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
3565 gtk_widget_grab_focus(name_te);
3569 pipe_del_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
3571 GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
3572 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3573 GtkTreeSelection *sel;
3574 GtkTreeModel *model, *optmodel;
3575 GtkTreeIter iter, optiter;
3577 gchar *name, *optname = NULL;
3580 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
3581 /* If something was selected */
3583 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3584 gtk_tree_model_get(model, &iter, 0, &name, -1);
3585 if (name != NULL && atoi(gtk_tree_model_get_string_from_iter(model, &iter)) < (gint)global_capture_opts.all_ifaces->len) {
3586 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3587 if (strcmp(g_array_index(global_capture_opts.all_ifaces, interface_t, i).name, name) == 0) {
3588 g_array_remove_index(global_capture_opts.all_ifaces, i);
3592 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
3593 gtk_entry_set_text(GTK_ENTRY(name_te), "");
3594 if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3595 optmodel = gtk_tree_view_get_model(if_cb);
3596 if (gtk_tree_model_get_iter_first (optmodel, &optiter)) {
3598 gtk_tree_model_get(optmodel, &optiter, IFACE_HIDDEN_NAME, &optname, -1);
3599 if (optname != NULL && strcmp(optname, name) == 0) {
3600 gtk_list_store_remove(GTK_LIST_STORE(gtk_tree_view_get_model(if_cb)), &optiter);
3603 } while (gtk_tree_model_iter_next(optmodel, &optiter));
3610 if (gtk_tree_model_get_iter_first (model, &iter)) {
3611 gtk_tree_selection_select_iter(sel, &iter);
3613 gtk_widget_set_sensitive(name_te, FALSE);
3616 /* Refresh all places that are displaying an interface list
3617 that includes interfaces other than local interfaces
3619 refresh_non_local_interface_lists();
3623 pipe_name_te_changed_cb(GtkWidget *w _U_, gpointer data _U_)
3625 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3626 GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
3628 GtkTreeSelection *sel;
3629 GtkTreeModel *model;
3632 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
3633 name = gtk_entry_get_text(GTK_ENTRY(name_te));
3635 /* if something was selected */
3636 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3637 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, name, -1);
3642 fill_pipe_list(void)
3647 GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
3648 GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
3650 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3651 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3652 if (device.type == IF_PIPE) {
3653 gtk_list_store_append(store, &iter);
3654 gtk_list_store_set(store, &iter, 0, device.name, -1);
3662 pipe_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
3664 /* GtkWidget *pipe_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));*/
3665 GtkTreeModel *model;
3667 GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
3668 GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY);
3671 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
3672 gtk_tree_model_get(model, &iter, 0, &name, -1);
3674 if (name_te != NULL) {
3675 gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
3676 gtk_widget_set_sensitive(name_te, TRUE);
3677 selected_name = gtk_entry_get_text(GTK_ENTRY(name_te));
3678 pipe_name = g_strdup(selected_name);
3680 if (del_bt != NULL) {
3681 gtk_widget_set_sensitive(del_bt, TRUE);
3689 cancel_pipe_cb (gpointer w _U_)
3691 window_destroy(GTK_WIDGET(interface_management_w));
3695 fill_local_list(void)
3700 GtkListStore *store;
3701 GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3704 store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
3706 store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
3709 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3710 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3711 if (device.local && device.type != IF_PIPE && device.type != IF_STDIN) {
3712 gtk_list_store_append(store, &iter);
3715 gtk_list_store_set(store, &iter, 0, device.friendly_name, 1, device.name, 2, device.hidden, -1);
3717 gtk_list_store_set(store, &iter, 0, device.name, 1, device.hidden, -1);
3723 gtk_tree_view_set_model(GTK_TREE_VIEW(local_l), GTK_TREE_MODEL(store));
3726 static void local_hide_cb(GtkCellRendererToggle *cell _U_,
3730 gboolean hide, hide_enabled = TRUE;
3732 GtkTreeModel *model;
3734 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3735 GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3737 model = gtk_tree_view_get_model(local_l);
3738 gtk_tree_model_get_iter (model, &iter, path);
3739 gtk_tree_model_get (model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
3741 /* See if this is the currently selected capturing device */
3742 if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0')) {
3745 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3746 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3747 if ((strcmp(device.display_name, prefs.capture_device) == 0) &&
3748 (strcmp(device.name, name) == 0)) {
3749 /* Don't allow current interface to be hidden */
3750 hide_enabled = FALSE;
3758 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, FALSE, -1);
3760 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, TRUE, -1);
3763 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Default interface cannot be hidden");
3768 apply_local_cb(GtkWidget *win _U_, gpointer *data _U_)
3771 GtkTreeModel *model;
3772 gchar *name, *new_hide;
3774 gint first_if = TRUE;
3775 GtkTreeView *local_l;
3777 if (global_capture_opts.all_ifaces->len > 0) {
3778 local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
3779 model = gtk_tree_view_get_model(local_l);
3781 new_hide = (gchar*)g_malloc0(MAX_VAL_LEN);
3783 if (gtk_tree_model_get_iter_first (model, &iter)) {
3785 gtk_tree_model_get(model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
3789 if (first_if != TRUE) {
3790 g_strlcat (new_hide, ",", MAX_VAL_LEN);
3792 g_strlcat (new_hide, name, MAX_VAL_LEN);
3795 } while (gtk_tree_model_iter_next(model, &iter));
3798 /* write new "hidden" string to preferences */
3799 g_free(prefs.capture_devices_hide);
3800 prefs.capture_devices_hide = new_hide;
3801 hide_interface(g_strdup(new_hide));
3803 /* Refresh all places that are displaying an interface list
3804 that includes local interfaces, in case we've changed
3805 a property of the interface list that changes how it's
3807 refresh_local_interface_lists();
3809 /* save changes to the preferences file */
3810 if (!prefs.gui_use_pref_save) {
3817 capture_dlg_refresh_if (void)
3821 if (interface_management_w)
3824 view = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
3825 create_and_fill_model(GTK_TREE_VIEW(view));
3826 update_properties_all();
3830 * We've been asked to rescan the system looking for interfaces.
3833 rescan_local_cb(GtkWidget *button _U_, gpointer *data _U_)
3835 /* Refresh all places that are displaying an interface list
3836 that includes local interfaces. */
3837 refresh_local_interface_lists();
3840 #if defined(HAVE_PCAP_REMOTE)
3842 fill_remote_list(void)
3846 GtkTreeIter iter, child;
3848 GtkTreeView *remote_l;
3849 GtkTreeStore *store;
3850 GtkWidget *host_te, *remote_w;
3853 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
3854 remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3855 store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
3856 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
3857 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
3861 /* fill the store */
3862 if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) != 0) {
3863 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
3864 host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
3865 iftype_combo_box_add (host_te, &device);
3866 host = g_strdup(device.remote_opts.remote_host_opts.remote_host);
3867 gtk_tree_store_append(store, &iter, NULL);
3868 gtk_tree_store_set(store, &iter, 0, host, 3, "FALSE", -1);
3869 gtk_tree_store_append(store, &child, &iter);
3870 gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
3872 gtk_tree_store_append(store, &child, &iter);
3873 gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
3877 gtk_tree_view_set_model(GTK_TREE_VIEW(remote_l), GTK_TREE_MODEL(store));
3878 gtk_tree_view_expand_all(GTK_TREE_VIEW(remote_l));
3882 button_hide_cb(GtkTreeViewColumn *column, GtkCellRenderer *renderer,
3883 GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
3887 gtk_tree_model_get(model, iter, 3, &enabled, -1);
3888 if (strcmp(enabled, "TRUE") == 0) {
3889 g_object_set(G_OBJECT(renderer), "visible", TRUE, NULL);
3890 } else if (strcmp(enabled, "FALSE") == 0){
3891 g_object_set(G_OBJECT(renderer), "visible", FALSE, NULL);
3895 static void remote_hide_cb(GtkCellRendererToggle *cell _U_,
3900 GtkTreeModel *model;
3902 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
3903 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3905 model = gtk_tree_view_get_model(remote_l);
3906 gtk_tree_model_get_iter (model, &iter, path);
3907 gtk_tree_model_get (model, &iter, 2, &hide, -1);
3910 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, FALSE, -1);
3912 gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, TRUE, -1);
3917 ok_remote_cb(GtkWidget *win _U_, gpointer *data _U_)
3919 GtkTreeIter iter, child;
3920 GtkTreeModel *model;
3921 gchar *name, *new_hide;
3923 gint first_if = TRUE;
3925 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3926 model = gtk_tree_view_get_model(remote_l);
3928 new_hide = g_malloc0(MAX_VAL_LEN);
3930 if (gtk_tree_model_get_iter_first (model, &iter)) {
3932 gtk_tree_model_get(model, &iter, 1, &name, 2, &hide, -1);
3933 if (!name && gtk_tree_model_iter_children(model, &child, &iter)) {
3935 gtk_tree_model_get(model, &child, 1, &name, 2, &hide, -1);
3939 if (first_if != TRUE) {
3940 g_strlcat (new_hide, ",", MAX_VAL_LEN);
3942 g_strlcat (new_hide, name, MAX_VAL_LEN);
3945 } while (gtk_tree_model_iter_next(model, &child));
3947 } while (gtk_tree_model_iter_next(model, &iter));
3950 hide_interface(g_strdup(new_hide));
3952 /* Refresh all places that are displaying an interface list
3953 that includes interfaces other than local interfaces
3954 (such as remote interfaces). */
3955 refresh_non_local_interface_lists();
3959 select_host_cb(GtkTreeSelection *selection _U_,
3960 GtkTreeModel *model,
3962 gboolean path_currently_selected _U_,
3967 gtk_tree_model_get_iter (model, &iter, path);
3968 if (gtk_tree_model_iter_has_child(model, &iter)) {
3970 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), TRUE);
3978 remove_remote_host(GtkWidget *w _U_, gpointer data _U_)
3980 GtkTreeIter iter, child;
3981 GtkTreeModel *model;
3983 gint num_children, i;
3985 GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
3986 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
3988 model = gtk_tree_view_get_model(remote_l);
3989 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
3990 gtk_tree_model_get(model, &iter, 0, &host, -1);
3991 if ((num_children = gtk_tree_model_iter_n_children(model, &iter)) > 0) {
3992 for (i = num_children-1; i >= 0; i--) {
3993 if (gtk_tree_model_iter_nth_child(model, &child, &iter, i)) {
3994 gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
3998 gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
3999 if (--num_selected == 0) {
4000 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
4002 for (i = global_capture_opts.all_ifaces->len-1; i >= 0; i--) {
4003 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
4007 if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) == 0) {
4008 g_array_remove_index(global_capture_opts.all_ifaces, i);
4013 /* Refresh all places that are displaying an interface list
4014 that includes interfaces other than local interfaces
4015 (such as remote interfaces). */
4016 refresh_non_local_interface_lists();
4022 show_add_interfaces_dialog(GtkWidget *bt _U_, GtkWidget *parent_win)
4024 GtkWidget *vbox, *top_hb;
4025 GtkWidget *hbox, *bbox, *list_bb, *edit_fr, *pipe_fr, *pipe_sc, *pipe_l, *props_fr, *props_vb;
4027 GtkWidget *temp_page, *tmp;
4028 GtkWidget *pipe_hb, *pipe_bt, *pipe_lb, *pipe_te, *pipe_vb;
4029 GtkWidget *add_bt, *cancel_bt, *new_bt, *del_bt, *middle_hb;
4030 GtkWidget *local_fr, *local_l, *local_sc, *local_vb;
4031 GtkWidget *apply_bt, *refresh_bt;
4032 GtkCellRenderer *renderer, *toggle_renderer;
4033 GtkTreeViewColumn *column;
4034 GtkTreeSelection *sel;
4035 GtkListStore *store;
4036 #if defined(HAVE_PCAP_REMOTE)
4037 GtkWidget *remote_fr, *remote_l, *remote_sc, *remote_vb;
4038 GtkWidget *delete_bt, *add_but, *ok_but;
4039 GtkWidget *button_hbox, *help_hbox;
4040 GtkTreeSelection *selection;
4043 interface_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Interface Management");
4044 gtk_window_set_transient_for(GTK_WINDOW(interface_management_w), GTK_WINDOW(parent_win));
4045 gtk_window_set_destroy_with_parent(GTK_WINDOW(interface_management_w), TRUE);
4047 gtk_window_set_default_size(GTK_WINDOW(interface_management_w), 700, 300);
4049 vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4050 gtk_container_add(GTK_CONTAINER(interface_management_w), vbox);
4051 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
4053 main_nb = gtk_notebook_new();
4054 gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
4057 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4058 tmp = gtk_label_new("Pipes");
4059 gtk_widget_show(tmp);
4060 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4061 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
4063 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4066 pipe_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20, FALSE);
4067 gtk_container_set_border_width(GTK_CONTAINER(pipe_hb), 5);
4068 gtk_box_pack_start(GTK_BOX(temp_page), pipe_hb, TRUE, TRUE, 0);
4070 /* Container for each row of widgets */
4071 pipe_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4072 gtk_container_set_border_width(GTK_CONTAINER(pipe_vb), 0);
4073 gtk_box_pack_start(GTK_BOX (pipe_hb), pipe_vb, TRUE, TRUE, 0);
4074 gtk_widget_show(pipe_vb);
4076 /* Top row: Buttons and pipe list */
4077 top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4078 gtk_box_pack_start(GTK_BOX (pipe_vb), top_hb, TRUE, TRUE, 0);
4079 gtk_widget_show(top_hb);
4081 edit_fr = gtk_frame_new("");
4082 gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
4083 gtk_widget_show(edit_fr);
4085 list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
4086 gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
4087 gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
4088 gtk_widget_show(list_bb);
4090 new_bt = gtk_button_new_from_stock(GTK_STOCK_NEW);
4091 g_signal_connect(new_bt, "clicked", G_CALLBACK(pipe_new_bt_clicked_cb), NULL);
4092 gtk_widget_show(new_bt);
4093 gtk_box_pack_start (GTK_BOX (list_bb), new_bt, FALSE, FALSE, 0);
4094 gtk_widget_set_tooltip_text (new_bt, "Add a new pipe (with default properties)");
4096 del_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
4097 g_signal_connect(del_bt, "clicked", G_CALLBACK(pipe_del_bt_clicked_cb), NULL);
4098 gtk_widget_show(del_bt);
4099 gtk_widget_set_sensitive(del_bt, FALSE);
4100 gtk_box_pack_start (GTK_BOX (list_bb), del_bt, FALSE, FALSE, 0);
4101 gtk_widget_set_tooltip_text (del_bt, "Remove the selected pipe from the list");
4102 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY, del_bt);
4104 pipe_fr = gtk_frame_new("Pipes");
4105 gtk_box_pack_start(GTK_BOX(top_hb), pipe_fr, TRUE, TRUE, 0);
4106 gtk_widget_show(pipe_fr);
4108 pipe_sc = scrolled_window_new(NULL, NULL);
4109 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pipe_sc),
4112 gtk_container_set_border_width (GTK_CONTAINER (pipe_sc), 5);
4113 gtk_container_add(GTK_CONTAINER(pipe_fr), pipe_sc);
4114 gtk_widget_show(pipe_sc);
4116 store = gtk_list_store_new(1, G_TYPE_STRING);
4117 pipe_l = tree_view_new(GTK_TREE_MODEL(store));
4118 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pipe_l), FALSE);
4120 renderer = gtk_cell_renderer_text_new();
4121 column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
4122 gtk_tree_view_column_set_expand(column, TRUE);
4123 gtk_tree_view_column_set_sort_column_id(column, 0);
4124 gtk_tree_view_append_column(GTK_TREE_VIEW(pipe_l), column);
4126 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
4127 gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
4128 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY, pipe_l);
4129 g_signal_connect(sel, "changed", G_CALLBACK(pipe_sel_list_cb), pipe_vb);
4130 gtk_container_add(GTK_CONTAINER(pipe_sc), pipe_l);
4131 gtk_widget_show(pipe_l);
4135 g_object_unref(G_OBJECT(store));
4137 props_fr = gtk_frame_new("");
4138 gtk_box_pack_start(GTK_BOX(pipe_vb), props_fr, FALSE, FALSE, 0);
4139 gtk_widget_show(props_fr);
4141 props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4142 gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
4143 gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
4144 gtk_widget_show(props_vb);
4146 middle_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4147 gtk_box_pack_start(GTK_BOX (props_vb), middle_hb, TRUE, TRUE, 0);
4148 gtk_widget_show(middle_hb);
4150 pipe_lb = gtk_label_new("Pipe:");
4151 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_lb, FALSE, FALSE, 3);
4152 pipe_te = gtk_entry_new();
4153 gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_te),
4154 "Enter the name of the pipe data should be captured from. "
4156 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_te, TRUE, TRUE, 3);
4157 gtk_widget_set_sensitive(pipe_te, FALSE);
4158 pipe_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
4159 gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_bt),
4160 "Select a pipe from which data should be captured, "
4161 "instead of entering the pipe name directly. "
4163 gtk_box_pack_start(GTK_BOX(middle_hb), pipe_bt, FALSE, FALSE, 0);
4164 g_signal_connect(pipe_te, "changed", G_CALLBACK(pipe_name_te_changed_cb), NULL);
4165 g_signal_connect(pipe_bt, "clicked", G_CALLBACK(capture_prep_pipe_cb), pipe_te);
4167 bbox = dlg_button_row_new(GTK_STOCK_SAVE, GTK_STOCK_CLOSE, NULL);
4168 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4170 add_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
4171 g_signal_connect(add_bt, "clicked", G_CALLBACK(add_pipe_cb), interface_management_w);
4172 gtk_widget_set_tooltip_text(GTK_WIDGET(add_bt), "Add pipe to the list of interfaces.");
4174 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
4175 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4176 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4178 gtk_widget_show(bbox);
4179 gtk_widget_show(temp_page);
4181 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY, pipe_te);
4183 /* --- Local interfaces --- */
4184 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4185 tmp = gtk_label_new("Local Interfaces");
4186 gtk_widget_show(tmp);
4187 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4188 gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
4189 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4191 local_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4192 gtk_container_set_border_width(GTK_CONTAINER(local_vb), 0);
4193 gtk_box_pack_start(GTK_BOX(temp_page), local_vb, TRUE, TRUE, 0);
4194 gtk_widget_show(local_vb);
4196 local_fr = gtk_frame_new("Local Interfaces");
4197 gtk_box_pack_start(GTK_BOX(local_vb), local_fr, TRUE, TRUE, 0);
4198 gtk_widget_show(local_fr);
4200 local_sc = scrolled_window_new(NULL, NULL);
4201 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(local_sc),
4204 gtk_container_set_border_width (GTK_CONTAINER (local_sc), 5);
4205 gtk_container_add(GTK_CONTAINER(local_fr), local_sc);
4206 gtk_widget_show(local_sc);
4208 local_l = gtk_tree_view_new();
4211 renderer = gtk_cell_renderer_text_new();
4212 column = gtk_tree_view_column_new_with_attributes("Friendly Name", renderer, "text", 0, NULL);
4213 gtk_tree_view_column_set_expand(column, TRUE);
4214 gtk_tree_view_column_set_sort_column_id(column, 0);
4215 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4218 renderer = gtk_cell_renderer_text_new();
4219 column = gtk_tree_view_column_new_with_attributes("Interface Name", renderer, "text", 0+LOCAL_OFFSET, NULL);
4220 gtk_tree_view_column_set_expand(column, TRUE);
4221 gtk_tree_view_column_set_sort_column_id(column, 0+LOCAL_OFFSET);
4222 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4224 toggle_renderer = gtk_cell_renderer_toggle_new();
4225 column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 1+LOCAL_OFFSET, NULL);
4226 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (local_hide_cb), NULL);
4227 gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
4228 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
4230 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY, local_l);
4231 gtk_container_add(GTK_CONTAINER(local_sc), local_l);
4232 gtk_widget_show(local_l);
4236 bbox = dlg_button_row_new(GTK_STOCK_REFRESH, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL);
4238 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4239 refresh_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_REFRESH);
4240 g_signal_connect(refresh_bt, "clicked", G_CALLBACK(rescan_local_cb), NULL);
4241 gtk_widget_set_tooltip_text(GTK_WIDGET(refresh_bt), "Rescan the local interfaces and refresh the list");
4243 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
4244 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4245 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4247 apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
4248 g_signal_connect(GTK_WIDGET(apply_bt), "clicked", G_CALLBACK(apply_local_cb), NULL);
4249 gtk_widget_set_tooltip_text(GTK_WIDGET(apply_bt), "Apply the changes to the general list of local interfaces");
4251 gtk_widget_show(bbox);
4252 gtk_widget_show(temp_page);
4255 #if defined (HAVE_PCAP_REMOTE)
4256 /* --- remote interfaces --- */
4257 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
4258 tmp = gtk_label_new("Remote Interfaces");
4259 gtk_widget_show(tmp);
4260 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4261 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
4262 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
4264 remote_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4265 gtk_container_set_border_width(GTK_CONTAINER(remote_vb), 0);
4266 gtk_box_pack_start(GTK_BOX(temp_page), remote_vb, TRUE, TRUE, 0);
4267 gtk_widget_show(remote_vb);
4269 remote_fr = gtk_frame_new("Remote Interfaces");
4270 gtk_box_pack_start(GTK_BOX(remote_vb), remote_fr, TRUE, TRUE, 0);
4271 gtk_widget_show(remote_fr);
4273 remote_sc = scrolled_window_new(NULL, NULL);
4274 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(remote_sc),
4277 gtk_container_set_border_width (GTK_CONTAINER (remote_sc), 5);
4278 gtk_container_add(GTK_CONTAINER(remote_fr), remote_sc);
4279 gtk_widget_show(remote_sc);
4281 remote_l = gtk_tree_view_new();
4283 renderer = gtk_cell_renderer_text_new();
4284 column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", 0, NULL);
4285 gtk_tree_view_column_set_expand(column, TRUE);
4286 gtk_tree_view_column_set_sort_column_id(column, 0);
4287 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4289 renderer = gtk_cell_renderer_text_new();
4290 column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", 1, NULL);
4291 gtk_tree_view_column_set_expand(column, TRUE);
4292 gtk_tree_view_column_set_sort_column_id(column, 1);
4293 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4295 toggle_renderer = gtk_cell_renderer_toggle_new();
4296 column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 2, NULL);
4297 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (remote_hide_cb), NULL);
4298 gtk_tree_view_column_set_cell_data_func(column, toggle_renderer, button_hide_cb, NULL, FALSE);
4299 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4300 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
4302 renderer = gtk_cell_renderer_text_new();
4303 column = gtk_tree_view_column_new_with_attributes("Control", renderer, "text", 3, NULL);
4304 gtk_tree_view_column_set_visible(column, FALSE);
4305 gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
4307 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
4308 gtk_tree_selection_set_select_function(selection, select_host_cb, NULL, FALSE);
4310 g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY, remote_l);
4311 gtk_container_add(GTK_CONTAINER(remote_sc), remote_l);
4312 gtk_widget_show(remote_l);
4316 bbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4317 gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
4318 gtk_widget_show(bbox);
4320 button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
4321 gtk_box_pack_end(GTK_BOX(bbox), button_hbox, FALSE, FALSE, 0);
4322 gtk_widget_show(button_hbox);
4323 gtk_box_set_spacing(GTK_BOX(button_hbox), DLG_BUTTON_SPACING);
4325 help_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
4326 gtk_box_pack_start(GTK_BOX(bbox), help_hbox, FALSE, FALSE, 0);
4327 gtk_widget_show(help_hbox);
4328 gtk_box_set_spacing(GTK_BOX(help_hbox), DLG_BUTTON_SPACING);
4330 add_but = gtk_button_new_from_stock(GTK_STOCK_ADD);
4331 g_object_set_data(G_OBJECT(bbox), GTK_STOCK_ADD, add_but);
4332 gtk_box_pack_start(GTK_BOX(help_hbox), add_but, FALSE, FALSE, 0);
4333 g_signal_connect(add_but, "clicked", G_CALLBACK(show_remote_dialog), NULL);
4334 gtk_widget_set_tooltip_text(GTK_WIDGET(add_but), "Add a remote host to the list");
4335 gtk_widget_show(add_but);
4337 delete_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
4338 g_object_set_data(G_OBJECT(bbox), GTK_STOCK_DELETE, delete_bt);
4339 gtk_box_pack_start(GTK_BOX(help_hbox), delete_bt, FALSE, FALSE, 0);
4340 g_signal_connect(delete_bt, "clicked", G_CALLBACK(remove_remote_host), NULL);
4341 gtk_widget_set_tooltip_text(GTK_WIDGET(delete_bt), "Remove a remote host from the list");
4342 gtk_widget_set_sensitive(GTK_WIDGET(delete_bt), FALSE);
4343 g_object_set_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY, delete_bt);
4344 gtk_widget_show(delete_bt);
4346 ok_but = gtk_button_new_from_stock(GTK_STOCK_APPLY);
4347 gtk_box_pack_end(GTK_BOX(button_hbox), ok_but, FALSE, FALSE, 0);
4348 g_signal_connect(GTK_WIDGET(ok_but), "clicked", G_CALLBACK(ok_remote_cb), NULL);
4349 gtk_widget_set_tooltip_text(GTK_WIDGET(ok_but), "Apply the changes to the general list of local interfaces");
4350 gtk_widget_show(ok_but);
4352 cancel_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
4353 gtk_box_pack_end(GTK_BOX(button_hbox), cancel_bt, FALSE, FALSE, 0);
4354 g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
4355 gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
4356 gtk_widget_show(cancel_bt);
4358 gtk_widget_show(temp_page);
4361 gtk_widget_show_all(interface_management_w);
4364 /* show capture prepare (options) dialog */
4367 Note that capture_interface_list() is called directly (or indirectly) during the
4368 creation of (and changes to) the capture options dialog window.
4370 Also note that capture_interface_list() indirectly runs the gtk main loop temporarily
4371 to process queued events (which may include button-presses, key-presses, etc).
4372 (This is done while awaiting a response from dumpcap which is invoked to obtain
4373 the capture interface list).
4374 This means other Wireshark callbacks can be invoked while the capture options window
4375 is being created or updated (in effect an "interrupt" can occur).
4377 Needless to say, "race conditions" may occur in "interrupt" code which depends upon the exact
4378 state of the capture options dialog window and which may be invoked during the
4379 creation of (or changes to) the capture options dialog window.
4381 For example: if a user hits "Capture:Options" and then immediately hits "Capture:Start",
4382 capture_start_cb() may be invoked before capture_prep_cb() has been completed (i.e., during
4383 a call to capture_interface_list() in the code which creates the capture options window).
4384 capture_start_cb() depends upon certain properties of the capture options window having been
4385 initialized and thus fails if the properties have not (yet) been initialized.
4387 An interlock has been added to handle this particular situation;
4388 Ideally a more general solution should be implemented since it's probably difficult
4389 (if not nearly impossible) to identify all the possible "race conditions".
4391 ? Prevent the temporary running of the gtk main loop in cases wherein dumpcap is invoked for a
4392 simple request/reply ? (e.g., capture_interface_list()) ??
4398 columns_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
4400 GtkWidget *menu = (GtkWidget *)data;
4401 GdkEventButton *event_button = NULL;
4403 /* context menu handler */
4404 if (event->type == GDK_BUTTON_PRESS) {
4405 event_button = (GdkEventButton *) event;
4407 /* To quote the "Gdk Event Structures" doc:
4408 * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
4409 if (event_button->button == 3) {
4410 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, widget,
4411 event_button->button,
4412 event_button->time);
4413 g_signal_stop_emission_by_name(widget, "button_press_event");
4421 update_properties_all(void)
4425 gboolean capture_all;
4426 gboolean promisc_all;
4427 gboolean filter_all;
4429 GtkWidget *promisc_b;
4430 GtkWidget *capture_b;
4431 GtkWidget *all_filter_te;
4433 /* If we don't have a Capture Options dialog open, there's nothing
4435 if (cap_open_w == NULL)
4438 /* Determine whether all interfaces:
4440 are selected for capturing;
4442 all selected interfaces are in promiscuous mode;
4444 all selected interfaces have the same capture filter.
4446 Start out by assuming that all three are the case, and change that
4447 once we find an interface where it's not the case. */
4452 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
4453 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
4454 if (!device.hidden) {
4455 if (!device.selected) {
4456 /* This interface isn't selected, so not all interfaces are selected. */
4457 capture_all = FALSE;
4459 /* This interface is selected; is it in promiscuous mode? */
4460 if (!device.pmode) {
4461 /* No, so not all selected interfaces are in promiscuous mode. */
4462 promisc_all = FALSE;
4464 /* Have we seen the same capture filter on all interfaces at
4465 which we've looked so far? */
4466 if (device.cfilter != NULL && filter_all) {
4467 /* Yes. Is this the first interface for which we've seen a
4469 if (filter_str == NULL) {
4470 /* First selected interface - save its capture filter;
4471 there aren't any filters against which to compare. */
4472 filter_str = g_strdup(device.cfilter);
4474 /* Not the first selected interface; is its capture filter
4475 the same as the one the other interfaces we've looked
4477 if (strcmp(device.cfilter, filter_str) != 0) {
4478 /* No, so not all selected interfaces have the same capture
4480 if (filter_str != NULL) {
4492 /* If all interfaces are selected, check the "capture on all interfaces"
4493 checkbox, otherwise un-check it. */
4494 capture_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL);
4495 g_signal_handler_block(capture_b, capture_all_handler_id);
4496 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(capture_b), capture_all);
4497 g_signal_handler_unblock(capture_b, capture_all_handler_id);
4499 /* If all selected interfaces are in promiscuous mode, check the global
4500 "promiscuous mode" checkbox, otherwise un-check it. */
4501 promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
4502 g_signal_handler_block(promisc_b, promisc_all_handler_id);
4503 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), promisc_all);
4504 g_signal_handler_unblock(promisc_b, promisc_all_handler_id);
4506 /* If all selected interfaces have the same filter string, set the
4507 global filter string to it. */
4508 all_filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY)));
4510 /* Either no interfaces were selected, or all selected interfaces
4511 have the same filter. In the former case, make the global capture
4512 filter empty; in the latter case, make it that filter. */
4513 if (filter_str != NULL) {
4514 gtk_entry_set_text(GTK_ENTRY(all_filter_te), filter_str);
4517 gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
4520 /* Not all selected interfaces have the same filter, so there is no
4521 global capture filter; make it empty to reflect that. */
4522 gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
4528 column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
4530 GtkWidget *col = (GtkWidget *) data;
4532 GtkWidget *menu = (GtkWidget *)g_object_get_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY);
4534 view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
4535 g_object_set_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY, col);
4536 return columns_menu_handler (widget, event, menu);
4541 capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
4544 *main_hb, *left_vb, *right_vb,
4545 *capture_fr, *capture_vb,
4547 *promisc_cb, *pcap_ng_cb,
4549 *file_hb, *file_bt, *file_lb, *file_te,
4550 *multi_hb, *multi_grid, *multi_files_on_cb,
4551 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
4552 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
4553 *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
4554 *stop_files_cb, *stop_files_sb, *stop_files_lb,
4555 *limit_fr, *limit_vb, *limit_hb, *limit_grid,
4556 *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
4557 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
4558 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
4559 *display_fr, *display_vb,
4560 *sync_cb, *auto_scroll_cb, *hide_info_cb,
4561 *resolv_fr, *resolv_vb,
4562 *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb,
4564 *all_filter_cm, *all_filter_te, *all_filter_bt, *all_filter_hb,
4568 GtkWidget *decryption_cb;
4572 GtkWidget *iftype_cbx;
4574 GtkAdjustment *ringbuffer_nbf_adj,
4575 *stop_packets_adj, *stop_filesize_adj, *stop_duration_adj, *stop_files_adj,
4576 *ring_filesize_adj, *file_duration_adj;
4582 GtkCellRenderer *renderer;
4583 GtkCellRenderer *toggle_renderer;
4584 GtkTreeSelection *selection;
4585 GtkTreeViewColumn *column;
4586 gboolean if_present = TRUE;
4587 GList *all_cfilter_list, *cf_entry;
4588 window_geometry_t tl_geom;
4589 const gchar *new_cfilter;
4591 if (interfaces_dialog_window_present()) {
4592 destroy_if_window();
4594 if (cap_open_w != NULL) {
4595 /* There's already a "Capture Options" dialog box; reactivate it. */
4596 reactivate_window(cap_open_w);
4599 init_columns_menu();
4601 /* use user-defined title if preference is set */
4603 cap_title = create_user_window_title("Wireshark: Capture Options");
4605 cap_open_complete = FALSE;
4606 cap_open_w = dlg_window_new(cap_title);
4610 /* update airpcap interface list */
4612 /* load the airpcap interfaces */
4613 airpcap_if_list = get_airpcap_interface_list(&err, &err_str);
4615 /* If we don't get a list don't do any thing.
4616 * If the error is AIRPCAP_NOT_LOADED it avoids an unnecessary rescan of the packet list
4617 * ( see airpcap_loader.h for error codes).
4619 if (airpcap_if_list == NULL) {
4620 if (err == CANT_GET_AIRPCAP_INTERFACE_LIST) {
4621 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
4625 decryption_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
4626 /* XXXX update_decryption_mode_list() triggers a rescan, should only be done if the mode is changed */
4627 update_decryption_mode_list(decryption_cb);
4628 /* select the first as default (THIS SHOULD BE CHANGED) */
4629 airpcap_if_active = airpcap_get_default_if(airpcap_if_list);
4633 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4634 gtk_container_set_border_width(GTK_CONTAINER(main_vb), DLG_OUTER_MARGIN);
4635 gtk_container_add(GTK_CONTAINER(cap_open_w), main_vb);
4637 /* Capture-related options frame */
4638 capture_fr = frame_new("Capture");
4639 gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
4641 capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
4642 gtk_container_set_border_width(GTK_CONTAINER(capture_vb), DLG_OUTER_MARGIN);
4643 gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
4645 #if defined (HAVE_PCAP_REMOTE)
4646 if (remote_host_list == NULL) {
4647 remote_host_list = g_hash_table_new (g_str_hash, g_str_equal);
4651 swindow = gtk_scrolled_window_new (NULL, NULL);
4652 gtk_widget_set_size_request(swindow, 676, 180);
4653 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
4655 view = gtk_tree_view_new ();
4656 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (view), TRUE);
4657 g_signal_connect(view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)cap_open_w);
4659 toggle_renderer = gtk_cell_renderer_toggle_new();
4660 column = gtk_tree_view_column_new_with_attributes("Capture", GTK_CELL_RENDERER(toggle_renderer), "active", CAPTURE, NULL);
4661 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4662 g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (toggle_callback), NULL);
4663 g_object_set (GTK_TREE_VIEW(view), "has-tooltip", TRUE, NULL);
4664 g_signal_connect (GTK_TREE_VIEW(view), "query-tooltip", G_CALLBACK (query_tooltip_tree_view_cb), NULL);
4666 renderer = gtk_cell_renderer_text_new();
4667 column = gtk_tree_view_column_new_with_attributes ("",
4668 GTK_CELL_RENDERER(renderer),
4669 "text", IFACE_HIDDEN_NAME,
4671 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4672 gtk_tree_view_column_set_visible(column, FALSE);
4674 renderer = gtk_cell_renderer_text_new ();
4675 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), -1, "Interface", renderer, "markup", INTERFACE, NULL);
4676 column = gtk_tree_view_get_column(GTK_TREE_VIEW (view), INTERFACE);
4677 gtk_tree_view_column_set_min_width(column, 200);
4678 gtk_tree_view_column_set_resizable(column, TRUE );
4679 gtk_tree_view_column_set_alignment(column, 0.5f);
4680 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(INTERFACE));
4681 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("INTERFACE"))
4682 gtk_tree_view_column_set_visible(column, TRUE);
4684 gtk_tree_view_column_set_visible(column, FALSE);
4685 g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
4687 renderer = gtk_cell_renderer_text_new();
4688 column = gtk_tree_view_column_new_with_attributes ("Link-layer header", renderer, "text", LINK, NULL);
4689 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4690 gtk_tree_view_column_set_clickable(column, TRUE);
4691 gtk_tree_view_column_set_reorderable(column, TRUE);
4692 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW (view),LINK), TRUE );
4693 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(LINK));
4694 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4695 G_CALLBACK(column_button_pressed_cb), column);
4696 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("LINK"))
4697 gtk_tree_view_column_set_visible(column, TRUE);
4699 gtk_tree_view_column_set_visible(column, FALSE);
4700 gtk_tree_view_column_set_alignment(column, 0.5f);
4702 renderer = gtk_cell_renderer_text_new();
4703 column = gtk_tree_view_column_new_with_attributes("Prom. Mode", renderer, "text", PMODE, NULL);
4704 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4705 g_object_set(renderer, "xalign", 0.5f, NULL);
4706 gtk_tree_view_column_set_clickable(column, TRUE);
4707 gtk_tree_view_column_set_reorderable(column, TRUE);
4708 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(PMODE));
4709 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4710 G_CALLBACK(column_button_pressed_cb), column);
4711 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("PMODE"))
4712 gtk_tree_view_column_set_visible(column, TRUE);
4714 gtk_tree_view_column_set_visible(column, FALSE);
4715 gtk_tree_view_column_set_alignment(column, 0.5f);
4717 renderer = gtk_cell_renderer_text_new();
4718 column = gtk_tree_view_column_new_with_attributes("Snaplen [B]", renderer, "text", SNAPLEN, NULL);
4719 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4720 gtk_tree_view_column_set_clickable(column, TRUE);
4721 gtk_tree_view_column_set_reorderable(column, TRUE);
4722 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(SNAPLEN));
4723 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4724 G_CALLBACK(column_button_pressed_cb), column);
4725 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("SNAPLEN"))
4726 gtk_tree_view_column_set_visible(column, TRUE);
4728 gtk_tree_view_column_set_visible(column, FALSE);
4729 g_object_set(renderer, "xalign", 0.5f, NULL);
4731 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
4732 renderer = gtk_cell_renderer_text_new();
4733 column = gtk_tree_view_column_new_with_attributes("Buffer [MB]", renderer, "text", BUFFER, NULL);
4734 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4735 gtk_tree_view_column_set_reorderable(column, TRUE);
4736 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(BUFFER));
4737 gtk_tree_view_column_set_clickable(column, TRUE);
4738 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4739 G_CALLBACK(column_button_pressed_cb), column);
4740 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("BUFFER"))
4741 gtk_tree_view_column_set_visible(column, TRUE);
4743 gtk_tree_view_column_set_visible(column, FALSE);
4744 g_object_set(renderer, "xalign", 0.5f, NULL);
4747 #if defined (HAVE_PCAP_CREATE)
4748 renderer = gtk_cell_renderer_text_new();
4749 column = gtk_tree_view_column_new_with_attributes ("Mon. Mode", renderer, "text", MONITOR, NULL);
4750 gtk_tree_view_column_set_cell_data_func(column, renderer, activate_monitor, NULL, FALSE);
4751 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4752 gtk_tree_view_column_set_reorderable(column, TRUE);
4753 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(MONITOR));
4754 gtk_tree_view_column_set_clickable(column, TRUE);
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("MONITOR"))
4758 gtk_tree_view_column_set_visible(column, TRUE);
4760 gtk_tree_view_column_set_visible(column, FALSE);
4761 g_object_set(renderer, "xalign", 0.5f, NULL);
4764 renderer = gtk_cell_renderer_text_new();
4765 column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", FILTER, NULL);
4766 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
4767 gtk_tree_view_column_set_alignment(column, 0.5f);
4768 create_and_fill_model(GTK_TREE_VIEW(view));
4769 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
4770 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
4771 gtk_tree_view_column_set_clickable(column, TRUE);
4772 gtk_tree_view_column_set_reorderable(column, TRUE);
4773 g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(FILTER));
4774 g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
4775 G_CALLBACK(column_button_pressed_cb), column);
4776 if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("FILTER"))
4777 gtk_tree_view_column_set_visible(column, TRUE);
4779 gtk_tree_view_column_set_visible(column, FALSE);
4780 gtk_container_add (GTK_CONTAINER (swindow), view);
4781 gtk_box_pack_start(GTK_BOX(capture_vb), swindow, TRUE, TRUE, 0);
4783 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY, view);
4785 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4786 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
4787 gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 0);
4788 all_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4789 gtk_container_set_border_width(GTK_CONTAINER(all_vb), 0);
4790 gtk_box_pack_start(GTK_BOX(main_hb), all_vb, TRUE, TRUE, 0);
4792 all_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4793 gtk_container_set_border_width(GTK_CONTAINER(all_hb), 0);
4794 gtk_box_pack_start(GTK_BOX(all_vb), all_hb, TRUE, TRUE, 0);
4796 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4797 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
4798 gtk_box_pack_start(GTK_BOX(all_hb), left_vb, TRUE, TRUE, 0);
4800 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
4801 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
4802 gtk_box_pack_start(GTK_BOX(all_hb), right_vb, FALSE, FALSE, 3);
4804 all_cb = gtk_check_button_new_with_mnemonic( "Capture on all interfaces");
4805 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(all_cb), FALSE);
4806 capture_all_handler_id = g_signal_connect(all_cb, "toggled", G_CALLBACK(capture_all_cb), NULL);
4807 gtk_widget_set_tooltip_text(all_cb, "Activate the box to capture on all interfaces. "
4808 "Deactivate it to capture on none and set the interfaces individually.");
4809 gtk_box_pack_start(GTK_BOX(left_vb), all_cb, TRUE, TRUE, 0);
4811 gtk_widget_set_sensitive(GTK_WIDGET(all_cb), if_present);
4812 /* Promiscuous mode row */
4813 promisc_cb = gtk_check_button_new_with_mnemonic("Use _promiscuous mode on all interfaces");
4814 if (!global_capture_session.session_started) {
4815 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
4817 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), get_all_prom_mode());
4819 promisc_all_handler_id = g_signal_connect(promisc_cb, "toggled", G_CALLBACK(promisc_mode_callback), NULL);
4821 gtk_widget_set_tooltip_text(promisc_cb,
4822 "Usually a network adapter will only capture the traffic sent to its own network address. "
4823 "If you want to capture all traffic that all network adapters can \"see\", select this option. "
4824 "If you want to set this option on a per-interface basis, do not select this option. "
4825 "Instead, select the individual checkboxes in the interface list's \"Prom. Mode\" column. "
4826 "See the FAQ for some more details of capturing packets from a switched network.");
4827 gtk_box_pack_start(GTK_BOX(left_vb), promisc_cb, TRUE, TRUE, DLG_LABEL_SPACING);
4829 iftype_cbx = gtk_button_new_with_label("Manage Interfaces");
4830 gtk_widget_set_tooltip_text(iftype_cbx, "Add a new interface or pipe to capture from or remove "
4831 "an interface from the list.");
4832 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFTYPE_CBX_KEY, iftype_cbx);
4834 gtk_box_pack_start(GTK_BOX(right_vb), iftype_cbx, FALSE, FALSE, 0);
4835 g_signal_connect(iftype_cbx, "clicked", G_CALLBACK(show_add_interfaces_dialog), cap_open_w);
4836 gtk_widget_show(iftype_cbx);
4838 main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
4839 gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
4840 gtk_box_pack_start(GTK_BOX(main_vb), main_hb, FALSE, FALSE, 0);
4842 left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4843 gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
4844 gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
4846 right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
4847 gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
4848 gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 0);
4851 all_filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4852 gtk_box_pack_start(GTK_BOX(all_vb), all_filter_hb, FALSE, FALSE, DLG_LABEL_SPACING);
4854 all_filter_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
4855 g_signal_connect(all_filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
4856 g_signal_connect(all_filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
4857 gtk_widget_set_tooltip_text(all_filter_bt,
4858 "Select a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
4859 "See \"Capture Filters\" in the online help for further information how to use it."
4861 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_bt, FALSE, FALSE, 0);
4863 /* Create the capture filter combo box*/
4864 all_filter_cm = gtk_combo_box_text_new_with_entry();
4865 g_object_set_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY, all_filter_cm);
4866 all_filter_te = gtk_bin_get_child(GTK_BIN(all_filter_cm));
4867 colorize_filter_te_as_empty(all_filter_te);
4868 g_signal_connect(all_filter_te, "changed", G_CALLBACK(capture_all_filter_check_syntax_cb), NULL);
4869 g_signal_connect(all_filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
4871 all_cfilter_list = recent_get_cfilter_list(NULL);
4872 for (cf_entry = all_cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
4873 new_cfilter = (const gchar *)cf_entry->data;
4874 /* If this is the default cfilter, don't put it in the list, as it'll
4876 if (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0) {
4877 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), new_cfilter);
4880 if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
4881 fprintf(stderr, "Adding the default filter \"%s\"???\n", global_capture_opts.default_options.cfilter);
4882 gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), global_capture_opts.default_options.cfilter);
4883 gtk_combo_box_set_active(GTK_COMBO_BOX(all_filter_cm), 0);
4886 gtk_widget_set_tooltip_text(all_filter_cm,
4887 "Enter a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
4888 "See \"Capture Filters\" in the online help for further information how to use it. "
4889 "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
4891 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_cm, TRUE, TRUE, DLG_BUTTON_SPACING);
4893 /* let an eventually capture filters dialog know the text entry to fill in */
4894 g_object_set_data(G_OBJECT(all_filter_bt), E_FILT_TE_PTR_KEY, all_filter_te);
4896 #if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
4897 all_compile_bt = gtk_button_new_with_label("Compile selected BPFs");
4898 g_signal_connect(all_compile_bt, "clicked", G_CALLBACK(capture_all_filter_compile_cb), NULL);
4899 gtk_widget_set_tooltip_text(all_compile_bt,
4900 "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
4901 /* We can't compile without any supported link-types, so disable the button in that case */
4902 gtk_box_pack_start(GTK_BOX(all_filter_hb), all_compile_bt, FALSE, FALSE, DLG_BUTTON_SPACING);
4903 if (global_capture_opts.num_selected > 0) {
4904 gtk_widget_set_sensitive(all_compile_bt, TRUE);
4906 gtk_widget_set_sensitive(all_compile_bt, FALSE);
4910 /* Capture file-related options frame */
4911 file_fr = frame_new("Capture Files");
4912 gtk_box_pack_start(GTK_BOX (left_vb), file_fr, TRUE, TRUE, 0);
4914 file_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
4915 gtk_container_set_border_width(GTK_CONTAINER(file_vb), DLG_OUTER_MARGIN);
4916 gtk_container_add(GTK_CONTAINER(file_fr), file_vb);
4919 file_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
4920 gtk_box_pack_start(GTK_BOX(file_vb), file_hb, FALSE, FALSE, 0);
4922 file_lb = gtk_label_new("File:");
4923 gtk_box_pack_start(GTK_BOX(file_hb), file_lb, FALSE, FALSE, 3);
4925 file_te = gtk_entry_new();
4926 gtk_widget_set_tooltip_text(file_te,
4927 "Enter the file name to which captured data will be written. "
4928 "If you don't enter something here, a temporary file will be used."
4930 gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 3);
4932 file_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
4933 gtk_widget_set_tooltip_text(file_bt,
4934 "Select a file to which captured data will be written, "
4935 "instead of entering the file name directly. "
4937 gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 0);
4939 g_signal_connect(file_bt, "clicked", G_CALLBACK(capture_prep_file_cb), file_te);
4941 /* multiple files table */
4942 /* XXX We want multi_grid to shrink to its minimum size horizontally
4943 * and be left-aligned within file_fr. Using a horizontal GtkBox works
4944 * in Gtk2 but not Gtk3. The situation gets sillier below with limit_fr
4945 * and limit_grid because we have both horizontal and vertical GtkBoxes.
4947 multi_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
4948 gtk_box_pack_start(GTK_BOX(file_vb), multi_hb, FALSE, FALSE, 0);
4949 multi_grid = ws_gtk_grid_new();
4950 ws_gtk_grid_set_row_spacing(GTK_GRID(multi_grid), DLG_LABEL_SPACING);
4951 ws_gtk_grid_set_column_spacing(GTK_GRID(multi_grid), DLG_UNRELATED_SPACING);
4952 gtk_box_pack_start(GTK_BOX(multi_hb), multi_grid, FALSE, FALSE, 0);
4955 /* multiple files row */
4956 multi_files_on_cb = gtk_check_button_new_with_mnemonic("Use _multiple files");
4957 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb),
4958 global_capture_opts.multi_files_on);
4959 g_signal_connect(multi_files_on_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity),
4961 gtk_widget_set_tooltip_text(multi_files_on_cb,
4962 "Instead of using a single capture file, multiple files will be created. "
4963 "The generated file names will contain an incrementing number and the start time of the capture.");
4964 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), multi_files_on_cb, 0, row, 1, 1,
4965 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4968 pcap_ng_cb = gtk_check_button_new_with_mnemonic("Use pcap-ng format");
4969 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), global_capture_opts.use_pcapng);
4970 gtk_widget_set_tooltip_text(pcap_ng_cb, "Capture packets in the next-generation capture file format. "
4971 "This is still experimental.");
4972 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), pcap_ng_cb, 2, row, 1, 1,
4973 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4976 /* Ring buffer filesize row */
4977 ring_filesize_cb = gtk_check_button_new_with_label("Next file every");
4978 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb),
4979 global_capture_opts.has_autostop_filesize || !global_capture_opts.has_file_duration);
4980 g_signal_connect(ring_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
4981 gtk_widget_set_tooltip_text(ring_filesize_cb,
4982 "If the selected file size is exceeded, capturing switches to the next file.\n"
4983 "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
4984 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cb, 0, row, 1, 1,
4985 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4987 ring_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
4988 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
4989 ring_filesize_sb = gtk_spin_button_new (ring_filesize_adj, 0, 0);
4990 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ring_filesize_sb), TRUE);
4991 gtk_widget_set_size_request(ring_filesize_sb, 80, -1);
4992 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_sb, 1, row, 1, 1,
4993 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4995 ring_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
4996 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cbx, 2, row, 1, 1,
4997 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
4999 value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
5000 gtk_adjustment_set_value(ring_filesize_adj, (gdouble) value);
5004 /* Ring buffer duration row */
5005 file_duration_cb = gtk_check_button_new_with_label("Next file every");
5006 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_duration_cb),
5007 global_capture_opts.has_file_duration);
5008 g_signal_connect(file_duration_cb, "toggled",
5009 G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5010 gtk_widget_set_tooltip_text(file_duration_cb,
5011 "If the selected duration is exceeded, capturing switches to the next file.\n"
5012 "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
5013 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_cb, 0, row, 1, 1,
5014 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5016 file_duration_adj = (GtkAdjustment *)gtk_adjustment_new(0.0,
5017 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5018 file_duration_sb = gtk_spin_button_new (file_duration_adj, 0, 0);
5019 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (file_duration_sb), TRUE);
5020 gtk_widget_set_size_request(file_duration_sb, 80, -1);
5021 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_sb, 1, row, 1, 1,
5022 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5024 file_duration_cbx = time_unit_combo_box_new(global_capture_opts.file_duration);
5025 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_duration_cbx, 2, row, 1, 1,
5026 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5028 value = time_unit_combo_box_convert_value(global_capture_opts.file_duration);
5029 gtk_adjustment_set_value(file_duration_adj, (gdouble) value);
5032 /* Ring buffer files row */
5033 ringbuffer_nbf_cb = gtk_check_button_new_with_label("Ring buffer with");
5034 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb),
5035 global_capture_opts.has_ring_num_files);
5036 g_signal_connect(ringbuffer_nbf_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5037 gtk_widget_set_tooltip_text(ringbuffer_nbf_cb,
5038 "After capturing has switched to the next file and the given number of files has exceeded, "
5039 "the oldest file will be removed."
5041 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_cb, 0, row, 1, 1,
5042 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5044 ringbuffer_nbf_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.ring_num_files,
5045 2/*RINGBUFFER_MIN_NUM_FILES*/, RINGBUFFER_MAX_NUM_FILES, 1.0, 10.0, 0.0);
5046 ringbuffer_nbf_sb = gtk_spin_button_new (ringbuffer_nbf_adj, 0, 0);
5047 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ringbuffer_nbf_sb), TRUE);
5048 gtk_widget_set_size_request(ringbuffer_nbf_sb, 80, -1);
5049 g_signal_connect(ringbuffer_nbf_sb, "changed", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5050 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_sb, 1, row, 1, 1,
5051 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5053 ringbuffer_nbf_lb = gtk_label_new("files");
5054 gtk_misc_set_alignment(GTK_MISC(ringbuffer_nbf_lb), 0, 0.5f);
5055 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_lb, 2, row, 1, 1,
5056 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5061 stop_files_cb = gtk_check_button_new_with_label("Stop capture after");
5062 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_files_cb),
5063 global_capture_opts.has_autostop_files);
5064 g_signal_connect(stop_files_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5065 gtk_widget_set_tooltip_text(stop_files_cb, "Stop capturing after the given number of \"file switches\" have been done.");
5066 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), stop_files_cb, 0, row, 1, 1,
5067 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5069 stop_files_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_files,
5070 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5071 stop_files_sb = gtk_spin_button_new (stop_files_adj, 0, 0);
5072 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_files_sb), TRUE);
5073 gtk_widget_set_size_request(stop_files_sb, 80, -1);
5074 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), stop_files_sb, 1, row, 1, 1,
5075 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5077 stop_files_lb = gtk_label_new("file(s)");
5078 gtk_misc_set_alignment(GTK_MISC(stop_files_lb), 0, 0.5f);
5079 ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), stop_files_lb, 2, row, 1, 1,
5080 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5084 /* Capture limits frame */
5085 limit_fr = frame_new("Stop Capture Automatically After...");
5086 gtk_box_pack_start(GTK_BOX (left_vb), limit_fr, TRUE, TRUE, 0);
5088 limit_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5089 gtk_container_set_border_width(GTK_CONTAINER(limit_vb), DLG_OUTER_MARGIN);
5090 gtk_container_add(GTK_CONTAINER(limit_fr), limit_vb);
5093 limit_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
5094 gtk_box_pack_start(GTK_BOX(limit_vb), limit_hb, FALSE, FALSE, 0);
5095 limit_grid = ws_gtk_grid_new();
5096 ws_gtk_grid_set_row_spacing(GTK_GRID(limit_grid), DLG_LABEL_SPACING);
5097 ws_gtk_grid_set_column_spacing(GTK_GRID(limit_grid), DLG_UNRELATED_SPACING);
5098 gtk_box_pack_start(GTK_BOX(limit_hb), limit_grid, FALSE, FALSE, 0);
5101 /* Packet count row */
5102 stop_packets_cb = gtk_check_button_new();
5103 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_packets_cb),
5104 global_capture_opts.has_autostop_packets);
5105 g_signal_connect(stop_packets_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5106 gtk_widget_set_tooltip_text(stop_packets_cb, "Stop capturing after the specified number of packets have been captured.");
5107 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_cb, 0, row, 1, 1,
5108 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5110 stop_packets_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_packets,
5111 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5112 stop_packets_sb = gtk_spin_button_new (stop_packets_adj, 0, 0);
5113 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_packets_sb), TRUE);
5114 gtk_widget_set_size_request(stop_packets_sb, 80, -1);
5115 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_sb, 1, row, 1, 1,
5116 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5118 stop_packets_lb = gtk_label_new("packet(s)");
5119 gtk_misc_set_alignment(GTK_MISC(stop_packets_lb), 0, 0.5f);
5120 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_lb, 2, row, 1, 1,
5121 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5126 stop_filesize_cb = gtk_check_button_new();
5127 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_filesize_cb),
5128 global_capture_opts.has_autostop_filesize);
5129 g_signal_connect(stop_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5130 gtk_widget_set_tooltip_text(stop_filesize_cb, "Stop capturing after the specified amount of data has been captured.");
5131 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cb, 0, row, 1, 1,
5132 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5134 stop_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
5135 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5136 stop_filesize_sb = gtk_spin_button_new (stop_filesize_adj, 0, 0);
5137 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_filesize_sb), TRUE);
5138 gtk_widget_set_size_request(stop_filesize_sb, 80, -1);
5139 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_sb, 1, row, 1, 1,
5140 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5142 stop_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
5143 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cbx, 2, row, 1, 1,
5144 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5146 value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
5147 gtk_adjustment_set_value(stop_filesize_adj, (gdouble) value);
5152 stop_duration_cb = gtk_check_button_new();
5153 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_duration_cb),
5154 global_capture_opts.has_autostop_duration);
5155 g_signal_connect(stop_duration_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5156 gtk_widget_set_tooltip_text(stop_duration_cb, "Stop capturing after the specified amount of time has passed.");
5157 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cb, 0, row, 1, 1,
5158 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5160 stop_duration_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
5161 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
5162 stop_duration_sb = gtk_spin_button_new (stop_duration_adj, 0, 0);
5163 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_duration_sb), TRUE);
5164 gtk_widget_set_size_request(stop_duration_sb, 80, -1);
5165 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_sb, 1, row, 1, 1,
5166 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5168 stop_duration_cbx = time_unit_combo_box_new(global_capture_opts.autostop_duration);
5169 ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cbx, 2, row, 1, 1,
5170 (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
5172 value = time_unit_combo_box_convert_value(global_capture_opts.autostop_duration);
5173 gtk_adjustment_set_value(stop_duration_adj, (gdouble) value);
5176 /* Display-related options frame */
5177 display_fr = frame_new("Display Options");
5178 gtk_box_pack_start(GTK_BOX (right_vb), display_fr, TRUE, TRUE, 0);
5180 display_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5181 gtk_container_set_border_width(GTK_CONTAINER(display_vb), DLG_OUTER_MARGIN);
5182 gtk_container_add(GTK_CONTAINER(display_fr), display_vb);
5184 /* "Update display in real time" row */
5185 sync_cb = gtk_check_button_new_with_mnemonic(
5186 "_Update list of packets in real time");
5187 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sync_cb),
5188 global_capture_opts.real_time_mode);
5189 g_signal_connect(sync_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
5190 gtk_widget_set_tooltip_text(sync_cb,
5191 "Using this option will show the captured packets immediately on the main screen. "
5192 "Please note: this will slow down capturing, so increased packet drops might appear.");
5193 gtk_box_pack_start(GTK_BOX (display_vb), sync_cb, TRUE, TRUE, 0);
5195 /* "Auto-scroll live update" row */
5196 auto_scroll_cb = gtk_check_button_new_with_mnemonic("_Automatically scroll during live capture");
5197 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_scroll_cb), auto_scroll_live);
5198 gtk_widget_set_tooltip_text(auto_scroll_cb,
5199 "This will scroll the \"Packet List\" automatically to the latest captured packet, "
5200 "when the \"Update List of packets in real time\" option is used.");
5201 gtk_box_pack_start(GTK_BOX (display_vb), auto_scroll_cb, TRUE, TRUE, 0);
5203 /* "Hide capture info" row */
5204 hide_info_cb = gtk_check_button_new_with_mnemonic("_Hide capture info dialog");
5205 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hide_info_cb), !global_capture_opts.show_info);
5206 gtk_widget_set_tooltip_text(hide_info_cb, "Hide the capture info dialog while capturing.");
5207 gtk_box_pack_start(GTK_BOX (display_vb), hide_info_cb, TRUE, TRUE, 0);
5209 /* Name Resolution frame */
5210 resolv_fr = frame_new("Name Resolution");
5211 gtk_box_pack_start(GTK_BOX (right_vb), resolv_fr, TRUE, TRUE, 0);
5213 resolv_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
5214 gtk_container_set_border_width(GTK_CONTAINER(resolv_vb), DLG_OUTER_MARGIN);
5215 gtk_container_add(GTK_CONTAINER(resolv_fr), resolv_vb);
5217 m_resolv_cb = gtk_check_button_new_with_mnemonic(
5218 "Resolve _MAC addresses");
5219 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_resolv_cb),
5220 gbl_resolv_flags.mac_name);
5221 gtk_widget_set_tooltip_text(m_resolv_cb, "Perform MAC layer name resolution while capturing.");
5222 gtk_box_pack_start(GTK_BOX (resolv_vb), m_resolv_cb, TRUE, TRUE, 0);
5224 n_resolv_cb = gtk_check_button_new_with_mnemonic(
5225 "Resolve _network-layer names");
5226 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(n_resolv_cb),
5227 gbl_resolv_flags.network_name);
5228 gtk_widget_set_tooltip_text(n_resolv_cb, "Perform network layer name resolution while capturing.");
5229 gtk_box_pack_start(GTK_BOX (resolv_vb), n_resolv_cb, TRUE, TRUE, 0);
5231 t_resolv_cb = gtk_check_button_new_with_mnemonic(
5232 "Resolve _transport-layer name");
5233 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(t_resolv_cb),
5234 gbl_resolv_flags.transport_name);
5235 gtk_widget_set_tooltip_text(t_resolv_cb,
5236 "Perform transport layer name resolution while capturing.");
5237 gtk_box_pack_start(GTK_BOX (resolv_vb), t_resolv_cb, TRUE, TRUE, 0);
5239 e_resolv_cb = gtk_check_button_new_with_mnemonic(
5240 "Use _external network name resolver");
5241 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e_resolv_cb),
5242 gbl_resolv_flags.use_external_net_name_resolver);
5243 gtk_widget_set_tooltip_text(e_resolv_cb,
5244 "Use the (system's) configured name resolver (e.g., DNS) to resolve network names.");
5245 gtk_box_pack_start(GTK_BOX (resolv_vb), e_resolv_cb, TRUE, TRUE, 0);
5247 /* Button row: "Start", "Cancel" and "Help" buttons */
5248 bbox = dlg_button_row_new(WIRESHARK_STOCK_CAPTURE_START, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
5249 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
5251 ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_START);
5252 g_signal_connect(ok_bt, "clicked", G_CALLBACK(capture_start_cb), NULL);
5253 gtk_widget_set_tooltip_text(ok_bt, "Start the capture process.");
5254 if (global_capture_opts.num_selected > 0) {
5255 gtk_widget_set_sensitive(ok_bt, TRUE);
5257 gtk_widget_set_sensitive(ok_bt, FALSE);
5260 close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
5261 gtk_widget_set_tooltip_text(close_bt,
5263 window_set_cancel_button(cap_open_w, close_bt, window_cancel_button_cb);
5265 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
5266 gtk_widget_set_tooltip_text(help_bt,
5267 "Show help about capturing.");
5268 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), GUINT_TO_POINTER(HELP_CAPTURE_OPTIONS_DIALOG));
5269 gtk_widget_grab_default(ok_bt);
5271 /* Attach pointers to needed widgets to the capture prefs window/object */
5272 #if defined(HAVE_PCAP_REMOTE)
5273 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_REMOTE_DIALOG_PTR_KEY, NULL);
5275 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL, all_cb);
5276 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL, promisc_cb);
5277 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY, pcap_ng_cb);
5278 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_TE_KEY, file_te);
5279 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_MULTI_FILES_ON_CB_KEY, multi_files_on_cb);
5280 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_CB_KEY, ringbuffer_nbf_cb);
5281 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb);
5282 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb);
5283 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CB_KEY, ring_filesize_cb);
5284 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_SB_KEY, ring_filesize_sb);
5285 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CBX_KEY, ring_filesize_cbx);
5286 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_CB_KEY, file_duration_cb);
5287 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_SB_KEY, file_duration_sb);
5288 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_DURATION_CBX_KEY, file_duration_cbx);
5289 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb);
5290 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb);
5291 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_HIDE_INFO_KEY, hide_info_cb);
5292 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_CB_KEY, stop_packets_cb);
5293 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_SB_KEY, stop_packets_sb);
5294 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_LB_KEY, stop_packets_lb);
5295 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CB_KEY, stop_filesize_cb);
5296 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_SB_KEY, stop_filesize_sb);
5297 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CBX_KEY, stop_filesize_cbx);
5298 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CB_KEY, stop_duration_cb);
5299 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_SB_KEY, stop_duration_sb);
5300 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CBX_KEY, stop_duration_cbx);
5301 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_CB_KEY, stop_files_cb);
5302 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_SB_KEY, stop_files_sb);
5303 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_LB_KEY, stop_files_lb);
5304 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb);
5305 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb);
5306 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb);
5307 g_object_set_data(G_OBJECT(cap_open_w), E_CAP_E_RESOLVE_KEY, e_resolv_cb);
5309 /* Set the sensitivity of various widgets as per the settings of other
5311 capture_prep_adjust_sensitivity(NULL, cap_open_w);
5313 update_properties_all();
5314 update_visible_columns_menu ();
5316 /* Catch the "activate" signal on the text
5317 entries, so that if the user types Return there, we act as if the
5318 "OK" button had been selected, as happens if Return is typed if some
5319 widget that *doesn't* handle the Return key has the input focus. */
5320 /*dlg_set_activate(gtk_bin_get_child(GTK_BIN(if_cb)), ok_bt);*/
5321 dlg_set_activate(file_te, ok_bt);
5322 dlg_set_activate(all_filter_te, ok_bt);
5323 gtk_widget_grab_focus(all_filter_te);
5325 g_signal_connect(cap_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
5326 g_signal_connect(cap_open_w, "destroy", G_CALLBACK(capture_prep_destroy_cb), NULL);
5328 window_get_geometry(top_level, &tl_geom);
5329 gtk_window_set_default_size(GTK_WINDOW(cap_open_w), tl_geom.width * 8 / 10, -1);
5331 gtk_widget_show_all(cap_open_w);
5332 window_present(cap_open_w);
5334 cap_open_complete = TRUE; /* "Capture:Start" is now OK */
5335 global_capture_session.session_started = TRUE;
5338 /* user pressed the "Start" button (in dialog or toolbar) */
5340 capture_start_cb(GtkWidget *w _U_, gpointer d _U_)
5342 interface_options interface_opts;
5347 airpcap_if_active = airpcap_if_selected;
5348 if (airpcap_if_active)
5349 airpcap_set_toolbar_start_capture(airpcap_if_active);
5352 /* XXX - will closing this remove a temporary file? */
5353 if(!do_file_close(&cfile, FALSE, " before starting a new capture")){
5358 * There's an options dialog; get the values from it and close it.
5362 /* Determine if "capture start" while building of the "capture options" window */
5363 /* is in progress. If so, ignore the "capture start. */
5364 /* XXX: Would it be better/cleaner for the "capture options" window code to */
5365 /* disable the capture start button temporarily ? */
5366 if (cap_open_complete == FALSE) {
5367 return; /* Building options window: ignore "capture start" */
5369 success = capture_dlg_prep(cap_open_w);
5371 window_destroy(GTK_WIDGET(cap_open_w));
5373 return; /* error in options dialog */
5375 if (global_capture_opts.num_selected == 0) {
5376 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5377 "You didn't specify an interface on which to capture packets.");
5381 /* everything's prepared, now it's really time to start the capture */
5383 /* XXX - we might need to init other pref data as well... */
5384 main_auto_scroll_live_changed(auto_scroll_live);
5386 /* XXX - can this ever happen? */
5387 if (global_capture_session.state != CAPTURE_STOPPED)
5390 /* close the currently loaded capture file */
5391 cf_close((capture_file *)global_capture_session.cf);
5393 /* Copy the selected interfaces to the set of interfaces to use for
5395 collect_ifaces(&global_capture_opts);
5397 if (capture_start(&global_capture_opts, &global_capture_session, main_window_update)) {
5398 /* The capture succeeded, which means the capture filters specified are
5399 valid; add them to the recent capture filter lists for the interfaces.
5401 If the same capture filter is used for all the selected interfaces,
5402 add it to the global recent capture filter list as well. */
5404 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
5405 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
5406 if (interface_opts.cfilter) {
5407 recent_add_cfilter(interface_opts.name, interface_opts.cfilter);
5408 if (filter_str == NULL) {
5409 /* First selected interface - save its capture filter. */
5410 filter_str = g_strdup(interface_opts.cfilter);
5412 /* Not the first selected interface; is its capture filter
5413 the same as the one the other interfaces we've looked
5415 if (strcmp(interface_opts.cfilter, filter_str) != 0) {
5416 /* No, so not all selected interfaces have the same capture
5418 if (filter_str != NULL) {
5426 if (filter_str != NULL) {
5427 if (filter_str[0] != '\0') {
5428 recent_add_cfilter(NULL, filter_str);
5436 /* user change linktype selection;, convert to internal DLT value */
5438 select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_)
5444 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
5445 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
5446 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
5447 g_assert_not_reached(); /* Programming error: somehow nothing is active */
5449 if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
5450 g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
5452 device.active_dlt = dlt;
5453 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
5454 capture_filter_check_syntax_cb(linktype_combo_box, data);
5457 /* user pressed "File" button */
5459 capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te)
5461 file_selection_browse(file_bt, file_te, "Wireshark: Specify a Capture File", FILE_SELECTION_WRITE_BROWSE);
5464 /* user pressed "Pipe" button */
5466 capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te)
5468 file_selection_browse(pipe_bt, pipe_te, "Wireshark: Specify a Pipe", FILE_SELECTION_WRITE_BROWSE);
5472 /* convert dialog settings into capture_opts values */
5474 capture_dlg_prep(gpointer parent_w) {
5475 GtkWidget *pcap_ng_cb,
5476 *file_te, *multi_files_on_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_cb,
5477 *sync_cb, *auto_scroll_cb, *hide_info_cb,
5478 *stop_packets_cb, *stop_packets_sb,
5479 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
5480 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
5481 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
5482 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
5483 *stop_files_cb, *stop_files_sb,
5484 *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb;
5485 const gchar *g_save_file;
5490 pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_PCAP_NG_KEY);
5491 file_te = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_TE_KEY);
5492 multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
5493 ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
5494 ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
5495 ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
5496 ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
5497 ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
5498 file_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CB_KEY);
5499 file_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_SB_KEY);
5500 file_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CBX_KEY);
5501 sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
5502 auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
5503 hide_info_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_HIDE_INFO_KEY);
5504 stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
5505 stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
5506 stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
5507 stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
5508 stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
5509 stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
5510 stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
5511 stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
5512 stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
5513 stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
5514 m_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY);
5515 n_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY);
5516 t_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY);
5517 e_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_E_RESOLVE_KEY);
5519 if (global_capture_opts.num_selected == 0) {
5520 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5521 "You didn't specify an interface on which to capture packets.");
5524 global_capture_opts.use_pcapng =
5525 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pcap_ng_cb));
5526 /* Wireshark always saves to a capture file. */
5527 global_capture_opts.saving_to_file = TRUE;
5528 g_save_file = gtk_entry_get_text(GTK_ENTRY(file_te));
5529 if (g_save_file && g_save_file[0]) {
5530 /* User specified a file to which the capture should be written. */
5531 global_capture_opts.save_file = g_strdup(g_save_file);
5532 global_capture_opts.orig_save_file = g_strdup(g_save_file);
5533 /* Save the directory name for future file dialogs. */
5534 cf_name = g_strdup(g_save_file);
5535 dirname = get_dirname(cf_name); /* Overwrites cf_name */
5536 set_last_open_dir(dirname);
5539 /* User didn't specify a file; save to a temporary file. */
5540 global_capture_opts.save_file = NULL;
5543 global_capture_opts.has_autostop_packets =
5544 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb));
5545 if (global_capture_opts.has_autostop_packets)
5546 global_capture_opts.autostop_packets =
5547 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_packets_sb));
5549 global_capture_opts.has_autostop_duration =
5550 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb));
5551 if (global_capture_opts.has_autostop_duration) {
5552 global_capture_opts.autostop_duration =
5553 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_duration_sb));
5554 global_capture_opts.autostop_duration =
5555 time_unit_combo_box_get_value(stop_duration_cbx, global_capture_opts.autostop_duration);
5558 global_capture_opts.real_time_mode =
5559 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb));
5562 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb));
5564 global_capture_opts.show_info =
5565 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hide_info_cb));
5567 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_resolv_cb)))
5568 gbl_resolv_flags.mac_name = TRUE;
5570 gbl_resolv_flags.mac_name = FALSE;
5571 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(n_resolv_cb)))
5572 gbl_resolv_flags.network_name = TRUE;
5574 gbl_resolv_flags.network_name = FALSE;
5575 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t_resolv_cb)))
5576 gbl_resolv_flags.transport_name = TRUE;
5578 gbl_resolv_flags.transport_name = FALSE;
5579 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(e_resolv_cb)))
5580 gbl_resolv_flags.use_external_net_name_resolver = TRUE;
5582 gbl_resolv_flags.use_external_net_name_resolver = FALSE;
5584 global_capture_opts.has_ring_num_files =
5585 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb));
5587 global_capture_opts.ring_num_files =
5588 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ringbuffer_nbf_sb));
5589 if (global_capture_opts.ring_num_files > RINGBUFFER_MAX_NUM_FILES)
5590 global_capture_opts.ring_num_files = RINGBUFFER_MAX_NUM_FILES;
5591 #if RINGBUFFER_MIN_NUM_FILES > 0
5592 else if (global_capture_opts.ring_num_files < RINGBUFFER_MIN_NUM_FILES)
5593 global_capture_opts.ring_num_files = RINGBUFFER_MIN_NUM_FILES;
5596 global_capture_opts.multi_files_on =
5597 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb));
5599 global_capture_opts.has_file_duration =
5600 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb));
5601 if (global_capture_opts.has_file_duration) {
5602 global_capture_opts.file_duration =
5603 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(file_duration_sb));
5604 global_capture_opts.file_duration =
5605 time_unit_combo_box_get_value(file_duration_cbx, global_capture_opts.file_duration);
5608 global_capture_opts.has_autostop_files =
5609 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb));
5610 if (global_capture_opts.has_autostop_files)
5611 global_capture_opts.autostop_files =
5612 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_files_sb));
5614 if (global_capture_opts.multi_files_on) {
5615 global_capture_opts.has_autostop_filesize =
5616 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb));
5617 if (global_capture_opts.has_autostop_filesize) {
5618 tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ring_filesize_sb));
5619 tmp = size_unit_combo_box_convert_value(ring_filesize_cbx, tmp);
5621 global_capture_opts.autostop_filesize = tmp;
5623 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5624 "%sMultiple files: Requested filesize too large!%s\n\n"
5625 "The setting \"Next file every x byte(s)\" can't be greater than %u bytes (2GiB).",
5626 simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
5631 /* test if the settings are ok for a ringbuffer */
5632 if (global_capture_opts.save_file == NULL) {
5633 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5634 "%sMultiple files: No capture file name given!%s\n\n"
5635 "You must specify a filename if you want to use multiple files.",
5636 simple_dialog_primary_start(), simple_dialog_primary_end());
5638 } else if (!global_capture_opts.has_autostop_filesize && !global_capture_opts.has_file_duration) {
5639 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5640 "%sMultiple files: No file limit given!%s\n\n"
5641 "You must specify a file size or duration at which is switched to the next capture file\n"
5642 "if you want to use multiple files.",
5643 simple_dialog_primary_start(), simple_dialog_primary_end());
5644 g_free(global_capture_opts.save_file);
5645 global_capture_opts.save_file = NULL;
5649 global_capture_opts.has_autostop_filesize =
5650 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb));
5651 if (global_capture_opts.has_autostop_filesize) {
5652 tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_filesize_sb));
5653 tmp = size_unit_combo_box_convert_value(stop_filesize_cbx, tmp);
5655 global_capture_opts.autostop_filesize = tmp;
5657 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
5658 "%sStop Capture: Requested filesize too large!%s\n\n"
5659 "The setting \"after x byte(s)\" can't be greater than %u bytes (2GiB).",
5660 simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
5664 } /* multi_files_on */
5668 static GtkTreeModel *
5669 create_and_fill_model(GtkTreeView *view)
5671 GtkListStore *store;
5674 char *temp, *snaplen_string, *linkname;
5676 link_row *linkr = NULL;
5678 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
5682 gboolean hassnap, pmode;
5684 #if defined(HAVE_PCAP_CREATE)
5685 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);
5686 #elif defined(_WIN32) && !defined (HAVE_PCAP_CREATE)
5687 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);
5689 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);
5692 for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
5693 device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
5694 if (!device.hidden) {
5695 if (device.no_addresses == 0) {
5696 temp = g_strdup_printf("<b>%s</b>", device.display_name);
5698 temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
5701 if(capture_dev_user_linktype_find(device.name) != -1) {
5702 device.active_dlt = capture_dev_user_linktype_find(device.name);
5704 for (list = device.links; list != NULL; list = g_list_next(list)) {
5705 linkr = (link_row*)(list->data);
5706 if (linkr->dlt == device.active_dlt) {
5707 linkname = g_strdup(linkr->name);
5712 linkname = g_strdup("unknown");
5713 pmode = capture_dev_user_pmode_find(device.name);
5715 device.pmode = pmode;
5717 hassnap = capture_dev_user_hassnap_find(device.name);
5718 snaplen = capture_dev_user_snaplen_find(device.name);
5719 if(snaplen != -1 && hassnap != -1) {
5720 /* Default snap length set in preferences */
5721 device.snaplen = snaplen;
5722 device.has_snaplen = hassnap;
5724 /* No preferences set yet, use default values */
5725 device.snaplen = WTAP_MAX_PACKET_SIZE;
5726 device.has_snaplen = FALSE;
5729 if (device.has_snaplen) {
5730 snaplen_string = g_strdup_printf("%d", device.snaplen);
5732 snaplen_string = g_strdup("default");
5735 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
5736 if (capture_dev_user_buffersize_find(device.name) != -1) {
5737 buffer = capture_dev_user_buffersize_find(device.name);
5738 device.buffer = buffer;
5740 device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
5743 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
5744 g_array_insert_val(global_capture_opts.all_ifaces, i, device);
5745 gtk_list_store_append (store, &iter);
5746 #if defined(HAVE_PCAP_CREATE)
5747 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);
5748 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
5749 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);
5751 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);
5756 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
5757 return GTK_TREE_MODEL(store);
5761 query_tooltip_tree_view_cb (GtkWidget *widget,
5764 gboolean keyboard_tip,
5765 GtkTooltip *tooltip,
5769 GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
5770 GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
5771 GtkTreePath *path = NULL;
5773 GtkTreeViewColumn *column;
5774 GtkCellRenderer* renderer = NULL;
5775 GList *renderer_list;
5780 if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
5783 gtk_tree_model_get (model, &iter, 0, &tmp, -1);
5785 if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), (gint) x, (gint) y, NULL, &column, NULL, NULL)) {
5786 idx = col_title_to_index((const gchar *)gtk_tree_view_column_get_title(column));
5790 case CAPTURE: g_snprintf (buffer, sizeof(buffer), "Choose which interface (network adapter) will be used to capture packets from. "
5791 "Be sure to select the correct one, as it's a common mistake to select the wrong interface.");
5793 case INTERFACE: g_snprintf (buffer, sizeof(buffer), "Lists the interface name and the IP address(es) assigned to it. ");
5795 case LINK: g_snprintf (buffer, sizeof(buffer), "Link-layer type the interface supports.");
5797 case PMODE: g_snprintf (buffer, sizeof(buffer), "Usually a network adapter will only capture the traffic sent to its own network address. "
5798 "If you want to capture all traffic that the network adapter can \"see\", promiscuous mode should be configured.");
5800 case SNAPLEN: g_snprintf(buffer, sizeof(buffer), "Limit the maximum number of bytes to be captured from each packet. This size includes the "
5801 "link-layer header and all subsequent headers.");
5803 #if defined(HAVE_PCAP_CREATE)
5804 case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
5805 "If you notice packet drops, you can try increasing this size.");
5807 case MONITOR: g_snprintf (buffer, sizeof(buffer), "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture "
5808 "the traffic on the BSS to which it's associated. "
5809 "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", select this option. "
5810 "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
5811 "it might be necessary to turn this option on.\n\n"
5812 "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
5814 #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE)
5815 case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
5816 "If you notice packet drops, you can try increasing this size.");
5819 case FILTER: g_snprintf(buffer, sizeof(buffer), "Selected capture filter to reduce the amount of packets to be captured.");
5821 default: g_snprintf(buffer, sizeof(buffer), "another option");
5824 gtk_tooltip_set_markup (tooltip, buffer);
5825 renderer_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
5826 /* get the first renderer */
5827 if (g_list_first(renderer_list)) {
5828 renderer = (GtkCellRenderer*)g_list_nth_data(renderer_list, 0);
5829 gtk_tree_view_set_tooltip_cell (tree_view, tooltip, path, column, renderer);
5832 gtk_tree_path_free (path);
5837 #if defined (HAVE_PCAP_CREATE)
5839 activate_monitor(GtkTreeViewColumn *tree_column _U_, GtkCellRenderer *renderer,
5840 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data _U_)
5843 GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
5844 int indx = atoi(gtk_tree_path_to_string(path));
5846 device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
5848 if (device.monitor_mode_supported == TRUE) {
5849 g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
5851 g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_INERT, NULL);
5856 /* user requested to destroy the dialog */
5858 capture_prep_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
5861 #ifdef HAVE_PCAP_REMOTE
5863 GtkWidget *remote_w;
5866 /* Is there a file selection dialog associated with this
5867 Capture Options dialog? */
5868 fs = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_FILE_SEL_DIALOG_PTR_KEY);
5870 #ifdef HAVE_PCAP_REMOTE
5871 if_list = (GList *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY);
5872 if (if_list && g_list_length(if_list)>0) {
5873 free_interface_list(if_list);
5878 /* Yes. Destroy it. */
5882 /* Note that we no longer have a "Capture Options" dialog box. */
5886 /* update airpcap toolbar */
5887 if (airpcap_if_active)
5888 airpcap_set_toolbar_stop_capture(airpcap_if_active);
5891 #ifdef HAVE_PCAP_REMOTE
5892 remote_w = g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
5893 if (remote_w != NULL)
5894 window_destroy(remote_w);
5899 #ifdef HAVE_PCAP_CREATE
5900 /* user changed the setting of the monitor-mode checkbox */
5902 capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp _U_)
5906 gboolean monitor_mode;
5907 if_capabilities_t *caps;
5908 gint linktype_count = 0, i;
5909 data_link_info_t *data_link_info;
5912 GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
5913 GtkWidget *linktype_lb = (GtkWidget *)g_object_get_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY);
5915 device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
5916 global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
5919 if_string = g_strdup(device.name);
5920 monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor));
5921 caps = capture_get_if_capabilities(if_string, monitor_mode, NULL, main_window_update);
5924 g_signal_handlers_disconnect_by_func(linktype_combo_box, G_CALLBACK(select_link_type_cb), NULL );
5925 ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box));
5926 for (i = (gint)g_list_length(device.links)-1; i >= 0; i--) {
5927 GList* rem = g_list_nth(device.links, i);
5928 device.links = g_list_remove_link(device.links, rem);
5931 device.active_dlt = -1;
5933 device.monitor_mode_supported = caps->can_set_rfmon;
5934 device.monitor_mode_enabled = monitor_mode;
5935 for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
5936 linkr = (link_row *)g_malloc(sizeof(link_row));
5937 data_link_info = (data_link_info_t *)lt_entry->data;
5939 * For link-layer types libpcap/WinPcap doesn't know about, the
5940 * name will be "DLT n", and the description will be null.
5941 * We mark those as unsupported, and don't allow them to be
5942 * used - capture filters won't work on them, for example.
5944 if (data_link_info->description != NULL) {
5945 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
5946 data_link_info->description,
5947 GINT_TO_POINTER(data_link_info->dlt));
5948 linkr->dlt = data_link_info->dlt;
5949 if (linktype_count == 0) {
5950 device.active_dlt = data_link_info->dlt;
5952 linkr->name = g_strdup(data_link_info->description);
5955 /* XXX - should we just omit them? */
5956 str = g_strdup_printf("%s (not supported)", data_link_info->name);
5957 ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
5960 GINT_TO_POINTER(-1), /* Flag as "not supported" */
5963 linkr->name = g_strdup(str);
5966 device.links = g_list_append(device.links, linkr);
5969 free_if_capabilities(caps);
5971 /* We don't know whether this supports monitor mode or not;
5972 don't ask for monitor mode. */
5973 device.monitor_mode_enabled = FALSE;
5974 device.monitor_mode_supported = FALSE;
5976 gtk_widget_set_sensitive(linktype_lb, linktype_count >= 2);
5977 gtk_widget_set_sensitive(linktype_combo_box, linktype_count >= 2);
5978 ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),0);
5979 g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
5984 * Adjust the sensitivity of various widgets as per the current setting
5988 capture_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
5990 GtkWidget *multi_files_on_cb, *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
5991 *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
5992 *file_duration_cb, *file_duration_sb, *file_duration_cbx,
5993 *sync_cb, *auto_scroll_cb,
5994 *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
5995 *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
5996 *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
5997 *stop_files_cb, *stop_files_sb, *stop_files_lb;
5999 multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
6000 ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
6001 ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
6002 ringbuffer_nbf_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_LB_KEY);
6003 ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
6004 ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
6005 ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
6006 file_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CB_KEY);
6007 file_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_SB_KEY);
6008 file_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_DURATION_CBX_KEY);
6009 sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
6010 auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
6011 stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
6012 stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
6013 stop_packets_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_LB_KEY);
6014 stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
6015 stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
6016 stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
6017 stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
6018 stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
6019 stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
6020 stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
6021 stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
6022 stop_files_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_LB_KEY);
6024 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb))) {
6025 /* "Update list of packets in real time" captures enabled; we don't
6026 support ring buffer mode for those captures, so turn ring buffer
6027 mode off if it's on, and make its toggle button, and the spin
6028 button for the number of ring buffer files (and the spin button's
6029 label), insensitive. */
6031 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb), FALSE);
6032 gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), FALSE);
6035 /* Auto-scroll mode is meaningful only in "Update list of packets
6036 in real time" captures, so make its toggle button sensitive. */
6037 gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), TRUE);
6039 /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), TRUE);*/
6041 /* "Update list of packets in real time" captures disabled; that
6042 means ring buffer mode is OK, so make its toggle button
6044 /* gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), TRUE);*/
6046 /* Auto-scroll mode is meaningful only in "Update list of packets
6047 in real time" captures, so make its toggle button insensitive. */
6048 gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), FALSE);
6050 /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), FALSE);*/
6053 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb))) {
6054 /* Ring buffer mode enabled. */
6056 /* Force at least one of the "file switch" conditions (we need at least one) */
6057 if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)) == FALSE) &&
6058 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)) == FALSE)) {
6059 if (tb == ring_filesize_cb)
6060 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_duration_cb), TRUE);
6062 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb), TRUE);
6065 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), TRUE);
6066 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb),
6067 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
6068 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb),
6069 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
6071 /* The ring filesize spinbox is sensitive if the "Next capture file
6072 after N kilobytes" checkbox is on. */
6073 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), TRUE);
6074 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),
6075 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
6076 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),
6077 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
6079 /* The ring duration spinbox is sensitive if the "Next capture file
6080 after N seconds" checkbox is on. */
6081 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cb), TRUE);
6082 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_sb),
6083 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)));
6084 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cbx),
6085 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_duration_cb)));
6087 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), FALSE);
6088 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb), FALSE);
6089 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx), FALSE);
6091 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), TRUE);
6092 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb),
6093 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
6094 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb),
6095 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
6097 /* Ring buffer mode disabled. */
6098 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), FALSE);
6099 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), FALSE);
6100 gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), FALSE);
6102 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), FALSE);
6103 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),FALSE);
6104 gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),FALSE);
6106 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cb), FALSE);
6107 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_sb),FALSE);
6108 gtk_widget_set_sensitive(GTK_WIDGET(file_duration_cbx),FALSE);
6110 /* The maximum file size spinbox is sensitive if the "Stop capture
6111 after N kilobytes" checkbox is on. */
6112 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), TRUE);
6113 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb),
6114 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
6115 gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx),
6116 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
6118 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), FALSE);
6119 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb), FALSE);
6120 gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb), FALSE);
6123 /* The maximum packet count spinbox is sensitive if the "Stop capture
6124 after N packets" checkbox is on. */
6125 gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_sb),
6126 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
6127 gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_lb),
6128 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
6130 /* The capture duration spinbox is sensitive if the "Stop capture
6131 after N seconds" checkbox is on. */
6132 gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_sb),
6133 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
6134 gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_cbx),
6135 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
6138 gboolean capture_dlg_window_present(void)
6140 return (cap_open_w?TRUE:FALSE);
6144 * Refresh everything visible that shows an interface list that
6145 * includes local interfaces.
6148 refresh_local_interface_lists(void)
6150 /* Reload the local interface list. */
6151 scan_local_interfaces(main_window_update);
6153 /* If there's an interfaces dialog up, refresh it. */
6154 if (interfaces_dialog_window_present())
6155 refresh_if_window();
6157 /* If there's a capture options dialog up, refresh it. */
6158 if (capture_dlg_window_present())
6159 capture_dlg_refresh_if();
6161 /* If the welcome screen is up, refresh its interface list. */
6162 if (get_welcome_window() != NULL)
6163 welcome_if_panel_reload();
6165 /* Refresh the 802.11 toolbar. */
6166 tb80211_refresh_interfaces();
6170 * Refresh everything visible that shows an interface list that
6171 * includes non-local interfaces.
6174 refresh_non_local_interface_lists(void)
6176 /* If there's a capture options dialog up, refresh it. */
6177 if (capture_dlg_window_present())
6178 capture_dlg_refresh_if();
6180 /* If the welcome screen is up, refresh its interface list. */
6181 if (get_welcome_window() != NULL)
6182 welcome_if_panel_reload();
6185 #endif /* HAVE_LIBPCAP */
6193 * indent-tabs-mode: nil
6196 * ex: set shiftwidth=2 tabstop=8 expandtab:
6197 * :indentSize=2:tabSize=8:noTabs=true: