aboutsummaryrefslogtreecommitdiffstats
path: root/ui/gtk/capture_dlg.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui/gtk/capture_dlg.c')
-rw-r--r--ui/gtk/capture_dlg.c6243
1 files changed, 0 insertions, 6243 deletions
diff --git a/ui/gtk/capture_dlg.c b/ui/gtk/capture_dlg.c
deleted file mode 100644
index bb68bbf918..0000000000
--- a/ui/gtk/capture_dlg.c
+++ /dev/null
@@ -1,6243 +0,0 @@
-/* capture_dlg.c
- * Routines for the "Capture Options" dialog and dialog windows popped
- * up from it
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#ifdef HAVE_LIBPCAP
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/addr_resolv.h>
-#include <epan/prefs.h>
-#include <wsutil/filesystem.h>
-#include <wsutil/strtoi.h>
-
-#include <wiretap/wtap.h>
-
-#include "ui/capture.h"
-#include "caputils/capture_ifinfo.h"
-#include "caputils/capture-pcap-util.h"
-#include "../../ringbuffer.h"
-
-#include "ui/capture_ui_utils.h"
-#include "ui/capture_globals.h"
-#include "ui/iface_lists.h"
-#include "ui/preference_utils.h"
-#include "ui/recent.h"
-#include "ui/recent_utils.h"
-#include "ui/util.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/cfilter_combo_utils.h"
-#include "ui/gtk/capture_if_dlg.h"
-#include "ui/gtk/main_welcome.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/main_80211_toolbar.h"
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-#include "simple_dialog.h"
-
-#include "ui/gtk/keys.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#ifdef HAVE_AIRPCAP
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#include "airpcap_dlg.h"
-#endif
-
-#include "extcap.h"
-#include "ui/gtk/extcap_gtk.h"
-
-#include "globals.h"
-
-/*
- * Symbolic names for column indices.
- */
-enum
-{
- CAPTURE = 0,
- IFACE_HIDDEN_NAME,
- INTERFACE,
- LINK,
- PMODE,
- SNAPLEN,
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- BUFFER,
-#endif
-#ifdef HAVE_PCAP_CREATE
- MONITOR,
-#endif
- FILTER,
- NUM_COLUMNS
-};
-
-enum
-{
- COMPILE_ERROR = 0,
- SIGN,
- INAME
-};
-
-#ifdef _WIN32
- #define LOCAL_OFFSET 1
-#else
- #define LOCAL_OFFSET 0
-#endif
-
-/* Capture callback data keys */
-#define E_CAP_IFACE_KEY "cap_iface"
-#define E_CAP_IFACE_IP_KEY "cap_iface_ip"
-#define E_CAP_SNAP_CB_KEY "cap_snap_cb"
-#define E_CAP_LT_CBX_KEY "cap_lt_cbx"
-#define E_CAP_LT_CBX_LABEL_KEY "cap_lt_cbx_label"
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-#define E_CAP_BUFFER_SIZE_SB_KEY "cap_buffer_size_sb"
-#endif
-#define E_CAP_SNAP_SB_KEY "cap_snap_sb"
-#define E_CAP_PROMISC_KEY "cap_promisc"
-#define E_CAP_PROMISC_KEY_ALL "cap_promisc_all"
-#define E_CAP_KEY_ALL "cap_all"
-#ifdef HAVE_PCAP_CREATE
-#define E_CAP_MONITOR_KEY "cap_monitor"
-#endif
-#define E_CAP_PCAP_NG_KEY "cap_pcap_ng"
-#define E_CAP_FILT_KEY "cap_filter_te"
-#define E_OPT_EDIT_DIALOG_PTR_KEY "cap_edit_opt_dialog"
-#define E_OPT_EDIT_CALLER_PTR_KEY "cap_edit_opt_caller"
-#define E_CAP_FILE_TE_KEY "cap_file_te"
-#define E_CAP_MULTI_FILES_ON_CB_KEY "cap_multi_files_on_cb"
-#define E_CAP_RING_FILESIZE_CB_KEY "cap_ring_filesize_cb"
-#define E_CAP_RING_FILESIZE_SB_KEY "cap_ring_filesize_sb"
-#define E_CAP_RING_FILESIZE_CBX_KEY "cap_ring_filesize_cbx"
-#define E_CAP_FILE_INTERVAL_CB_KEY "cap_file_interval_cb"
-#define E_CAP_FILE_INTERVAL_SB_KEY "cap_file_interval_sb"
-#define E_CAP_FILE_INTERVAL_CBX_KEY "cap_file_interval_cbx"
-#define E_CAP_RING_NBF_CB_KEY "cap_ring_nbf_cb"
-#define E_CAP_RING_NBF_SB_KEY "cap_ring_nbf_sb"
-#define E_CAP_RING_NBF_LB_KEY "cap_ring_nbf_lb"
-#define E_CAP_STOP_FILES_CB_KEY "cap_stop_files_cb"
-#define E_CAP_STOP_FILES_SB_KEY "cap_stop_files_sb"
-#define E_CAP_STOP_FILES_LB_KEY "cap_stop_files_lb"
-#define E_CAP_SYNC_KEY "cap_sync"
-#define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll"
-#define E_CAP_HIDE_INFO_KEY "cap_hide_info"
-#define E_CAP_STOP_PACKETS_CB_KEY "cap_stop_packets_cb"
-#define E_CAP_STOP_PACKETS_SB_KEY "cap_stop_packets_sb"
-#define E_CAP_STOP_PACKETS_LB_KEY "cap_stop_packets_lb"
-#define E_CAP_STOP_FILESIZE_CB_KEY "cap_stop_filesize_cb"
-#define E_CAP_STOP_FILESIZE_SB_KEY "cap_stop_filesize_sb"
-#define E_CAP_STOP_FILESIZE_CBX_KEY "cap_stop_filesize_cbx"
-#define E_CAP_STOP_DURATION_CB_KEY "cap_stop_duration_cb"
-#define E_CAP_STOP_DURATION_SB_KEY "cap_stop_duration_sb"
-#define E_CAP_STOP_DURATION_CBX_KEY "cap_stop_duration_cbx"
-#define E_CAP_M_RESOLVE_KEY "cap_m_resolve"
-#define E_CAP_N_RESOLVE_KEY "cap_n_resolve"
-#define E_CAP_T_RESOLVE_KEY "cap_t_resolve"
-#define E_CAP_E_RESOLVE_KEY "cap_e_resolve"
-#define E_CAP_EXTCAP_KEY "cap_extcap_vbox"
-
-#define E_CAP_IFTYPE_CBX_KEY "cap_iftype_cbx"
-#ifdef HAVE_PCAP_REMOTE
-#define E_CAP_IF_LIST_KEY "cap_if_list"
-#define E_CAP_DATATX_UDP_CB_KEY "cap_datatx_udp_cb"
-#define E_CAP_NOCAP_RPCAP_CB_KEY "cap_nocap_rpcap_cb"
-#define E_CAP_REMOTE_DIALOG_PTR_KEY "cap_remote_dialog"
-#define E_CAP_REMOTE_CALLER_PTR_KEY "cap_remote_caller"
-#define E_REMOTE_HOST_TE_KEY "cap_remote_host"
-#define E_REMOTE_PORT_TE_KEY "cap_remote_port"
-#define E_REMOTE_AUTH_NULL_KEY "cap_remote_auth_null"
-#define E_REMOTE_AUTH_PASSWD_KEY "cap_remote_auth_passwd"
-#define E_REMOTE_USERNAME_LB_KEY "cap_remote_username_lb"
-#define E_REMOTE_USERNAME_TE_KEY "cap_remote_username_te"
-#define E_REMOTE_PASSWD_LB_KEY "cap_remote_passwd_lb"
-#define E_REMOTE_PASSWD_TE_KEY "cap_remote_passwd_te"
-#define E_REMOTE_OK_BT_KEY "cap_remote_ok_bt"
-#define E_REMOTE_DEL_BT_KEY "cap_remote_delete_bt"
-#define E_CAP_CBX_IFTYPE_NOUPDATE_KEY "cap_cbx_iftype_noupdate"
-#define E_OPT_REMOTE_DIALOG_PTR_KEY "cap_remote_opt_dialog"
-#define E_OPT_REMOTE_CALLER_PTR_KEY "cap_remote_opt_caller"
-#endif
-#ifdef HAVE_PCAP_SETSAMPLING
-#define E_CAP_SAMP_NONE_RB_KEY "cap_samp_none_rb"
-#define E_CAP_SAMP_COUNT_RB_KEY "cap_samp_count_rb"
-#define E_CAP_SAMP_COUNT_SB_KEY "cap_samp_count_sb"
-#define E_CAP_SAMP_TIMER_RB_KEY "cap_samp_timer_rb"
-#define E_CAP_SAMP_TIMER_SB_KEY "cap_samp_timer_sb"
-#endif
-#define E_CAP_PIPE_TE_KEY "cap_pipe_te"
-#define E_CAP_PIPE_L_KEY "cap_pipe_list"
-#define E_CAP_PIPE_DEL_KEY "cap_pipe_delete_key"
-#define E_CAP_LOCAL_L_KEY "cap_local_list"
-#define E_CAP_REMOTE_L_KEY "cap_remote_list"
-
-#define E_COMPILE_SW_SCROLLW_KEY "compileScrolledWindowInterfaces"
-#define E_COMPILE_TREE_VIEW_INTERFACES "compileTreeViewInterfaces"
-
-#define DUMMY_SNAPLENGTH 65535
-#define DUMMY_NETMASK 0xFF000000
-
-enum
-{
- COL_NAME = 0,
- COL_ADDRESS,
- COL_LINK
-} ;
-
-/*
- * Keep a static pointer to the current "Capture Options" window, if
- * any, so that if somebody tries to do "Capture:Options" while there's
- * already a "Capture Options" window up, we just pop up the existing
- * one, rather than creating a new one.
- * Also: Capture:Start obtains info from the "Capture Options" window
- * if it exists and if its creation is complete.
- */
-static GtkWidget *cap_open_w = NULL, *opt_edit_w = NULL, *ok_bt, *interface_management_w = NULL;
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-static GtkWidget *compile_bpf_w = NULL;
-#endif
-static gboolean cap_open_complete; /* valid only if cap_open_w != NULL */
-static const gchar *pipe_name = NULL;
-static const gchar *selected_name;
-static GtkWidget *columns_menu_object;
-static GtkUIManager *ui_manager_columns = NULL;
-static GSList *popup_menu_list = NULL;
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-static GHashTable *compile_results = NULL;
-static GtkWidget *all_compile_bt;
-#endif
-
-static gint marked_interface;
-static gint marked_row;
-
-#ifdef HAVE_PCAP_REMOTE
-static remote_options global_remote_opts;
-static guint num_selected = 0;
-#endif
-
-static gulong capture_all_handler_id;
-static gulong promisc_all_handler_id;
-
-static void
-capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te);
-
-static void
-capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te);
-
-static void
-select_link_type_cb(GtkWidget *w, gpointer data);
-
-#ifdef HAVE_PCAP_REMOTE
-static void
-populate_existing_remotes(gpointer key, gpointer value, gpointer user_data);
-
-static void
-capture_remote_cb(GtkWidget *w, gboolean focus_username);
-
-static void
-select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data);
-
-static void
-fill_remote_list(void);
-#endif
-
-static void
-capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w);
-
-static void
-capture_prep_destroy_cb(GtkWidget *win, gpointer user_data);
-
-#ifdef HAVE_PCAP_CREATE
-static void
-capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp);
-#endif
-
-static gboolean
-capture_dlg_prep(gpointer parent_w);
-
-static GtkTreeModel*
-create_and_fill_model(GtkTreeView *view);
-
-static void
-update_options_table(gint indx);
-
-static void
-update_properties_all(void);
-
-static gboolean
-query_tooltip_tree_view_cb (GtkWidget *widget,
- gint x,
- gint y,
- gboolean keyboard_tip,
- GtkTooltip *tooltip,
- gpointer data);
-
-static
-gchar *col_index_to_name(gint indx)
-{
- gchar *col_name;
-
- switch (indx)
- {
- case INTERFACE: col_name = g_strdup("INTERFACE");
- break;
- case LINK: col_name = g_strdup("LINK");
- break;
- case PMODE: col_name = g_strdup("PMODE");
- break;
- case SNAPLEN: col_name = g_strdup("SNAPLEN");
- break;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- case BUFFER: col_name = g_strdup("BUFFER");
- break;
-#endif
-#ifdef HAVE_PCAP_CREATE
- case MONITOR: col_name = g_strdup("MONITOR");
- break;
-#endif
- case FILTER: col_name = g_strdup("FILTER");
- break;
- default: return NULL;
- }
- return col_name;
-}
-
-static
-gint col_title_to_index(const gchar *name)
-{
- if (strcmp(name, "Capture") == 0) return CAPTURE;
- if (strcmp(name, "Interface") == 0) return INTERFACE;
- if (strcmp(name, "Link-layer header") == 0) return LINK;
- if (strcmp(name, "Prom. Mode") == 0) return PMODE;
- if (strcmp(name, "Snaplen [B]") == 0) return SNAPLEN;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if (strcmp(name, "Buffer [MiB]") == 0) return BUFFER;
-#endif
-#ifdef HAVE_PCAP_CREATE
- if (strcmp(name, "Mon. Mode") == 0) return MONITOR;
-#endif
- if (strcmp(name, "Capture Filter") == 0) return FILTER;
- return -1;
-}
-
-static void
-set_capture_column_visible(gchar *col, gboolean visible _U_)
-{
- GList *curr;
- gchar *col_name;
-
- if (visible && !prefs_capture_options_dialog_column_is_visible(col)) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, col);
- } else if (!visible && prefs_capture_options_dialog_column_is_visible(col)) {
- for (curr = g_list_first(prefs.capture_columns); curr; curr = g_list_next(curr)) {
- col_name = (gchar *)curr->data;
- if (col_name && (g_ascii_strcasecmp(col_name, col) == 0)) {
- prefs.capture_columns = g_list_remove(prefs.capture_columns, curr->data);
- break;
- }
- }
- }
-}
-
-static void
-toggle_visible_column_cb (GtkWidget *w _U_, gpointer data)
-{
- GtkTreeView *view;
- GtkTreeViewColumn *col;
- gchar *col_name;
- gint col_id;
-
- col_id = GPOINTER_TO_INT(data);
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
- col_name = col_index_to_name(col_id);
- gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
- set_capture_column_visible(col_name, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
-}
-
-
-static void
-set_all_columns_visible (void)
-{
- GtkTreeViewColumn *col;
- int col_id;
- GtkTreeView *view;
- gchar *name;
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- for (col_id = 2; col_id < NUM_COLUMNS; col_id++) {
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
- gtk_tree_view_column_set_visible(col, TRUE);
- if ((name = col_index_to_name(col_id)) != NULL) {
- set_capture_column_visible(name, TRUE);
- }
- }
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- update_visible_columns_menu ();
-}
-
-static void
-columns_activate_all_columns_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- set_all_columns_visible ();
-}
-
-void
-update_visible_tree_view_columns(void)
-{
- GtkTreeView *view;
- gint col_id;
- GtkTreeViewColumn *col;
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(view), INTERFACE), TRUE);
- for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
- gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_index_to_name(col_id))?TRUE:FALSE);
- }
-}
-
-
-void
-update_visible_columns_menu (void)
-{
- GtkWidget *menu_columns, *menu_item;
- GtkWidget *sub_menu;
- gchar *title;
- gint col_id;
-
- menu_columns = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/DisplayedColumns");
- /* Debug */
- if (! menu_columns){
- fprintf (stderr, "Warning: couldn't find menu_columns path=/ColumnsPopup/DisplayedColumns");
- }
-
- sub_menu = gtk_menu_new();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_columns), sub_menu);
-
- for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
- title = col_index_to_name(col_id);
- menu_item = gtk_check_menu_item_new_with_label(title);
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), prefs_capture_options_dialog_column_is_visible(title));
- g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(toggle_visible_column_cb), GINT_TO_POINTER(col_id));
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
- }
- menu_item = gtk_menu_item_new();
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
-
- menu_item = gtk_menu_item_new_with_label ("Display All");
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- g_signal_connect(menu_item, "activate", G_CALLBACK(columns_activate_all_columns_cb), NULL);
- gtk_widget_show (menu_item);
-}
-
-static void
-columns_pref_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/ColumnPreferences");
- prefs_page_cb( widget , user_data, PREFS_PAGE_CAPTURE);
-}
-
-static void
-columns_hide_col_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkTreeView *view;
- GtkTreeViewColumn *col;
- gint num;
- gchar *name;
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- col = (GtkTreeViewColumn *)g_object_get_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY);
- gtk_tree_view_column_set_visible(col, FALSE);
- num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MCAPTURE_COLUMNS_COL_KEY));
- if ((name = col_index_to_name(num)) != NULL) {
- set_capture_column_visible(name, FALSE);
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- update_visible_columns_menu ();
- }
-}
-
-static const char *ui_desc_columns_menu_popup =
-"<ui>\n"
-" <popup name='ColumnsPopup' action='PopupAction'>\n"
-" <menuitem name='ColumnPreferences' action='/Column Preferences'/>\n"
-" <menu name='DisplayedColumns' action='/Displayed Columns'>\n"
-" <menuitem name='Display All' action='/Displayed Columns/Display All'/>\n"
-" </menu>\n"
-" <menuitem name='HideColumn' action='/Hide Column'/>\n"
-" </popup>\n"
-"</ui>\n";
-
-static const GtkActionEntry columns_menu_popup_action_entries[] = {
- { "/Column Preferences", GTK_STOCK_PREFERENCES, "Column Preferences...", NULL, NULL, G_CALLBACK(columns_pref_cb) },
- { "/Displayed Columns", NULL, "Displayed Columns", NULL, NULL, NULL },
- { "/Displayed Columns/Display All", NULL, "Display All", NULL, NULL, G_CALLBACK(columns_activate_all_columns_cb) },
- { "/Hide Column", NULL, "Hide Column", NULL, NULL, G_CALLBACK(columns_hide_col_cb) },
-};
-
-#ifdef HAVE_PCAP_CREATE
-static void
-activate_monitor(GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer,
- GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
-#endif
-
-static void
-init_columns_menu(void)
-{
- GtkActionGroup *columns_action_group;
- GError *error = NULL;
-
- columns_menu_object = gtk_menu_new();
- /* columns pop-up menu */
- columns_action_group = gtk_action_group_new ("ColumnsPopUpMenuActionGroup");
-
- gtk_action_group_add_actions (columns_action_group, /* the action group */
- (const GtkActionEntry *)columns_menu_popup_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(columns_menu_popup_action_entries), /* the number of entries */
- columns_menu_object); /* data to pass to the action callbacks */
-
- ui_manager_columns = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager_columns,
- columns_action_group,
- 0); /* the position at which the group will be inserted. */
-
- gtk_ui_manager_add_ui_from_string (ui_manager_columns, ui_desc_columns_menu_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Packet List Heading Pop-Up failed: %s\n", error->message);
- g_error_free (error);
- error = NULL;
- }
-
- g_object_set_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY,
- gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_columns);
-}
-
-/* stop the currently running capture */
-void
-capture_stop_cb(GtkWidget *w _U_, gpointer d _U_)
-{
-#ifdef HAVE_AIRPCAP
- if (airpcap_if_active)
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
-#endif
-
- capture_stop(&global_capture_session);
-}
-
-/* restart (stop - delete old file - start) running capture */
-void
-capture_restart_cb(GtkWidget *w _U_, gpointer d _U_)
-{
-#ifdef HAVE_AIRPCAP
- if (airpcap_if_active)
- airpcap_set_toolbar_start_capture(airpcap_if_active);
-#endif
-
- capture_restart(&global_capture_session);
-}
-
-enum cfc_state_t {
- CFC_PENDING,
- CFC_UNKNOWN,
- CFC_VALID,
- CFC_INVALID
-};
-
-typedef struct capture_filter_check {
- enum cfc_state_t state;
- gchar *filter_text;
- GtkWidget *filter_te;
- int dlt;
-} capture_filter_check_t;
-
-/* Valid states:
- *
- * Idle: filter_text = NULL, state = ?
- * Pending: filter_text != NULL, state = CFC_PENDING
- * Unknown: filter_text != NULL, state = CFC_UNKNOWN
- * Known: filter_text != NULL, state = CFC_VALID || CFC_INVALID
- *
- * We assume that only one text entry is active at a time.
- */
-
-/* We could make this smarter by caching results */
-static capture_filter_check_t cfc_data;
-
-static GMutex *pcap_compile_mtx;
-static GCond *cfc_data_cond;
-static GMutex *cfc_data_mtx;
-
-#if 0
-#define DEBUG_SYNTAX_CHECK(state1, state2) g_warning("CF state %s -> %s : %s", state1, state2, cfc_data.filter_text)
-#else
-#define DEBUG_SYNTAX_CHECK(state1, state2)
-#endif
-
-static void *
-check_capture_filter_syntax(void *data _U_) {
- struct bpf_program fcode;
- int pc_err;
-
- while (1) {
- g_mutex_lock(cfc_data_mtx);
- while (!cfc_data.filter_text || cfc_data.state != CFC_PENDING) {
- /* Do we really need to use a mutex here? We only have one thread... */
- g_cond_wait(cfc_data_cond, cfc_data_mtx);
- }
- cfc_data.state = CFC_UNKNOWN;
- DEBUG_SYNTAX_CHECK("pending", "unknown");
-
- g_mutex_unlock(cfc_data_mtx);
- g_mutex_lock(pcap_compile_mtx);
-
- /* pcap_compile_nopcap will not alter the filter string, so the (char *) cast is "safe" */
- pc_err = pcap_compile_nopcap(DUMMY_SNAPLENGTH /* use a dummy snaplength for syntax-checking */,
- cfc_data.dlt, &fcode, cfc_data.filter_text, 1 /* Do optimize */,
- DUMMY_NETMASK /* use a dummy netmask for syntax-checking */);
-
- g_mutex_unlock(pcap_compile_mtx);
- g_mutex_lock(cfc_data_mtx);
-
- if (cfc_data.state == CFC_UNKNOWN) { /* No more input came in */
- if (pc_err) {
- DEBUG_SYNTAX_CHECK("unknown", "known bad");
- cfc_data.state = CFC_INVALID;
- } else {
- DEBUG_SYNTAX_CHECK("unknown", "known good");
- cfc_data.state = CFC_VALID;
- }
- }
- g_mutex_unlock(cfc_data_mtx);
- }
- return NULL;
-}
-
-static gboolean
-update_capture_filter_te(gpointer data _U_) {
-
- g_mutex_lock(cfc_data_mtx);
-
- if (cfc_data.filter_text && cfc_data.filter_te) {
- if (cfc_data.state == CFC_VALID) {
- colorize_filter_te_as_valid(cfc_data.filter_te);
- } else if (cfc_data.state == CFC_INVALID) {
- colorize_filter_te_as_invalid(cfc_data.filter_te);
- } else {
- colorize_filter_te_as_empty(cfc_data.filter_te);
- }
-
- if (cfc_data.state == CFC_VALID || cfc_data.state == CFC_INVALID) {
- DEBUG_SYNTAX_CHECK("known", "idle");
- /* Reset the current state to idle. */
- if (cfc_data.filter_text != NULL) {
- g_free(cfc_data.filter_text);
- }
- cfc_data.filter_text = NULL;
- cfc_data.state = CFC_PENDING;
- }
- }
- g_mutex_unlock(cfc_data_mtx);
- return TRUE;
-}
-
-/** Initialize background capture filter syntax checking
- */
-void capture_filter_init(void) {
- cfc_data.filter_text = NULL;
- cfc_data.filter_te = NULL;
- cfc_data.state = CFC_PENDING;
-
-#if GLIB_CHECK_VERSION(2,31,0)
- pcap_compile_mtx = g_new(GMutex,1);
- g_mutex_init(pcap_compile_mtx);
- cfc_data_cond = g_new(GCond,1);
- g_cond_init(cfc_data_cond);
- cfc_data_mtx = g_new(GMutex,1);
- g_mutex_init(cfc_data_mtx);
- g_thread_new("Capture filter syntax", check_capture_filter_syntax, NULL);
-#else
- pcap_compile_mtx = g_mutex_new();
- cfc_data_cond = g_cond_new();
- cfc_data_mtx = g_mutex_new();
- g_thread_create(check_capture_filter_syntax, NULL, FALSE, NULL);
-#endif
-
- g_timeout_add(200, update_capture_filter_te, NULL);
-}
-
-static void
-update_filter_string(gchar *name, gchar *text)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- gchar *name_str;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter_first(model, &iter);
- do {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
- if (strcmp(name, name_str) == 0) {
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, FILTER, g_strdup(text), -1);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
-}
-
-static void
-capture_all_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- GtkWidget *filter_cm, *filter_te;
- gchar *filter_text = NULL;
- guint i;
-
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
-
- if (!filter_cm)
- return;
-
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
-
- if (!filter_te)
- return;
-
- if (global_capture_opts.num_selected > 0) {
- interface_t device;
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (!device.selected) {
- continue;
- }
- if (device.active_dlt == -1) {
- colorize_filter_te_as_empty(filter_te);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The link type of interface %s was not specified.", device.name);
- continue; /* Programming error: somehow managed to select an "unsupported" entry */
- }
- /* Can't verify extcap capture filters */
- if (device.if_info.extcap != NULL && strlen(device.if_info.extcap) > 0)
- continue;
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- if (strlen(filter_text) == 0) {
- colorize_filter_te_as_empty(filter_te);
- if (strlen(device.cfilter) > 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_free(device.cfilter);
- device.cfilter = g_strdup(filter_text);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- update_filter_string(device.name, filter_text);
- }
- g_free(filter_text);
- continue;
- }
- g_assert(filter_text != NULL);
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_free(device.cfilter);
- device.cfilter = g_strdup(filter_text);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- g_mutex_lock(cfc_data_mtx);
- /* Ruthlessly clobber the current state. */
- g_free(cfc_data.filter_text);
- cfc_data.dlt = device.active_dlt;
- cfc_data.filter_text = filter_text;
- cfc_data.filter_te = filter_te;
- cfc_data.state = CFC_PENDING;
- DEBUG_SYNTAX_CHECK("?", "pending");
- g_cond_signal(cfc_data_cond);
- g_mutex_unlock(cfc_data_mtx);
- update_filter_string(device.name, filter_text);
- }
- }
-}
-
-static void
-capture_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- GtkWidget *filter_cm, *filter_te, *linktype_combo_box;
- gchar *filter_text;
- gpointer dlt_ptr;
-
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
- if (!filter_cm)
- return;
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
- if (!filter_te)
- return;
-
- linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &dlt_ptr)) {
- /*
- * There is no guarantee that we will even know the list of link-layer
- * header types; we will not have it if, for example, we have a named
- * pipe rather than an interface, as a named pipe doesn't *have* a
- * link-layer header type until the capture is started and the
- * pcap file header or pcapng interface description block is
- * written, and we can't wait for that. We won't have it if we can't
- * open the interface, either.
- *
- * We also won't have an active pointer, even if we have the list of
- * link-layer header types, if none of the types are supported.
- *
- * Just mark it as empty, as a way of saying "damned if I know whether
- * this filter is valid".
- */
- colorize_filter_te_as_empty(filter_te);
- return;
- }
- if ((cfc_data.dlt = GPOINTER_TO_INT(dlt_ptr)) == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
-
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
-
- if (strlen(filter_text) == 0) {
- colorize_filter_te_as_empty(filter_te);
- g_free(filter_text);
- return;
- }
-
- g_mutex_lock(cfc_data_mtx);
- /* Ruthlessly clobber the current state. */
- if (cfc_data.filter_text != NULL) {
- g_free(cfc_data.filter_text);
- }
- cfc_data.filter_text = filter_text;
- cfc_data.filter_te = filter_te;
- cfc_data.state = CFC_PENDING;
- DEBUG_SYNTAX_CHECK("?", "pending");
- g_cond_signal(cfc_data_cond);
- g_mutex_unlock(cfc_data_mtx);
-}
-
-static void
-capture_filter_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- g_mutex_lock(cfc_data_mtx);
- /* Reset the current state to idle. */
- if (cfc_data.filter_text != NULL) {
- g_free(cfc_data.filter_text);
- }
- cfc_data.filter_text = NULL;
- cfc_data.filter_te = NULL;
- cfc_data.state = CFC_PENDING;
- g_mutex_unlock(cfc_data_mtx);
-}
-
-#define TIME_UNIT_SECOND 0
-#define TIME_UNIT_MINUTE 1
-#define TIME_UNIT_HOUR 2
-#define TIME_UNIT_DAY 3
-#define MAX_TIME_UNITS 4
-static const char *time_unit_name[MAX_TIME_UNITS] = {
- "second(s)",
- "minute(s)",
- "hour(s)",
- "day(s)",
-};
-
-/* create one of the duration options */
-/* (and select the matching unit depending on the given value) */
-static GtkWidget *time_unit_combo_box_new(guint32 value) {
- GtkWidget *unit_combo_box;
- int i;
-
- unit_combo_box = gtk_combo_box_text_new ();
- for (i = 0; i < MAX_TIME_UNITS; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), time_unit_name[i]);
- }
- /* the selected combo_box item can't be changed, once the combo_box
- is created, so set the matching combo_box item now */
- /* days */
- if (value >= 60 * 60 * 24) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_DAY);
- } else {
- /* hours */
- if (value >= 60 * 60) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_HOUR);
- } else {
- /* minutes */
- if (value >= 60) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_MINUTE);
- } else {
- /* seconds */
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_SECOND);
- }
- }
- }
- return unit_combo_box;
-}
-
-/* convert time value from raw to displayed (e.g. 60s -> 1min) */
-static guint32 time_unit_combo_box_convert_value(
-guint32 value)
-{
- /* days */
- if (value >= 60 * 60 * 24) {
- return value / (60 * 60 * 24);
- }
-
- /* hours */
- if (value >= 60 * 60) {
- return value / (60 * 60);
- }
-
- /* minutes */
- if (value >= 60) {
- return value / 60;
- }
-
- /* seconds */
- return value;
-}
-
-/* get raw value from unit and value fields */
-static guint32 time_unit_combo_box_get_value(
-GtkWidget *unit_combo_box,
-guint32 value)
-{
- int unit;
-
- unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
-
- switch(unit) {
- case(TIME_UNIT_SECOND):
- return value;
- case(TIME_UNIT_MINUTE):
- return value * 60;
- case(TIME_UNIT_HOUR):
- return value * 60 * 60;
- case(TIME_UNIT_DAY):
- return value * 60 * 60 * 24;
- default:
- g_assert_not_reached();
- return 0;
- }
-}
-
-
-#define SIZE_UNIT_KILOBYTES 0
-#define SIZE_UNIT_MEGABYTES 1
-#define SIZE_UNIT_GIGABYTES 2
-#define MAX_SIZE_UNITS 3
-static const char *size_unit_name[MAX_SIZE_UNITS] = {
- "kilobyte(s)",
- "megabyte(s)",
- "gigabyte(s)"
-};
-
-/* create one of the size options */
-/* (and select the matching unit depending on the given value) */
-static GtkWidget *size_unit_combo_box_new(guint32 value) {
- GtkWidget *unit_combo_box;
- int i;
-
- unit_combo_box=gtk_combo_box_text_new();
- for (i=0; i<MAX_SIZE_UNITS; i++){
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), size_unit_name[i]);
- }
- /* the selected combo_box item can't be changed, once the combo_box
- is created, so set the matching combo_box item now */
- /* gigabytes */
- if (value >= 1000 * 1000) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_GIGABYTES);
- } else {
- /* megabytes */
- if (value >= 1000) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_MEGABYTES);
- } else {
- /* kilobytes */
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_KILOBYTES);
- }
- }
- return unit_combo_box;
-}
-
-/* convert size value from raw to displayed (e.g. 1000 Bytes -> 1 kB) */
-static guint32 size_unit_combo_box_set_value(
-guint32 value)
-{
- /* gigabytes */
- if (value >= 1000 * 1000) {
- return value / (1000 * 1000);
- }
-
- /* megabytes */
- if (value >= 1000) {
- return value / (1000);
- }
-
- /* kilobytes */
- return value;
-}
-
-/* get raw value from unit and value fields */
-static guint32 size_unit_combo_box_convert_value(
- GtkWidget *unit_combo_box,
-guint32 value)
-{
- int unit;
-
- unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
-
- switch(unit) {
- case(SIZE_UNIT_KILOBYTES):
- if (value > (((guint32)G_MAXINT + 1) / 1000)) {
- return 0;
- } else {
- return value;
- }
- case(SIZE_UNIT_MEGABYTES):
- if (value > (((guint32)G_MAXINT + 1) / (1000 * 1000))) {
- return 0;
- } else {
- return value * 1000;
- }
- case(SIZE_UNIT_GIGABYTES):
- if (value > (((guint32)G_MAXINT + 1) / (1000 * 1000 * 1000))) {
- return 0;
- } else {
- return value * 1000 * 1000;
- }
- default:
- g_assert_not_reached();
- return 0;
- }
-}
-
-#ifdef HAVE_AIRPCAP
-/*
- * Sets the toolbar before calling the advanced dialog with for the right interface
- */
-static void
-options_airpcap_advanced_cb(GtkWidget *w, gpointer d)
-{
- int *from_widget;
-
- from_widget = (gint*)g_malloc(sizeof(gint));
- *from_widget = AIRPCAP_ADVANCED_FROM_OPTIONS;
- g_object_set_data(G_OBJECT(wireless_tb),AIRPCAP_ADVANCED_FROM_KEY,from_widget);
-
- airpcap_if_active = airpcap_if_selected;
- airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
- display_airpcap_advanced_cb(w,d);
-}
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-#if 0
-/* PCAP interface type menu item */
-struct iftype_info {
- capture_source id;
- const char *name;
-};
-
-/* List of available types of PCAP interface */
-static struct iftype_info iftype[] = {
- { CAPTURE_IFLOCAL, "Local" },
- { CAPTURE_IFREMOTE, "Remote..." }
-};
-
-#define REMOTE_HOST_START ((sizeof(iftype) / sizeof(iftype[0])) + 1)
-#else
-#define REMOTE_HOST_START 3
-#endif
-#define REMOTE_HOST_SEPARATOR "---"
-
-static void
-iftype_combo_box_add_remote_separators (GtkWidget *iftype_cbx)
-{
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), REMOTE_HOST_SEPARATOR);
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), "Clear list");
-}
-
-#if 0
-static void
-iftype_combo_box_add (GtkWidget *iftype_cbx, interface_t *device)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean create_new = FALSE;
- gchar *string;
- guint pos = REMOTE_HOST_START;
- struct remote_host *rh;
-
- rh = recent_get_remote_host(device->remote_opts.remote_host_opts.remote_host);
- if (!rh) {
- rh = (struct remote_host *)g_malloc0 (sizeof (*rh));
- if (recent_get_remote_host_list_size() == 0) {
- iftype_combo_box_add_remote_separators (iftype_cbx);
- }
- gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(iftype_cbx), pos, device->remote_opts.remote_host_opts.remote_host);
- rh->r_host = g_strdup (device->remote_opts.remote_host_opts.remote_host);
- create_new = TRUE;
- } else {
- model = (GtkTreeModel *)gtk_combo_box_get_model(GTK_COMBO_BOX(iftype_cbx));
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) {
- while (gtk_tree_model_iter_next(model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &string, -1);
- if (string) {
- if (strcmp (device->remote_opts.remote_host_opts.remote_host, string) == 0) {
- /* Found match, show this position in combo box */
- g_free (string);
- break;
- }
- g_free (string);
- }
- pos++;
- }
- }
-
- g_free (rh->remote_port);
- g_free (rh->auth_username);
- g_free (rh->auth_password);
- }
-
- rh->remote_port = g_strdup (device->remote_opts.remote_host_opts.remote_port);
- rh->auth_type = device->remote_opts.remote_host_opts.auth_type;
- rh->auth_username = g_strdup (device->remote_opts.remote_host_opts.auth_username);
- rh->auth_password = g_strdup (device->remote_opts.remote_host_opts.auth_password);
-
- if (create_new) {
- recent_add_remote_host(g_strdup (device->remote_opts.remote_host_opts.remote_host), rh);
- }
-
- g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(1));
- gtk_combo_box_set_active(GTK_COMBO_BOX(iftype_cbx), pos);
- g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(0));
-}
-#endif
-
-static void
-iftype_combo_box_add_remote_host (gpointer key, gpointer value _U_, gpointer user_data)
-{
- gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(user_data), REMOTE_HOST_START, (const char *)key);
-}
-
-/* Fill the menu of available types of interfaces */
-static GtkWidget *
-iftype_combo_box_new(void)
-{
- GtkWidget *iftype_cbx;
-
- iftype_cbx = gtk_combo_box_text_new_with_entry();
-
- if (recent_get_remote_host_list_size() > 0) {
- /* Add remote hosts */
- recent_remote_host_list_foreach (iftype_combo_box_add_remote_host, iftype_cbx);
- iftype_combo_box_add_remote_separators (iftype_cbx);
- }
-
- g_signal_connect(iftype_cbx, "changed", G_CALLBACK(select_if_type_cb), NULL);
-
- return iftype_cbx;
-}
-
-#if 0
-static gboolean
-iftype_combo_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
-{
- gboolean result = FALSE;
- gchar *string;
-
- gtk_tree_model_get(model, iter, 0, &string, -1);
- if (string) {
- result = !strcmp (string, REMOTE_HOST_SEPARATOR);
- g_free (string);
- }
-
- return result;
-
-}
-#endif
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-static void
-error_list_remote_interface_cb (gpointer dialog _U_, gint btn _U_, gpointer data)
-{
- capture_remote_cb(GTK_WIDGET(data), FALSE);
-}
-
-static void
-insert_new_rows(GList *rlist)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- char *snaplen_string;
- gchar *link_type_name = NULL;
- char *temp = NULL;
-
- GList *if_entry, *lt_entry;
- if_info_t *if_info;
- char *if_string = NULL;
- gchar *descr, *auth_str;
- if_capabilities_t *caps;
- gint linktype_count;
- gboolean monitor_mode, found = FALSE;
- GSList *curr_addr;
- int ips = 0;
- guint i;
- if_addr_t *addr;
- data_link_info_t *data_link_info;
- GString *ip_str;
- link_row *linkr = NULL;
- interface_t device;
- guint num_interfaces;
- remote_options *roptions;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
-
- roptions = &global_remote_opts;
- /* Scan through the list and build a list of strings to display. */
- num_interfaces = global_capture_opts.all_ifaces->len;
- for (if_entry = g_list_first(rlist); if_entry != NULL; if_entry = g_list_next(if_entry)) {
- auth_str = NULL;
- if_info = (if_info_t *)if_entry->data;
- add_interface_to_remote_list(if_info);
- for (i = 0; i < num_interfaces; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, if_info->name) == 0) {
- found = TRUE;
- break;
- }
- }
- if (found) {
- found = FALSE;
- continue;
- }
- ip_str = g_string_new("");
- ips = 0;
- memset(&device, 0, sizeof(device));
- device.name = g_strdup(if_info->name);
- device.if_info.name = g_strdup("Don't crash on bug 13448");
- /* Is this interface hidden and, if so, should we include it
- anyway? */
- descr = capture_dev_user_descr_find(if_info->name);
- if (descr != NULL) {
- /* Yes, we have a user-supplied description; use it. */
- if_string = g_strdup_printf("%s: %s", descr, if_info->name);
- g_free(descr);
- } else {
- /* No, we don't have a user-supplied description; did we get
- one from the OS or libpcap? */
- if (if_info->vendor_description != NULL) {
- /* Yes - use it. */
- if_string = g_strdup_printf("%s: %s", if_info->vendor_description, if_info->name);
- } else {
- /* No. */
- if_string = g_strdup(if_info->name);
- }
- } /* else descr != NULL */
- if (if_info->loopback) {
- device.display_name = g_strdup_printf("%s (loopback)", if_string);
- } else {
- device.display_name = g_strdup(if_string);
- }
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if ((device.buffer = capture_dev_user_buffersize_find(if_string)) == -1) {
- device.buffer = global_capture_opts.default_options.buffer_size;
- }
-#endif
- if (!capture_dev_user_pmode_find(if_string, &device.pmode)) {
- device.pmode = global_capture_opts.default_options.promisc_mode;
- }
- if (!capture_dev_user_snaplen_find(if_string, &device.has_snaplen,
- &device.snaplen)) {
- device.has_snaplen = global_capture_opts.default_options.has_snaplen;
- device.snaplen = global_capture_opts.default_options.snaplen;
- }
- device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
- device.timestamp_type = g_strdup(global_capture_opts.default_options.timestamp_type);
- monitor_mode = prefs_capture_device_monitor_mode(if_string);
- if (roptions->remote_host_opts.auth_type == CAPTURE_AUTH_PWD) {
- auth_str = g_strdup_printf("%s:%s", roptions->remote_host_opts.auth_username,
- roptions->remote_host_opts.auth_password);
- }
- caps = capture_get_if_capabilities(if_string, monitor_mode, auth_str, NULL, main_window_update);
- g_free(auth_str);
- for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) {
- address addr_str;
- char* temp_addr_str = NULL;
- if (ips != 0) {
- g_string_append(ip_str, "\n");
- }
- addr = (if_addr_t *)curr_addr->data;
- switch (addr->ifat_type) {
- case IF_AT_IPv4:
- set_address(&addr_str, AT_IPv4, 4, &addr->addr.ip4_addr);
- temp_addr_str = (char*)address_to_str(NULL, &addr_str);
- g_string_append(ip_str, temp_addr_str);
- break;
- case IF_AT_IPv6:
- set_address(&addr_str, AT_IPv6, 16, addr->addr.ip6_addr);
- temp_addr_str = (char*)address_to_str(NULL, &addr_str);
- g_string_append(ip_str, temp_addr_str);
- break;
- default:
- /* In case we add non-IP addresses */
- break;
- }
-
- wmem_free(NULL, temp_addr_str);
- } /* for curr_addr */
- linktype_count = 0;
- device.links = NULL;
- if (caps != NULL) {
-#ifdef HAVE_PCAP_CREATE
- device.monitor_mode_enabled = monitor_mode;
- device.monitor_mode_supported = caps->can_set_rfmon;
-#endif
- for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
- data_link_info = (data_link_info_t *)lt_entry->data;
- linkr = (link_row *)g_malloc(sizeof(link_row));
- /*
- * For link-layer types libpcap/WinPcap doesn't know about, the
- * name will be "DLT n", and the description will be null.
- * We mark those as unsupported, and don't allow them to be
- * used.
- */
- if (data_link_info->description != NULL) {
- linkr->name = g_strdup(data_link_info->description);
- linkr->dlt = data_link_info->dlt;
- } else {
- linkr->name = g_strdup_printf("%s (not supported)", data_link_info->name);
- linkr->dlt = -1;
- }
- if (linktype_count == 0) {
- device.active_dlt = data_link_info->dlt;
- }
- device.links = g_list_append(device.links, linkr);
- linktype_count++;
- } /* for link_types */
- } else {
-#if defined(HAVE_PCAP_CREATE)
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
-#endif
- device.active_dlt = -1;
- }
- device.addresses = g_strdup(ip_str->str);
- device.no_addresses = ips;
- device.remote_opts.src_type = roptions->src_type;
- if (device.remote_opts.src_type == CAPTURE_IFREMOTE) {
- device.local = FALSE;
- }
- device.remote_opts.remote_host_opts.remote_host = g_strdup(roptions->remote_host_opts.remote_host);
- device.remote_opts.remote_host_opts.remote_port = g_strdup(roptions->remote_host_opts.remote_port);
- device.remote_opts.remote_host_opts.auth_type = roptions->remote_host_opts.auth_type;
- device.remote_opts.remote_host_opts.auth_username = g_strdup(roptions->remote_host_opts.auth_username);
- device.remote_opts.remote_host_opts.auth_password = g_strdup(roptions->remote_host_opts.auth_password);
- device.remote_opts.remote_host_opts.datatx_udp = roptions->remote_host_opts.datatx_udp;
- device.remote_opts.remote_host_opts.nocap_rpcap = roptions->remote_host_opts.nocap_rpcap;
- device.remote_opts.remote_host_opts.nocap_local = roptions->remote_host_opts.nocap_local;
-#ifdef HAVE_PCAP_SETSAMPLING
- device.remote_opts.sampling_method = roptions->sampling_method;
- device.remote_opts.sampling_param = roptions->sampling_param;
-#endif
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- g_array_append_val(global_capture_opts.all_ifaces, device);
- g_string_free(ip_str, TRUE);
-
- if (caps == NULL) {
- link_type_name = g_strdup("default");
- } else {
- data_link_info = (data_link_info_t *)caps->data_link_types->data;
- if (data_link_info->description != NULL) {
- link_type_name = g_strdup(data_link_info->description);
- } else {
- link_type_name = g_strdup_printf("%s (not supported)", data_link_info->name);
- }
- }
- if (ips == 0) {
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- } else {
- temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
- }
- snaplen_string = g_strdup_printf("%d", device.snaplen);
-
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-#if defined(HAVE_PCAP_CREATE)
- 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);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- 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);
- #else
- 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);
-#endif
- add_interface_to_list(global_capture_opts.all_ifaces->len-1);
- } /*for*/
- gtk_tree_view_set_model(GTK_TREE_VIEW(if_cb), model);
-}
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-static void
-populate_existing_remotes(gpointer key, gpointer value, gpointer user_data _U_)
-{
- const gchar *host = (const gchar *)key;
- struct remote_host *remote_host = (struct remote_host *)value;
- GList *if_list;
- int err;
- gchar *err_str;
-
- g_free(global_remote_opts.remote_host_opts.remote_host);
- g_free(global_remote_opts.remote_host_opts.remote_port);
- g_free(global_remote_opts.remote_host_opts.auth_username);
- g_free(global_remote_opts.remote_host_opts.auth_password);
- global_remote_opts.src_type = CAPTURE_IFREMOTE;
- global_remote_opts.remote_host_opts.remote_host = g_strdup(host);
- global_remote_opts.remote_host_opts.remote_port = g_strdup(remote_host->remote_port);
- global_remote_opts.remote_host_opts.auth_type = remote_host->auth_type;
- global_remote_opts.remote_host_opts.auth_username = g_strdup(remote_host->auth_username);
- global_remote_opts.remote_host_opts.auth_password = g_strdup(remote_host->auth_password);
- global_remote_opts.remote_host_opts.datatx_udp = FALSE;
- global_remote_opts.remote_host_opts.nocap_rpcap = TRUE;
- global_remote_opts.remote_host_opts.nocap_local = FALSE;
-#ifdef HAVE_PCAP_SETSAMPLING
- global_remote_opts.sampling_method = CAPTURE_SAMP_NONE;
- global_remote_opts.sampling_param = 0;
-#endif
-
- if_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
- global_remote_opts.remote_host_opts.remote_port,
- global_remote_opts.remote_host_opts.auth_type,
- global_remote_opts.remote_host_opts.auth_username,
- global_remote_opts.remote_host_opts.auth_password,
- &err, &err_str);
- if (if_list != NULL) {
- /* New remote interface */
- insert_new_rows(if_list);
- refresh_non_local_interface_lists();
- }
-}
-
-
-/* Retrieve the list of remote interfaces according to selected
- * options and re-fill interface name combobox */
-static void
-update_remote_interface_list(void)
-{
- GtkWidget *iftype_cbx;
- GList *if_list;
- int err;
- gchar *err_str;
-
- if (cap_open_w == NULL)
- return;
- 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);
- if_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
- global_remote_opts.remote_host_opts.remote_port,
- global_remote_opts.remote_host_opts.auth_type,
- global_remote_opts.remote_host_opts.auth_username,
- global_remote_opts.remote_host_opts.auth_password,
- &err, &err_str);
- if (if_list == NULL &&
- (err == CANT_GET_INTERFACE_LIST || err == DONT_HAVE_PCAP)) {
- gpointer dialog = simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
- g_free(err_str);
-
- /* Fall back to previous interface list */
- simple_dialog_set_cb(dialog, error_list_remote_interface_cb, iftype_cbx);
- return;
- } else {
- /* New remote interface */
- insert_new_rows(if_list);
- refresh_non_local_interface_lists();
- }
-}
-
-/* User changed an interface entry of "Remote interface" dialog */
-static void
-capture_remote_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
-{
- GtkWidget *auth_passwd_rb,
- *username_lb, *username_te,
- *passwd_lb, *passwd_te;
- gboolean state;
-
- auth_passwd_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_REMOTE_AUTH_PASSWD_KEY);
- username_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_REMOTE_USERNAME_LB_KEY);
- username_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_REMOTE_USERNAME_TE_KEY);
- passwd_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_LB_KEY);
- passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_TE_KEY);
-
- state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb));
- gtk_widget_set_sensitive(GTK_WIDGET(username_lb), state);
- gtk_widget_set_sensitive(GTK_WIDGET(username_te), state);
- gtk_widget_set_sensitive(GTK_WIDGET(passwd_lb), state);
- gtk_widget_set_sensitive(GTK_WIDGET(passwd_te), state);
-}
-
-
-/* user requested to accept remote interface options */
-static void
-capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w)
-{
- GtkWidget *host_te, *port_te, *username_te, *passwd_te, *auth_passwd_rb;
- gchar *hostname;
- struct remote_host *rh;
-
- if (remote_w == NULL) {
- return;
- }
-
- host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
- hostname = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(host_te));
- port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
- username_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w),
- E_REMOTE_USERNAME_TE_KEY);
- passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
- auth_passwd_rb = (GtkWidget *) g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
- g_free(global_remote_opts.remote_host_opts.remote_host);
- global_remote_opts.remote_host_opts.remote_host = hostname;
- g_free(global_remote_opts.remote_host_opts.remote_port);
- global_remote_opts.remote_host_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te)));
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb)))
- global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_PWD;
- else
- global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_NULL;
- g_free(global_remote_opts.remote_host_opts.auth_username);
- global_remote_opts.remote_host_opts.auth_username =
- g_strdup(gtk_entry_get_text(GTK_ENTRY(username_te)));
-
- g_free(global_remote_opts.remote_host_opts.auth_password);
- global_remote_opts.remote_host_opts.auth_password =
- g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_te)));
-
- rh = (struct remote_host *)g_malloc (sizeof (*rh));
- rh->r_host = g_strdup(global_remote_opts.remote_host_opts.remote_host);
- rh->remote_port = g_strdup(global_remote_opts.remote_host_opts.remote_port);
- rh->auth_type = global_remote_opts.remote_host_opts.auth_type;
- rh->auth_password = g_strdup("");
- rh->auth_username = g_strdup("");
-
- recent_add_remote_host(hostname, rh);
-
- update_remote_interface_list();
- fill_remote_list();
- window_destroy(GTK_WIDGET(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY)));
-}
-
-static void
-capture_remote_cancel_cb(GtkWidget *win, gpointer data)
-{
- window_cancel_button_cb (win, data);
-}
-
-static void
-select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_)
-{
- gchar *string;
- GtkWidget *port_te, *auth_rb, *user_te, *pass_te;
- GtkWidget *remote_w;
- struct remote_host *rh;
-
- int new_iftype = gtk_combo_box_get_active(GTK_COMBO_BOX(iftype_cbx));
- gint num_remote = recent_get_remote_host_list_size();
-
- if (new_iftype != -1 && new_iftype == num_remote+1) {
- recent_free_remote_host_list();
- num_remote += 2;
- while (num_remote--) { /* Remove separator lines and "Clear" item */
- gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT(iftype_cbx), num_remote);
- }
- remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
- window_destroy(GTK_WIDGET(remote_w));
- capture_remote_cb(GTK_WIDGET(iftype_cbx), FALSE);
- } else {
- string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(iftype_cbx));
- rh = recent_get_remote_host(string);
- g_free (string);
- if (rh) {
- remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
- port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
- gtk_entry_set_text(GTK_ENTRY(port_te), rh->remote_port);
- auth_rb = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
- if (rh->auth_type == CAPTURE_AUTH_PWD) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), TRUE);
- } else {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), FALSE);
- }
- user_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY);
- gtk_entry_set_text(GTK_ENTRY(user_te), rh->auth_username);
- pass_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
- gtk_entry_set_text(GTK_ENTRY(pass_te), rh->auth_password);
- }
- }
-}
-
-/* Show remote capture interface parameters dialog */
-static void
-capture_remote_cb(GtkWidget *w _U_, gboolean focus_username)
-{
- GtkWidget *remote_w,
- *main_vb, *host_grid,
- *host_lb, *host_te, *port_lb, *port_te,
- *auth_fr, *auth_vb,
- *auth_null_rb, *auth_passwd_rb, *auth_passwd_grid,
- *user_lb, *user_te, *passwd_lb, *passwd_te,
- *bbox, *ok_but, *cancel_bt;
- gchar *title;
- GSList *auth_group;
-
- title = create_user_window_title("Wireshark: Remote Interface");
- remote_w = dlg_window_new(title);
- gtk_window_set_transient_for(GTK_WINDOW(remote_w), GTK_WINDOW(interface_management_w));
- g_object_set_data(G_OBJECT(remote_w), E_CAP_REMOTE_CALLER_PTR_KEY, interface_management_w);
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, remote_w);
- g_free(title);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(remote_w), main_vb);
-
- /* Host/port table */
- host_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(host_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(host_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(main_vb), host_grid, FALSE, FALSE, 0);
-
- /* Host row */
- host_lb = gtk_label_new("Host:");
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_lb, 0, 0, 1, 1);
-
- host_te = iftype_combo_box_new();
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_te, 1, 0, 1, 1);
-
- /* Port row */
- port_lb = gtk_label_new("Port:");
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_lb, 0, 1, 1, 1);
-
- port_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(port_te, "Enter the TCP port number used by RPCAP server at remote host "
- "(leave it empty for default port number).");
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_te, 1, 1, 1, 1);
-
- /* Authentication options frame */
- auth_fr = gtk_frame_new("Authentication");
- gtk_box_pack_start(GTK_BOX (main_vb), auth_fr, TRUE, TRUE, 0);
-
- auth_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(auth_vb), 5);
- gtk_container_add(GTK_CONTAINER(auth_fr), auth_vb);
-
- auth_null_rb = gtk_radio_button_new_with_label(NULL,
- "Null authentication");
- gtk_box_pack_start(GTK_BOX(auth_vb), auth_null_rb, TRUE, TRUE, 0);
-
- auth_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(auth_null_rb));
- auth_passwd_rb = gtk_radio_button_new_with_label(auth_group,
- "Password authentication");
- gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_rb, TRUE, TRUE, 0);
- g_signal_connect(auth_passwd_rb, "toggled",
- G_CALLBACK(capture_remote_adjust_sensitivity), remote_w);
-
- auth_passwd_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(auth_passwd_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(auth_passwd_grid), DLG_UNRELATED_SPACING);
-
- gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_grid, FALSE, FALSE, 0);
-
- user_lb = gtk_label_new("Username:");
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_lb, 0, 0, 1, 1);
-
- user_te = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_te, 1, 0, 1, 1);
-
- passwd_lb = gtk_label_new("Password:");
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_lb, 0, 1, 1, 1);
-
- passwd_te = gtk_entry_new();
- gtk_entry_set_visibility(GTK_ENTRY(passwd_te), FALSE);
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_te, 1, 1, 1, 1);
-
- /* Button row: "OK" and "Cancel" buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_set_can_default(ok_but, TRUE);
- g_signal_connect(ok_but, "clicked", G_CALLBACK(capture_remote_ok_cb), remote_w);
- gtk_widget_set_tooltip_text(ok_but,
- "Accept remote host parameters and lookup "
- "remote interfaces.");
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_OK_BT_KEY, ok_but);
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
- window_set_cancel_button(remote_w, cancel_bt, capture_remote_cancel_cb);
-
- if (focus_username) {
- /* Give the initial focus to the "Username" entry box. */
- gtk_widget_grab_focus(user_te);
- }
-
- gtk_widget_grab_default(ok_but);
-
- /* Catch the "activate" signal on the text
- entries, so that if the user types Return there, we act as if the
- "OK" button had been selected, as happens if Return is typed if some
- widget that *doesn't* handle the Return key has the input focus. */
- dlg_set_activate(port_te, ok_but);
- dlg_set_activate(user_te, ok_but);
- dlg_set_activate(passwd_te, ok_but);
-
- g_signal_connect(remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY, host_te);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY, port_te);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_NULL_KEY, auth_null_rb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY, auth_passwd_rb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_LB_KEY, user_lb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY, user_te);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_LB_KEY, passwd_lb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY, passwd_te);
-
- if (global_remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_passwd_rb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_null_rb), TRUE);
- capture_remote_adjust_sensitivity(NULL, remote_w);
-
- gtk_widget_show_all(remote_w);
- window_present(remote_w);
-}
-
-/* user requested to destroy the dialog */
-static void
-options_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
-{
- GtkWidget *caller;
-
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_REMOTE_CALLER_PTR_KEY);
- g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, NULL);
-}
-
-/* user requested to accept remote interface options */
-static void
-options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w)
-{
- GtkWidget *datatx_udp_cb, *nocap_rpcap_cb;
-#ifdef HAVE_PCAP_SETSAMPLING
- GtkWidget *samp_none_rb, *samp_count_rb, *samp_timer_rb,
- *samp_count_sb, *samp_timer_sb;
-#endif
- interface_t device;
-
- if (parent_w == NULL)
- return;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- datatx_udp_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_DATATX_UDP_CB_KEY);
- nocap_rpcap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_NOCAP_RPCAP_CB_KEY);
-
- device.remote_opts.remote_host_opts.datatx_udp =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(datatx_udp_cb));
- device.remote_opts.remote_host_opts.nocap_rpcap =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb));
-
-#ifdef HAVE_PCAP_SETSAMPLING
- samp_none_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_NONE_RB_KEY);
- samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
- samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
- samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
- samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_none_rb)))
- device.remote_opts.sampling_method = CAPTURE_SAMP_NONE;
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb))) {
- device.remote_opts.sampling_method = CAPTURE_SAMP_BY_COUNT;
- device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb));
- } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb))) {
- device.remote_opts.sampling_method = CAPTURE_SAMP_BY_TIMER;
- device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb));
- }
-#endif /* HAVE_PCAP_SETSAMPLING*/
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- window_destroy(GTK_WIDGET(parent_w));
-}
-#endif /*HAVE_PCAP_REMOTE*/
-
-#ifdef HAVE_PCAP_SETSAMPLING
-static void
-options_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
-{
- GtkWidget *samp_count_rb, *samp_timer_rb,
- *samp_count_sb, *samp_timer_sb;
-
- samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
- samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
- samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
- samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
-
- if (samp_count_sb && samp_count_rb)
- gtk_widget_set_sensitive(GTK_WIDGET(samp_count_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb)));
-
- if (samp_timer_sb && samp_timer_rb)
- gtk_widget_set_sensitive(GTK_WIDGET(samp_timer_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb)));
-}
-
-#endif /*HAVE_PCAP_SETSAMPLING*/
-#ifdef HAVE_PCAP_REMOTE
-static void
-options_remote_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *opt_remote_w, *main_vb;
- GtkWidget *caller, *bbox, *ok_but, *cancel_bt;
- GtkWidget *capture_fr, *capture_vb;
- GtkWidget *nocap_rpcap_cb, *datatx_udp_cb;
-#ifdef HAVE_PCAP_SETSAMPLING
- GtkWidget *sampling_fr, *sampling_vb, *sampling_grid, *sampling_lb,
- *samp_none_rb, *samp_count_rb, *samp_timer_rb,
- *samp_count_sb, *samp_timer_sb;
- GtkAdjustment *samp_count_adj, *samp_timer_adj;
- GSList *samp_group;
-#endif
- interface_t device;
-
- caller = gtk_widget_get_toplevel(w);
- opt_remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY);
- if (opt_remote_w != NULL) {
- reactivate_window(opt_remote_w);
- return;
- }
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- opt_remote_w = dlg_window_new("Remote Capture Settings");
- gtk_window_set_modal(GTK_WINDOW(opt_remote_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(opt_remote_w), GTK_WINDOW(caller));
- gtk_window_set_type_hint(GTK_WINDOW(opt_remote_w), GDK_WINDOW_TYPE_HINT_DIALOG);
-
- g_object_set_data(G_OBJECT(opt_remote_w), E_OPT_REMOTE_CALLER_PTR_KEY, caller);
- g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, opt_remote_w);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(opt_remote_w), main_vb);
-
- /* Remote capture options */
- capture_fr = gtk_frame_new("Capture Options");
- gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
-
- capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
- gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
-
- nocap_rpcap_cb = gtk_check_button_new_with_mnemonic("Do not capture own RPCAP traffic");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb),
- device.remote_opts.remote_host_opts.nocap_rpcap);
- gtk_box_pack_start(GTK_BOX (capture_vb), nocap_rpcap_cb, TRUE, TRUE, 0);
-
- datatx_udp_cb = gtk_check_button_new_with_mnemonic("Use UDP for data transfer");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(datatx_udp_cb),
- device.remote_opts.remote_host_opts.datatx_udp);
- gtk_box_pack_start(GTK_BOX (capture_vb), datatx_udp_cb, TRUE, TRUE, 0);
-
-
-#ifdef HAVE_PCAP_SETSAMPLING
- /* Sampling options */
- sampling_fr = gtk_frame_new("Sampling Options");
- gtk_box_pack_start(GTK_BOX (main_vb), sampling_fr, TRUE, TRUE, 0);
-
- sampling_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(sampling_vb), 5);
- gtk_container_add(GTK_CONTAINER(sampling_fr), sampling_vb);
-
- sampling_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(sampling_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(sampling_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(sampling_vb), sampling_grid, FALSE, FALSE, 0);
-
- /* "No sampling" row */
- samp_none_rb = gtk_radio_button_new_with_label(NULL, "None");
- if (device.remote_opts.sampling_method == CAPTURE_SAMP_NONE)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_none_rb), TRUE);
- g_signal_connect(samp_none_rb, "toggled",
- G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_none_rb, 0, 0, 1, 1);
-
- /* "Sampling by counter" row */
- samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_none_rb));
- samp_count_rb = gtk_radio_button_new_with_label(samp_group, "1 of");
- if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_COUNT)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_count_rb), TRUE);
- g_signal_connect(samp_count_rb, "toggled",
- G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_rb, 0, 1, 1, 1);
-
- samp_count_adj = (GtkAdjustment *) gtk_adjustment_new(
- (gfloat)device.remote_opts.sampling_param,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- samp_count_sb = gtk_spin_button_new(samp_count_adj, 0, 0);
- gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_count_sb), TRUE);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_sb, 1, 1, 1, 1);
-
- sampling_lb = gtk_label_new("packets");
- gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 1, 1, 1);
-
- /* "Sampling by timer" row */
- samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_count_rb));
- samp_timer_rb = gtk_radio_button_new_with_label(samp_group, "1 every");
- if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_TIMER)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_timer_rb), TRUE);
- g_signal_connect(samp_timer_rb, "toggled",
- G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_timer_rb, 0, 2, 1, 1);
-
- samp_timer_adj = (GtkAdjustment *) gtk_adjustment_new(
- (gfloat)device.remote_opts.sampling_param,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- samp_timer_sb = gtk_spin_button_new(samp_timer_adj, 0, 0);
- gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_timer_sb), TRUE);
- ws_gtk_grid_attach_defaults(GTK_GRID(sampling_grid), samp_timer_sb, 1, 2, 1, 1);
-
- sampling_lb = gtk_label_new("milliseconds");
- gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 2, 1, 1);
-#endif
-
- /* Button row: "Start" and "Cancel" buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_but, "clicked", G_CALLBACK(options_remote_ok_cb), opt_remote_w);
- gtk_widget_set_tooltip_text(ok_but, "Accept parameters and close dialog");
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
- window_set_cancel_button(opt_remote_w, cancel_bt, window_cancel_button_cb);
-
- gtk_widget_grab_default(ok_but);
-
- g_signal_connect(opt_remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(opt_remote_w, "destroy", G_CALLBACK(options_remote_destroy_cb), NULL);
-
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_NOCAP_RPCAP_CB_KEY, nocap_rpcap_cb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_DATATX_UDP_CB_KEY, datatx_udp_cb);
-
-#ifdef HAVE_PCAP_SETSAMPLING
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_NONE_RB_KEY, samp_none_rb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_RB_KEY, samp_count_rb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_SB_KEY, samp_count_sb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_RB_KEY, samp_timer_rb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_SB_KEY, samp_timer_sb);
-#endif
-
-#ifdef HAVE_PCAP_SETSAMPLING
- /* Set the sensitivity of various widgets as per the settings of other
- widgets. */
- options_prep_adjust_sensitivity(NULL, opt_remote_w);
-#endif
-
- gtk_widget_show_all(opt_remote_w);
- window_present(opt_remote_w);
-}
-
-#endif /* HAVE_PCAP_REMOTE */
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-
-static void
-compile_bpf_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have an "About Wireshark" dialog box. */
- compile_bpf_w = NULL;
-}
-
-static void
-select_first_entry(void)
-{
- GtkWidget *view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
- gtk_tree_model_get_iter_first(model, &iter);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_selection_select_iter(selection, &iter);
-}
-
-static void
-add_page(gchar *name, gchar *text, gboolean error)
-{
- GtkWidget *view, *icon;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
- if (error) {
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/stock_icons/14x14/x-expert-error.png");
-#else
- icon = pixbuf_to_widget(expert_error_pb_data);
-#endif
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 1, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
- } else {
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/expert_ok.png");
-#else
- icon = pixbuf_to_widget(expert_ok_pb_data);
-#endif
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 0, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
- }
- g_hash_table_insert(compile_results, name, text);
-}
-
-static void
-compile_tree_select_cb(GtkTreeSelection *sel, gpointer dummy _U_)
-{
- gchar *name, *text;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *textview;
- GtkTextBuffer *buffer;
- guint error;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter))
- {
- gtk_tree_model_get(model, &iter, COMPILE_ERROR, &error, INAME, &name, -1);
- text = (gchar *)g_hash_table_lookup(compile_results, name);
- textview = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB);
- if (error == 1) {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
- } else {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
- }
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
- gtk_text_buffer_set_text(buffer, text, -1);
- gtk_widget_show_all(compile_bpf_w);
- }
-}
-
-static void
-compile_results_prep(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *main_box, *main_vb, *bbox, *ok_btn, *top_hb, *ct_sb;
- GtkListStore *store;
- GtkWidget *view, *scrolled_win, *textview;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- PangoFontDescription *font;
-
- if (compile_bpf_w != NULL) {
- /* There's already an "About Wireshark" dialog box; reactivate it. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The requested dialog is already open. Please close it first.");
- return;
- }
-
- compile_bpf_w = dlg_window_new("Compile selected BPFs");
- /* set the initial position (must be done, before show is called!) */
- /* default position is not appropriate for the about dialog */
- gtk_window_set_position(GTK_WINDOW(compile_bpf_w), GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(compile_bpf_w), 600, 400);
- gtk_window_set_modal(GTK_WINDOW(compile_bpf_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(compile_bpf_w), GTK_WINDOW(cap_open_w));
- gtk_container_set_border_width(GTK_CONTAINER(compile_bpf_w), 6);
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
- gtk_container_add(GTK_CONTAINER(compile_bpf_w), main_box);
- gtk_widget_show(main_box);
-
- /* Top row: Interfaces tree and notebook */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
- gtk_box_pack_start(GTK_BOX(main_box), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- /* scrolled window on the left for the categories tree */
- ct_sb = scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(GTK_WIDGET(ct_sb), 50, -1);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct_sb),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct_sb),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start(GTK_BOX(top_hb), ct_sb, TRUE, TRUE, 0);
- gtk_widget_show(ct_sb);
- g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_SW_SCROLLW_KEY, ct_sb);
-
- store = gtk_list_store_new(3, G_TYPE_UINT, GDK_TYPE_PIXBUF, G_TYPE_STRING);
- view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL (store));
- g_object_set(G_OBJECT(view), "headers-visible", FALSE, NULL);
- g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES, view);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_attributes(column, renderer, "text", COMPILE_ERROR, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_visible(column, FALSE);
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_pixbuf_new();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", SIGN, NULL);
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_attributes(column, renderer, "text", INAME, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 0), TRUE);
-
- g_signal_connect(selection, "changed", G_CALLBACK(compile_tree_select_cb), NULL);
- gtk_container_add(GTK_CONTAINER(ct_sb), view);
- gtk_widget_show(view);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_box_pack_start(GTK_BOX(top_hb), main_vb, TRUE, TRUE, 0);
- gtk_widget_show(main_vb);
- g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, main_vb);
-
- font = pango_font_description_from_string("Monospace");
- textview = gtk_text_view_new();
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(textview, font);
-#else
- gtk_widget_modify_font(textview, font);
-#endif
- scrolled_win = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
- gtk_box_pack_start(GTK_BOX(main_vb), scrolled_win, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, textview);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
-
- ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_grab_focus(ok_btn);
- gtk_widget_grab_default(ok_btn);
- window_set_cancel_button(compile_bpf_w, ok_btn, window_cancel_button_cb);
-
- g_signal_connect(compile_bpf_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(compile_bpf_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
-
- gtk_widget_show_all(compile_bpf_w);
- window_present(compile_bpf_w);
-
- compile_results = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-static void
-capture_all_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- pcap_t *pd;
- struct bpf_program fcode;
-
- GtkWidget *filter_cm;
- gchar *filter_text;
- guint i;
- gboolean set = FALSE;
-
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
-
- if (!filter_cm)
- return;
-
- if (global_capture_opts.all_ifaces->len > 0) {
- interface_t device;
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (!device.selected || device.hidden) {
- continue;
- }
- if (device.active_dlt == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- if (!set) {
- set = TRUE;
- compile_results_prep(NULL, NULL);
- }
- pd = pcap_open_dead(device.active_dlt, DUMMY_SNAPLENGTH);
-
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- g_mutex_lock(pcap_compile_mtx);
-#ifdef PCAP_NETMASK_UNKNOWN
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0)
-#else
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0)
-#endif
- {
- g_mutex_unlock(pcap_compile_mtx);
- add_page(device.name, g_strdup(pcap_geterr(pd)), TRUE);
- } else {
- GString *bpf_code_dump = g_string_new("");
- struct bpf_insn *insn = fcode.bf_insns;
- int ii, n = fcode.bf_len;
- gchar *bpf_code_str;
-
- for (ii = 0; ii < n; ++insn, ++ii) {
- g_string_append(bpf_code_dump, bpf_image(insn, ii));
- g_string_append(bpf_code_dump, "\n");
- }
- bpf_code_str = g_string_free(bpf_code_dump, FALSE);
- g_mutex_unlock(pcap_compile_mtx);
- add_page(device.name, g_strdup(bpf_code_str), FALSE);
- g_free(bpf_code_str);
- }
- g_free(filter_text);
- pcap_close(pd);
- }
- }
- select_first_entry();
-}
-#endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
-
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-static void
-compile_results_win(gchar *text, gboolean error)
-{
- GtkWidget *main_box, *bbox, *ok_btn, *results_w;
- GtkWidget *scrolled_win, *textview;
- PangoFontDescription *font;
- GtkTextBuffer *buffer;
-
- results_w = dlg_window_new("Compile results");
- /* set the initial position (must be done, before show is called!) */
- /* default position is not appropriate for the about dialog */
- gtk_window_set_position(GTK_WINDOW(results_w), GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(results_w), 400, 400);
- gtk_window_set_modal(GTK_WINDOW(results_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(results_w), GTK_WINDOW(opt_edit_w));
- gtk_container_set_border_width(GTK_CONTAINER(results_w), 6);
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
- gtk_container_add(GTK_CONTAINER(results_w), main_box);
- gtk_widget_show(main_box);
- font = pango_font_description_from_string("Monospace");
- textview = gtk_text_view_new();
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(textview, font);
-#else
- gtk_widget_modify_font(textview, font);
-#endif
- scrolled_win = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
- gtk_box_pack_start(GTK_BOX(main_box), scrolled_win, TRUE, TRUE, 0);
- if (error == 1) {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
- } else {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
- }
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
- gtk_text_buffer_set_text(buffer, g_strdup(text), -1);
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
-
- ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_grab_focus(ok_btn);
- gtk_widget_grab_default(ok_btn);
- window_set_cancel_button(results_w, ok_btn, window_cancel_button_cb);
-
- g_signal_connect(results_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(results_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
-
- gtk_widget_show_all(results_w);
- window_present(results_w);
-}
-
-
-static void
-capture_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- pcap_t *pd;
- struct bpf_program fcode;
-
- GtkWidget *filter_cm;
- gchar *filter_text;
- gpointer ptr;
- int dlt;
- GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
- if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- pd = pcap_open_dead(dlt, DUMMY_SNAPLENGTH);
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- g_mutex_lock(pcap_compile_mtx);
-#ifdef PCAP_NETMASK_UNKNOWN
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0) {
-#else
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0) {
-#endif
- g_mutex_unlock(pcap_compile_mtx);
- compile_results_win(g_strdup(pcap_geterr(pd)), 1);
- } else {
- GString *bpf_code_dump = g_string_new("");
- struct bpf_insn *insn = fcode.bf_insns;
- int i, n = fcode.bf_len;
-
- gchar *bpf_code_str;
-
- g_mutex_unlock(pcap_compile_mtx);
-
- for (i = 0; i < n; ++insn, ++i) {
- g_string_append(bpf_code_dump, bpf_image(insn, i));
- g_string_append(bpf_code_dump, "\n");
- }
-
- bpf_code_str = g_string_free(bpf_code_dump, FALSE);
- compile_results_win(g_strdup(bpf_code_str), 0);
-
- g_free(bpf_code_str);
- }
- g_free(filter_text);
-
- pcap_close(pd);
-}
-#endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
-
-static void
-options_edit_destroy_cb(GtkWidget *win, gpointer user_data _U_)
-{
- GtkWidget *caller;
-
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_EDIT_CALLER_PTR_KEY);
- g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, NULL);
-}
-
-static void
-update_options_table(gint indx)
-{
- interface_t device;
- GtkTreePath *path;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *temp, *path_str, *snaplen_string, *linkname;
- GList *list;
- link_row *linkr = NULL;
- gboolean enabled;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
-
- if (!device.hidden) {
- if (device.no_addresses == 0) {
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- } else {
- temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
- }
- linkname = NULL;
- for (list=device.links; list!=NULL; list=g_list_next(list))
- {
- linkr = (link_row*)(list->data);
- if (linkr->dlt == device.active_dlt) {
- linkname = g_strdup(linkr->name);
- break;
- }
- }
- if (!linkname)
- linkname = g_strdup("unknown");
- snaplen_string = g_strdup_printf("%d", device.snaplen);
- if (cap_open_w) {
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- path_str = g_strdup_printf("%d", indx);
- path = gtk_tree_path_new_from_string(path_str);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1);
- if (enabled == FALSE) {
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- }
- #if defined(HAVE_PCAP_CREATE)
- 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);
- #elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- 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);
- #else
- 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);
- #endif
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- gtk_tree_path_free (path);
- g_free(path_str);
- }
- if (interfaces_dialog_window_present()) {
- update_selected_interface(g_strdup(device.name));
- }
- if (get_welcome_window() != NULL) {
- change_interface_selection(g_strdup(device.name), device.selected);
- }
- g_free(linkname);
- }
- set_sensitivity_for_start_icon();
-}
-
-
-static void
-save_options_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- GtkWidget *snap_cb, *snap_sb, *promisc_cb,
-#ifdef HAVE_PCAP_CREATE
- *monitor_cb,
-#endif
- *filter_cm, *linktype_combo_box;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- GtkWidget *buffer_size_sb;
-#endif
- GtkWidget *extcap_vbox = NULL;
-
- interface_t device;
- gpointer ptr = NULL;
- int dlt = -1;
- gchar *filter_text;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
- snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- buffer_size_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY);
-#endif
- promisc_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY);
-#ifdef HAVE_PCAP_CREATE
- monitor_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY);
-#endif
- filter_cm = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
-
- linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
-
- extcap_vbox = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_EXTCAP_KEY);
-
- if (device.links != NULL) {
- if (ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
- /* Even though device.links != NULL, we might not have an active pointer
- * if all of the available links are unsupported, so the failure of
- * ws_combo_box_get_active_pointer() is not cause for
- * g_assert_not_reached().
- */
- if (ptr != NULL && (dlt = GPOINTER_TO_INT(ptr)) == -1)
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- }
- device.active_dlt = dlt;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- device.buffer = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_sb));
-#endif
- device.pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb));
- device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
- if (device.has_snaplen) {
- device.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
- if (device.snaplen < MIN_PACKET_SIZE)
- device.snaplen = MIN_PACKET_SIZE;
- } else {
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- }
- filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(filter_cm));
- g_free(device.cfilter);
- g_assert(filter_text != NULL);
- device.cfilter = filter_text;
-
- if (device.external_cap_args_settings != NULL)
- g_hash_table_unref(device.external_cap_args_settings);
-
- if (extcap_vbox != NULL)
- device.external_cap_args_settings = extcap_gtk_get_state(extcap_vbox);
-
- /* Destroy the args data linked in the gtk widget */
-#if 0
- extcap_gtk_free_args(extcap_vbox);
-#endif
-
-#ifdef HAVE_PCAP_CREATE
- /* if dumpcap reported that the interface does not support monitor
- mode, we disable monitor mode even if the user explicitly selected it */
- device.monitor_mode_enabled = device.monitor_mode_supported ?
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor_cb)) : FALSE;
-#endif
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- window_destroy(opt_edit_w);
- update_options_table(marked_row);
- update_properties_all();
-}
-
-static void
-adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_)
-{
- GtkWidget *snap_cb, *snap_sb;
- interface_t device;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
-
- snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
- snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
-
- /* The snapshot length spinbox is sensitive if the "Limit each packet
- to" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(snap_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)));
- device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
- if (!device.has_snaplen) {
- gtk_spin_button_set_value(GTK_SPIN_BUTTON (snap_sb), WTAP_MAX_PACKET_SIZE_STANDARD);
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- }
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
-}
-
-static GtkWidget *build_extcap_options(const gchar *name, GHashTable *hash) {
- GtkWidget *ret_box = NULL;
- GList *arglist = NULL;
- GList *elem = NULL;
-
- arglist = extcap_get_if_configuration( name );
- for ( elem = g_list_first(arglist); elem; elem = elem->next )
- {
- GSList *widget_list;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- ret_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
-#else
- ret_box = ws_gtk_vbox_new(FALSE, 3);
-#endif
- widget_list = extcap_populate_gtk_vbox((GList *) elem->data, ret_box, hash);
- g_object_set_data(G_OBJECT(ret_box), EXTCAP_GTK_DATA_KEY_WIDGETLIST, widget_list);
- }
-
- return ret_box;
-}
-
-/*
- * If we have an AirPcap "Wireless Settings" checkbox, have two columns
- * (vboxes) of settings, and put the buffer size in the right column.
- *
- * If we have remote capture support, and if this is a remote interface,
- * have two columns of settings, have a "Remote Sttings" button, and
- * put it in the right column.
- *
- * If we can set the buffer size, then have two columns of settings
- * and, if we don't have a "Remote Settings" button, put it in the
- * right column.
- *
- * We avoid having the right column if we don't need it, because it
- * steals 3 pixels.
- */
-#if defined(HAVE_AIRPCAP) || defined(HAVE_PCAP_REMOTE) || defined(CAN_SET_CAPTURE_BUFFER_SIZE)
-#define HAVE_TWO_SETTING_COLUMNS
-# if !defined(HAVE_PCAP_REMOTE)
-# define BUFFER_SIZE_IN_RIGHT_COLUMN
-# endif /* !defined(HAVE_PCAP_REMOTE) */
-#endif /* defined(HAVE_AIRPCAP) || defined(HAVE_PCAP_REMOTE) || defined(CAN_SET_CAPTURE_BUFFER_SIZE) */
-
-void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata)
-{
- GtkWidget *caller, *window, *swindow = NULL, *if_view,
- *main_vb, *if_hb, *if_lb, *if_lb_name,
- *main_hb, *left_vb,
-#ifdef HAVE_TWO_SETTING_COLUMNS
- *right_vb,
-#endif
- *capture_fr, *capture_vb,
- *if_ip_hb, *if_ip_lb = NULL, *if_ip_name,
- *if_vb_left, *if_vb_right,
- *linktype_hb, *linktype_lb, *linktype_combo_box,
- *snap_hb, *snap_cb, *snap_sb, *snap_lb,
- *promisc_cb,
-#ifdef HAVE_PCAP_CREATE
- *monitor_cb,
-#endif
- *filter_hb, *filter_bt, *filter_te, *filter_cm,
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- *compile_bt,
-#endif
- *bbox, *ok_but, *cancel_bt,
- *extcap_vbox,
- *help_bt;
-
- GList *cf_entry, *list, *cfilter_list;
- GtkAdjustment *snap_adj;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- GtkAdjustment *buffer_size_adj;
- GtkWidget *buffer_size_lb, *buffer_size_sb, *buffer_size_hb;
-#endif
-#ifdef HAVE_PCAP_REMOTE
- GtkWidget *remote_bt;
-#endif
-#ifdef HAVE_AIRPCAP
- GtkWidget *advanced_bt;
-#endif
- interface_t device;
- GtkTreeModel *model;
- GtkTreeIter iter;
- link_row *temp;
- gboolean found = FALSE;
- gint num_link_types, num_supported_link_types, first_supported_index;
- guint i;
- gchar *tok, *name;
- GtkCellRenderer *renderer;
- GtkListStore *store;
- const gchar *new_cfilter;
- GHashTable *extcap_hash;
-
- window = (GtkWidget *)userdata;
- caller = gtk_widget_get_toplevel(GTK_WIDGET(window));
- opt_edit_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY);
- if (opt_edit_w != NULL) {
- reactivate_window(opt_edit_w);
- return;
- }
-
- device.name = NULL;
- device.display_name = NULL;
- device.no_addresses = 0;
- device.addresses = NULL;
- device.links = NULL;
- device.active_dlt = -1;
- device.pmode = FALSE;
-#ifdef HAVE_PCAP_CREATE
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
-#endif
- device.has_snaplen = FALSE;
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- device.cfilter = NULL;
- device.timestamp_type = NULL;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
-#endif
- device.external_cap_args_settings = NULL;
-
- model = gtk_tree_view_get_model(view);
- gtk_tree_model_get_iter (model, &iter, path);
-
- if (window == get_welcome_window()) {
- gtk_tree_model_get(model, &iter, IFACE_NAME, &name, -1);
- } else if (window == cap_open_w) {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name, -1);
- } else {
- return;
- }
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, name) == 0) {
- marked_interface = i;
- break;
- }
- }
- // not sure if this can happen, just to be sure...
- if (gtk_tree_path_get_depth(path) == 0) {
- marked_row = 0;
- } else {
- marked_row = gtk_tree_path_get_indices(path)[0];
- }
- opt_edit_w = dlg_window_new("Edit Interface Settings");
- gtk_window_set_modal(GTK_WINDOW(opt_edit_w), TRUE);
- gtk_window_set_type_hint (GTK_WINDOW (opt_edit_w), GDK_WINDOW_TYPE_HINT_DIALOG);
- g_object_set_data(G_OBJECT(opt_edit_w), E_OPT_EDIT_CALLER_PTR_KEY, caller);
- g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, opt_edit_w);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(opt_edit_w), main_vb);
-
- /* Capture-related options frame */
- capture_fr = gtk_frame_new("Capture");
- gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
-
- capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
- gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
-
- /* Interface row */
- if_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(capture_vb), if_hb, FALSE, FALSE, 3);
-
- if_lb = gtk_label_new("Interface: ");
- gtk_box_pack_start(GTK_BOX(if_hb), if_lb, FALSE, FALSE, 3);
-
- if_lb_name = gtk_label_new(device.display_name);
- gtk_box_pack_start(GTK_BOX(if_hb), if_lb_name, FALSE, FALSE, 3);
-
- /* IP addresses row */
- if_ip_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- gtk_widget_set_tooltip_text(if_ip_hb, "Lists the IP address(es) "
- "assigned to the selected interface. ");
- if_vb_left = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_left, FALSE, FALSE, 3);
- if_vb_right = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
-
- if_ip_lb = gtk_label_new("IP address:");
- gtk_misc_set_alignment(GTK_MISC(if_ip_lb), 0, 0); /* Left justified */
- gtk_box_pack_start(GTK_BOX(if_vb_left), if_ip_lb, FALSE, FALSE, 0);
- if (device.no_addresses > 0) {
- gchar *temp_addresses = g_strdup(device.addresses);
- gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, TRUE, TRUE, 3);
- swindow = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(GTK_WIDGET(swindow),-1, 50);
- if_view = gtk_tree_view_new ();
- g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- GTK_CELL_RENDERER(renderer),
- "text", 0,
- NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
- store = gtk_list_store_new(1, G_TYPE_STRING);
- for (tok = strtok (temp_addresses, "\n"); tok; tok = strtok(NULL, "\n")) {
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, tok, -1);
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
- gtk_container_add (GTK_CONTAINER (swindow), if_view);
- gtk_box_pack_start(GTK_BOX(if_vb_right), swindow, TRUE, TRUE, 0);
- g_free(temp_addresses);
- } else {
- gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, FALSE, FALSE, 3);
- if_ip_name = gtk_label_new("none");
- gtk_misc_set_alignment(GTK_MISC(if_ip_name), 0, 0); /* Left justified */
- gtk_box_pack_start(GTK_BOX(if_vb_right), if_ip_name, FALSE, FALSE, 0);
- }
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
- gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 3);
-
- left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
-
-#ifdef HAVE_TWO_SETTING_COLUMNS
- right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 3);
-#endif
-
- /* Linktype row */
- linktype_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(left_vb), linktype_hb, FALSE, FALSE, 0);
-
- linktype_lb = gtk_label_new("Link-layer header type:");
- gtk_box_pack_start(GTK_BOX(linktype_hb), linktype_lb, FALSE, FALSE, 3);
-
- linktype_combo_box = ws_combo_box_new_text_and_pointer();
- g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY, linktype_lb);
- /* Default to "use the default" */
- /* Datalink menu index is not reset; it will be restored with last used value */
-
- g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_IFACE_IP_KEY, if_ip_lb);
- /*
- * XXX - in some cases, this is "multiple link-layer header types", e.g.
- * some 802.11 interfaces on FreeBSD 5.2 and later, where you can request
- * fake Ethernet, 802.11, or 802.11-plus-radio-information headers.
- *
- * In other cases, it's "multiple link-layer types", e.g., with recent
- * versions of libpcap, a DAG card on an "HDLC" WAN, where you can
- * request Cisco HDLC or PPP depending on what type of traffic is going
- * over the WAN, or an Ethernet interface, where you can request Ethernet
- * or DOCSIS, the latter being for some Cisco cable modem equipment that
- * can be configured to send raw DOCSIS frames over an Ethernet inside
- * Ethernet low-level framing, for traffic capture purposes.
- *
- * We leave it as "multiple link-layer types" for now.
- */
- gtk_widget_set_tooltip_text(linktype_combo_box, "The selected interface supports multiple link-layer types; select the desired one.");
- gtk_box_pack_start (GTK_BOX(linktype_hb), linktype_combo_box, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY, linktype_combo_box);
- num_link_types = 0;
- num_supported_link_types = 0;
- first_supported_index = -1;
- for (list=device.links; list!=NULL; list=g_list_next(list))
- {
- temp = (link_row*)(list->data);
- if (temp->dlt == -1)
- {
- ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
- NULL,
- temp->name,
- GINT_TO_POINTER(-1), /* Flag as "not supported" */
- FALSE);
- }
- else
- {
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
- temp->name,
- GINT_TO_POINTER(temp->dlt));
- /* Record the index of the first supported link type (and thus the first
- * one in the list to be active) for use determining the default selected
- * element. */
- if (first_supported_index == -1)
- {
- first_supported_index = num_link_types;
- }
- if (temp->dlt == device.active_dlt)
- {
- ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box), num_link_types);
- found = TRUE;
- }
- num_supported_link_types++;
- }
- num_link_types++;
- }
- gtk_widget_set_sensitive(linktype_lb, num_link_types >= 2);
- gtk_widget_set_sensitive(linktype_combo_box, num_link_types >= 2);
- if (!found && first_supported_index >= 0)
- {
- ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),first_supported_index);
- }
- g_signal_connect(linktype_combo_box, "changed", G_CALLBACK(select_link_type_cb), NULL);
-
- /* Promiscuous mode row */
- promisc_cb = gtk_check_button_new_with_mnemonic(
- "Capture packets in _promiscuous mode");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
- device.pmode);
- gtk_widget_set_tooltip_text(promisc_cb,
- "Usually a network adapter will only capture the traffic sent to its own network address. "
- "If you want to capture all traffic that the network adapter can \"see\", mark this option. "
- "See the FAQ for some more details of capturing packets from a switched network.");
- gtk_box_pack_start (GTK_BOX(left_vb), promisc_cb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY, promisc_cb);
-
-#ifdef HAVE_PCAP_CREATE
- /* Monitor mode row */
- monitor_cb = gtk_check_button_new_with_mnemonic( "Capture packets in monitor mode");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb), device.monitor_mode_enabled);
- gtk_widget_set_sensitive(monitor_cb, device.monitor_mode_supported);
- g_signal_connect(monitor_cb, "toggled", G_CALLBACK(capture_prep_monitor_changed_cb), NULL);
-
- gtk_widget_set_tooltip_text(monitor_cb,
- "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture the traffic on the BSS to which it's associated. "
- "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", mark this option. "
- "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
- "it might be necessary to turn this option on.\n\n"
- "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
- gtk_box_pack_start (GTK_BOX(left_vb), monitor_cb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY, monitor_cb);
-#endif
-
- /*
- * This controls the sensitivity of both the link-type list and, if
- * you have it, the monitor mode checkbox. That's why we do this
- * now.
- */
-
- /* Capture length row */
- snap_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start (GTK_BOX(left_vb), snap_hb, FALSE, FALSE, 0);
-
- snap_cb = gtk_check_button_new_with_mnemonic("_Limit each packet to");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(snap_cb),
- device.has_snaplen);
- g_signal_connect(snap_cb, "toggled", G_CALLBACK(adjust_snap_sensitivity), NULL);
- gtk_widget_set_tooltip_text(snap_cb,
- "Limit the maximum number of bytes to be captured from each packet. This size includes the "
- "link-layer header and all subsequent headers. ");
- gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0);
-
- snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.snaplen,
- MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- snap_sb = gtk_spin_button_new (snap_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE);
- gtk_widget_set_size_request(snap_sb, 80, -1);
- gtk_box_pack_start (GTK_BOX(snap_hb), snap_sb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY, snap_cb);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY, snap_sb);
- snap_lb = gtk_label_new("bytes");
- gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5f);
- gtk_box_pack_start(GTK_BOX(snap_hb), snap_lb, FALSE, FALSE, 0);
- gtk_widget_set_sensitive(GTK_WIDGET(snap_sb), device.has_snaplen);
-
- /* Filter row */
- filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(capture_vb), filter_hb, FALSE, FALSE, 0);
-
- filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
- g_signal_connect(filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
- gtk_widget_set_tooltip_text(filter_bt,
- "Select a capture filter to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it."
- );
- gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, FALSE, 3);
-
- /* Create the capture filter combo box*/
- filter_cm = gtk_combo_box_text_new_with_entry();
- g_object_set_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY, filter_cm);
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
- colorize_filter_te_as_empty(filter_te);
- g_signal_connect(filter_te, "changed", G_CALLBACK(capture_filter_check_syntax_cb), NULL);
- g_signal_connect(filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
-
- cfilter_list = recent_get_cfilter_list(name);
- for (cf_entry = cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
- new_cfilter = (const gchar *)cf_entry->data;
- /* If this is the current dfilter or the default cfilter, don't put
- it in the list, as it'll be added later. */
- if ((device.cfilter == NULL || strcmp(device.cfilter, new_cfilter) != 0) &&
- (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0)) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), new_cfilter);
- }
- }
- if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
- /* If this is the current dfilter, don't put it in the list, as it'll be
- added later. */
- if (device.cfilter == NULL || strcmp(device.cfilter, global_capture_opts.default_options.cfilter) != 0) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), global_capture_opts.default_options.cfilter);
- }
- }
- if (device.cfilter && (strlen(device.cfilter) > 0)) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), device.cfilter);
- gtk_combo_box_set_active(GTK_COMBO_BOX(filter_cm), 0);
- }
-
- gtk_widget_set_tooltip_text(filter_cm,
- "Enter a capture filter to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it. "
- "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
- );
- gtk_box_pack_start(GTK_BOX(filter_hb), filter_cm, TRUE, TRUE, 3);
-
- /* let an eventually capture filters dialog know the text entry to fill in */
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- compile_bt = gtk_button_new_with_label("Compile BPF");
- g_signal_connect(compile_bt, "clicked", G_CALLBACK(capture_filter_compile_cb), NULL);
- gtk_widget_set_tooltip_text(compile_bt,
- "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
- /* We can't compile without any supported link-types, so disable the button in that case */
- gtk_widget_set_sensitive(compile_bt, (num_supported_link_types >= 1));
- gtk_box_pack_start(GTK_BOX(filter_hb), compile_bt, FALSE, FALSE, 3);
-#endif
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- buffer_size_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- buffer_size_lb = gtk_label_new("Buffer size:");
- gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 0);
-
- buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.buffer,
- 1, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- buffer_size_sb = gtk_spin_button_new (buffer_size_adj, 0, 0);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) device.buffer);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (buffer_size_sb), TRUE);
- gtk_widget_set_size_request(buffer_size_sb, 80, -1);
- gtk_widget_set_tooltip_text(buffer_size_sb,
- "The memory buffer size used while capturing. If you notice packet drops, you can try to increase this size.");
- gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_sb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY, buffer_size_sb);
- buffer_size_lb = gtk_label_new("mebibyte(s)");
- gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 3);
- gtk_misc_set_alignment(GTK_MISC(buffer_size_lb), 1, 0);
-#ifdef BUFFER_SIZE_IN_RIGHT_COLUMN
- gtk_box_pack_start (GTK_BOX(right_vb), buffer_size_hb, FALSE, FALSE, 0);
-#else /* BUFFER_SIZE_IN_RIGHT_COLUMN */
- gtk_box_pack_start (GTK_BOX(left_vb), buffer_size_hb, FALSE, FALSE, 0);
-#endif /* BUFFER_SIZE_IN_RIGHT_COLUMN */
-#endif /* CAN_SET_CAPTURE_BUFFER_SIZE */
-
-#ifdef HAVE_PCAP_REMOTE
- /*
- * *IF* this is a remote interface, add the "Remote Settings"
- * button. Do *not* add it for other interfaces, as that could
- * lead users to believe that it could somehow be enabled.
- */
- /* Both the callback and the data are global */
- if (strncmp (device.name, "rpcap://", 8) == 0) {
- remote_bt = gtk_button_new_with_label("Remote Settings");
- gtk_widget_set_tooltip_text(remote_bt, "Various settings for remote capture.");
-
- g_signal_connect(remote_bt, "clicked", G_CALLBACK(options_remote_cb), NULL);
-
- gtk_box_pack_start(GTK_BOX(right_vb), remote_bt, FALSE, FALSE, 0);
- gtk_widget_show(remote_bt);
- }
-#endif
-
-#ifdef HAVE_AIRPCAP
- /*
- * *IF* this is an AirPcap interface, add the "Wireless Settings"
- * button. Do *not* add it for other interfaces, as that can
- * confuse users, so that they ask why this is grayed out on
- * their non-Windows machine and ask how to enable it.
- */
- airpcap_if_selected = get_airpcap_if_from_name(g_airpcap_if_list, device.name);
- if (airpcap_if_selected != NULL) {
- advanced_bt = gtk_button_new_with_label("Wireless Settings");
-
- /* Both the callback and the data are global */
- g_signal_connect(advanced_bt,"clicked", G_CALLBACK(options_airpcap_advanced_cb), wireless_tb);
-
- gtk_box_pack_start(GTK_BOX(right_vb), advanced_bt, FALSE, FALSE, 0);
- gtk_widget_show(advanced_bt);
- }
-#endif
-
- extcap_hash = device.external_cap_args_settings;
- extcap_vbox = build_extcap_options(device.name, extcap_hash);
- if (extcap_vbox != NULL) {
- gtk_box_pack_start(GTK_BOX(capture_vb), extcap_vbox, FALSE, FALSE, 5);
- gtk_widget_show(extcap_vbox);
- }
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_EXTCAP_KEY, extcap_vbox);
-
-/* Button row: "Start", "Cancel" and "Help" buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_but, "clicked", G_CALLBACK(save_options_cb), NULL);
- gtk_widget_set_tooltip_text(ok_but,
- "Accept interface settings.");
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt,
- "Cancel and exit dialog.");
- window_set_cancel_button(opt_edit_w, cancel_bt, window_cancel_button_cb);
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- gtk_widget_set_tooltip_text(help_bt,
- "Show help about capturing.");
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_OPTIONS_DIALOG);
- dlg_set_activate(filter_te, ok_but);
- gtk_widget_grab_focus(filter_te);
- g_signal_connect(opt_edit_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(opt_edit_w, "destroy", G_CALLBACK(options_edit_destroy_cb), NULL);
- gtk_widget_show_all(opt_edit_w);
- window_present(opt_edit_w);
-}
-
-static void toggle_callback(GtkCellRendererToggle *cell _U_,
- gchar *path_str,
- gpointer data _U_)
-{
- /* get the treemodel from somewhere */
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- gboolean enabled;
- GtkWidget *pcap_ng_cb, *filter_cm;
- interface_t device;
- gchar *name;
- gint indx = -1;
- guint i;
-
- /* Initialise device */
- device.cfilter = NULL;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, CAPTURE, &enabled, IFACE_HIDDEN_NAME, &name, -1);
- /* Look for the right interface. The number of interfaces shown might be less
- * than the real number. Therefore the path index does not correspond
- * necessarily to the position in the list */
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, name) == 0) {
- indx = i;
- break;
- }
- }
- if (enabled == FALSE) {
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- } else {
- device.selected = FALSE;
- global_capture_opts.num_selected--;
- }
- if (indx != -1) {
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
- g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
- pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
- if (global_capture_opts.num_selected >= 2) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
- gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
- } else {
- gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
- }
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- /* do something with the new enabled value, and set the new
- enabled value in your treemodel */
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, -1);
- if (interfaces_dialog_window_present()) {
- update_selected_interface(g_strdup(device.name));
- }
- if (get_welcome_window() != NULL) {
- change_interface_selection(g_strdup(device.name), device.selected);
- }
- }
- if (device.cfilter != NULL) {
- g_free(device.cfilter);
- device.cfilter = NULL;
- update_filter_string(device.name, NULL);
- }
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
- g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
- gtk_tree_path_free (path);
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
- if (strcmp(gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm)),"") != 0) {
- capture_all_filter_check_syntax_cb(NULL, NULL);
- }
- update_properties_all();
-}
-
-void enable_selected_interface(gchar *name, gboolean selected)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- gchar *name_str;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter_first(model, &iter);
- do {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
- if (strcmp(name, name_str) == 0) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, selected, -1);
- break;
- }
- }
- while (gtk_tree_model_iter_next(model, &iter));
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
-}
-
-
-static void capture_all_cb(GtkToggleButton *button, gpointer d _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkWidget *filter_cm, *pcap_ng_cb;
- gchar *interface = NULL, *filter_text = NULL;
- gboolean enabled = FALSE, capture_set = FALSE, pseudo = FALSE;
- guint16 num_temp, i;
- interface_t device;
-
- if (gtk_toggle_button_get_active(button))
- enabled = TRUE;
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
- num_temp = global_capture_opts.num_selected++;
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- if (gtk_tree_model_get_iter_first(model, &iter)) {
- do {
- gtk_tree_model_get (model, &iter, CAPTURE, &capture_set, IFACE_HIDDEN_NAME, &interface, -1);
- if (strcmp(interface, "any") == 0) {
- pseudo = TRUE;
- }
- if (!capture_set && enabled && !pseudo) {
- num_temp++;
- } else if (capture_set && (!enabled || (enabled && pseudo))) {
- num_temp--;
- }
- if (!pseudo) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, enabled, -1);
- if (strlen(filter_text) != 0) {
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, interface) == 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_free(device.cfilter);
- device.cfilter = g_strdup(filter_text);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- update_filter_string(device.name, filter_text);
- }
- }
- }
- } else {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, -1);
- }
- pseudo = FALSE;
- } while (gtk_tree_model_iter_next(model, &iter));
- }
- if (num_temp >= 2) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
- gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
- } else if (num_temp <= 1) {
- gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
- }
- if (interfaces_dialog_window_present()) {
- select_all_interfaces(enabled);
- }
- if (get_welcome_window() != NULL) {
- change_selection_for_all(enabled);
- }
- if (global_capture_opts.num_selected != num_temp) {
- global_capture_opts.num_selected = num_temp;
- }
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- set_sensitivity_for_start_icon();
-}
-
-
-static gboolean get_all_prom_mode(void)
-{
- interface_options interface_opts;
- guint i;
-
- for (i = 0; i < global_capture_opts.ifaces->len; i++) {
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
- if (!interface_opts.promisc_mode) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static void promisc_mode_callback(GtkToggleButton *button, gpointer d _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- gboolean enabled = FALSE;
- interface_t device;
- interface_options interface_opts;
- guint i;
-
- if (gtk_toggle_button_get_active(button))
- enabled = TRUE;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first(model, &iter)) {
- do {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, PMODE, enabled?"enabled":"disabled", -1);
- } while (gtk_tree_model_iter_next(model, &iter));
- }
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
- device.pmode = (enabled?TRUE:FALSE);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- }
-
- for (i = 0; i < global_capture_opts.ifaces->len; i++) {
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
- global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
- interface_opts.promisc_mode = (enabled?TRUE:FALSE);
- g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
- }
-}
-
-#if defined (HAVE_PCAP_REMOTE)
-static void
-show_remote_dialog(GtkWidget *w)
-{
-
- g_free(global_remote_opts.remote_host_opts.remote_host);
- g_free(global_remote_opts.remote_host_opts.remote_port);
- g_free(global_remote_opts.remote_host_opts.auth_username);
- g_free(global_remote_opts.remote_host_opts.auth_password);
- global_remote_opts.src_type = CAPTURE_IFREMOTE;
- global_remote_opts.remote_host_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
- global_remote_opts.remote_host_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
- global_remote_opts.remote_host_opts.auth_type = global_capture_opts.default_options.auth_type;
- global_remote_opts.remote_host_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
- global_remote_opts.remote_host_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
- global_remote_opts.remote_host_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
- global_remote_opts.remote_host_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
- global_remote_opts.remote_host_opts.nocap_local = global_capture_opts.default_options.nocap_local;
-#ifdef HAVE_PCAP_SETSAMPLING
- global_remote_opts.sampling_method = global_capture_opts.default_options.sampling_method;
- global_remote_opts.sampling_param = global_capture_opts.default_options.sampling_param;
-#endif
- capture_remote_cb(GTK_WIDGET(w), FALSE);
-}
-#endif
-
-static void change_pipe_name_cb(gpointer dialog _U_, gint btn, gpointer data)
-{
- guint i;
- interface_t device;
- gchar *temp, *optname, *snaplen_string/*, *oldname = ""*/;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *pipe_te;
-
- switch(btn) {
- case(ESD_BTN_OK):
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp((gchar *)data, device.name) == 0) {
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sA pipe with this name already exists.%s",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 0, &optname, -1);
- if (strcmp(optname, (gchar *) data) == 0) {
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
- gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(optname);
- }
- return;
- }
- }
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(pipe_name, device.name) == 0) {
- g_free(device.name);
- g_free(device.display_name);
- device.name = g_strdup((gchar *)data);
- device.display_name = g_strdup(device.name);
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- snaplen_string = g_strdup_printf("%d", device.snaplen);
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &optname, -1);
- if (strcmp(optname, pipe_name) == 0) {
-#if defined(HAVE_PCAP_CREATE)
- 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);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- 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);
-#else
- 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);
-#endif
-#if 0
- oldname = g_strdup(pipe_name);
-#endif
- pipe_name = g_strdup(device.name);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
-
- g_free(optname);
- }
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- refresh_non_local_interface_lists();
- break;
- }
- }
- break;
- case(ESD_BTN_CANCEL): {
- if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- model = gtk_tree_view_get_model(if_cb);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 0, &optname, -1);
- if (strcmp(optname, (gchar *) data) == 0) {
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
- gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(optname);
- }
- break;
- }
- default:
- g_assert_not_reached();
- }
-}
-
-static void
-add_pipe_cb(gpointer w _U_)
-{
- interface_t device;
- gint indx;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *temp, *path_str, *snaplen_string;
- GtkWidget *pipe_te;
- const gchar *g_save_file;
- gchar *name;
- guint i;
- gpointer dialog;
-
- if (!pipe_name)
- return;
-
- pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- g_save_file = gtk_entry_get_text(GTK_ENTRY(pipe_te));
- name = g_strdup(g_save_file);
- if (strcmp(name, "New pipe") == 0 || strcmp(name, "") == 0) {
- g_free(name);
- return;
- }
- if (strcmp(pipe_name, "New pipe") != 0) {
- if (strcmp(pipe_name, name) != 0) {
- dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_OK_CANCEL,
- "%sDo you want to change %s to %s?%s",
- simple_dialog_primary_start(), pipe_name, name, simple_dialog_primary_end());
- simple_dialog_set_cb(dialog, change_pipe_name_cb, name);
- }
- } else {
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(name, device.name) == 0) {
- g_free(name);
- return;
- }
- }
- pipe_name = g_strdup(g_save_file);
- memset(&device, 0, sizeof(device));
- device.name = g_strdup(g_save_file);
- device.display_name = g_strdup(device.name);
- device.hidden = FALSE;
- device.selected = TRUE;
- device.type = IF_PIPE;
- device.pmode = global_capture_opts.default_options.promisc_mode;
- device.has_snaplen = global_capture_opts.default_options.has_snaplen;
- device.snaplen = global_capture_opts.default_options.snaplen;
- device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
- device.timestamp_type = g_strdup(global_capture_opts.default_options.timestamp_type);
- device.addresses = NULL;
- device.no_addresses = 0;
- device.last_packets = 0;
- device.links = NULL;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
-#endif
- device.active_dlt = -1;
- device.if_info.name = g_strdup(g_save_file);
- device.if_info.friendly_name = NULL;
- device.if_info.vendor_description = NULL;
- device.if_info.addrs = NULL;
- device.if_info.loopback = FALSE;
- device.if_info.type = IF_PIPE;
- device.if_info.extcap = NULL;
- device.external_cap_args_settings = NULL;
-#if defined(HAVE_PCAP_CREATE)
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
-#endif
- global_capture_opts.num_selected++;
-
- indx = global_capture_opts.all_ifaces->len;
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
-
- snaplen_string = g_strdup_printf("%d", device.snaplen);
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- path_str = g_strdup_printf("%d", indx);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter_from_string(model, &iter, path_str);
- g_array_append_val(global_capture_opts.all_ifaces, device);
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-#if defined(HAVE_PCAP_CREATE)
- 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);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- 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);
-#else
- 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);
-#endif
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as pipes). */
- refresh_non_local_interface_lists();
-
- g_free(name);
- }
-}
-
-static void
-pipe_new_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- GtkListStore *store;
- GtkTreeIter iter;
-
- /* Add a new entry to the pipe list. */
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
- gtk_list_store_append(store, &iter);
-
- gtk_list_store_set(store, &iter, 0, "New pipe", -1);
- pipe_name = "New pipe";
-
- /* Select the item. */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(pipe_l), &iter);
-
- gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
-
- gtk_widget_grab_focus(name_te);
-}
-
-static void
-pipe_del_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkTreeSelection *sel;
- GtkTreeModel *model, *optmodel;
- GtkTreeIter iter, optiter;
- GtkTreeView *if_cb;
- GtkTreePath *path;
- gchar *name, *optname = NULL;
- guint i;
- gint32 num;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
- /* If something was selected */
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &name, -1);
- path = gtk_tree_model_get_path(model, &iter);
- if (gtk_tree_path_get_depth(path) == 0) {
- num = 0;
- } else {
- num = gtk_tree_path_get_indices(path)[0];
- }
- if (name != NULL && num < (gint)global_capture_opts.all_ifaces->len) {
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- if (strcmp(g_array_index(global_capture_opts.all_ifaces, interface_t, i).name, name) == 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- break;
- }
- }
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
- gtk_entry_set_text(GTK_ENTRY(name_te), "");
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- optmodel = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first (optmodel, &optiter)) {
- do {
- gtk_tree_model_get(optmodel, &optiter, IFACE_HIDDEN_NAME, &optname, -1);
- if (optname != NULL && strcmp(optname, name) == 0) {
- gtk_list_store_remove(GTK_LIST_STORE(gtk_tree_view_get_model(if_cb)), &optiter);
- break;
- }
- } while (gtk_tree_model_iter_next(optmodel, &optiter));
- g_free(optname);
- }
- }
- g_free(name);
- }
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- gtk_tree_selection_select_iter(sel, &iter);
- } else {
- gtk_widget_set_sensitive(name_te, FALSE);
- }
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as pipes). */
- refresh_non_local_interface_lists();
-}
-
-static void
-pipe_name_te_changed_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
- const gchar *name;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
- name = gtk_entry_get_text(GTK_ENTRY(name_te));
-
- /* if something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, name, -1);
- }
-}
-
-static void
-fill_pipe_list(void)
-{
- guint i;
- interface_t device;
- GtkTreeIter iter;
- GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (device.type == IF_PIPE) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, device.name, -1);
- } else {
- continue;
- }
- }
-}
-
-static void
-pipe_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
-{
- /* GtkWidget *pipe_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));*/
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY);
- gchar *name = NULL;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &name, -1);
- if (name) {
- if (name_te != NULL) {
- gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
- gtk_widget_set_sensitive(name_te, TRUE);
- selected_name = gtk_entry_get_text(GTK_ENTRY(name_te));
- pipe_name = g_strdup(selected_name);
- }
- if (del_bt != NULL) {
- gtk_widget_set_sensitive(del_bt, TRUE);
- }
- g_free(name);
- }
- }
-}
-
-static void
-cancel_pipe_cb (gpointer w _U_)
-{
-#ifdef HAVE_PCAP_REMOTE
- if (interface_management_w && G_IS_OBJECT(interface_management_w)) {
- GtkWidget *remote_w;
- remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
- if (remote_w != NULL && G_IS_OBJECT(remote_w))
- window_destroy(remote_w);
- }
-#endif
- window_destroy(GTK_WIDGET(interface_management_w));
- pipe_name = NULL;
-}
-
-static void
-fill_local_list(void)
-{
- guint i;
- interface_t device;
- GtkTreeIter iter;
- GtkListStore *store;
- GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
-
-#ifdef _WIN32
- store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
-#else
- store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
-#endif
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (device.local && device.type != IF_PIPE && device.type != IF_STDIN) {
- gtk_list_store_append(store, &iter);
-
-#ifdef _WIN32
- gtk_list_store_set(store, &iter, 0, device.friendly_name, 1, device.name, 2, device.hidden, -1);
-#else
- gtk_list_store_set(store, &iter, 0, device.name, 1, device.hidden, -1);
-#endif
- } else {
- continue;
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(local_l), GTK_TREE_MODEL(store));
-}
-
-static void local_hide_cb(GtkCellRendererToggle *cell _U_,
- gchar *path_str,
- gpointer data _U_)
-{
- gboolean hide, hide_enabled = TRUE;
- gchar *name;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
-
- model = gtk_tree_view_get_model(local_l);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
-
- /* See if this is the currently selected capturing device */
- if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0')) {
- guint i;
- interface_t device;
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if ((strcmp(device.display_name, prefs.capture_device) == 0) &&
- (strcmp(device.name, name) == 0)) {
- /* Don't allow current interface to be hidden */
- hide_enabled = FALSE;
- break;
- }
- }
- }
-
- if (hide_enabled) {
- if (hide) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, FALSE, -1);
- } else {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, TRUE, -1);
- }
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Default interface cannot be hidden");
- }
-}
-
-static void
-apply_local_cb(GtkWidget *win _U_, gpointer *data _U_)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *name, *new_hide;
- gboolean hide;
- gint first_if = TRUE;
- GtkTreeView *local_l;
-
- if (global_capture_opts.all_ifaces->len > 0) {
- local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
- model = gtk_tree_view_get_model(local_l);
-
- new_hide = (gchar*)g_malloc0(MAX_VAL_LEN);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
- if (!hide) {
- continue;
- } else {
- if (first_if != TRUE) {
- g_strlcat (new_hide, ",", MAX_VAL_LEN);
- }
- g_strlcat (new_hide, name, MAX_VAL_LEN);
- first_if = FALSE;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(name);
- }
- /* write new "hidden" string to preferences */
- g_free(prefs.capture_devices_hide);
- prefs.capture_devices_hide = new_hide;
- hide_interface(g_strdup(new_hide));
-
- /* Refresh all places that are displaying an interface list
- that includes local interfaces, in case we've changed
- a property of the interface list that changes how it's
- displayed. */
- refresh_local_interface_lists();
-
- /* save changes to the preferences file */
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- }
-}
-
-void
-capture_dlg_refresh_if (void)
-{
- GtkTreeView *view;
-
- if (interface_management_w)
- fill_local_list();
-
- view = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- create_and_fill_model(GTK_TREE_VIEW(view));
- update_properties_all();
-}
-
-/*
- * We've been asked to rescan the system looking for interfaces.
- */
-static void
-rescan_local_cb(GtkWidget *button _U_, gpointer *data _U_)
-{
- /* Refresh all places that are displaying an interface list
- that includes local interfaces. */
- refresh_local_interface_lists();
-}
-
-#if defined(HAVE_PCAP_REMOTE)
-static void
-fill_remote_list(void)
-{
- guint i;
- interface_t device;
- GtkTreeIter iter, child;
- gchar *host = "";
- GtkTreeView *remote_l;
- GtkTreeStore *store;
-
- num_selected = 0;
- remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
- store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (device.local) {
- continue;
- } else {
- /* fill the store */
- if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) != 0) {
- host = g_strdup(device.remote_opts.remote_host_opts.remote_host);
- gtk_tree_store_append(store, &iter, NULL);
- gtk_tree_store_set(store, &iter, 0, host, 3, "FALSE", -1);
- gtk_tree_store_append(store, &child, &iter);
- gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
- } else {
- gtk_tree_store_append(store, &child, &iter);
- gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
- }
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(remote_l), GTK_TREE_MODEL(store));
- gtk_tree_view_expand_all(GTK_TREE_VIEW(remote_l));
-}
-
-static void
-button_hide_cb(GtkTreeViewColumn *column _U_, GtkCellRenderer *renderer,
- GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
-{
- gchar *enabled;
-
- gtk_tree_model_get(model, iter, 3, &enabled, -1);
- if (strcmp(enabled, "TRUE") == 0) {
- g_object_set(G_OBJECT(renderer), "visible", TRUE, NULL);
- } else if (strcmp(enabled, "FALSE") == 0){
- g_object_set(G_OBJECT(renderer), "visible", FALSE, NULL);
- }
-}
-
-static void remote_hide_cb(GtkCellRendererToggle *cell _U_,
- gchar *path_str,
- gpointer data _U_)
-{
- gboolean hide;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
-
- model = gtk_tree_view_get_model(remote_l);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, 2, &hide, -1);
-
- if (hide) {
- gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, FALSE, -1);
- } else {
- gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, TRUE, -1);
- }
-}
-
-static void
-ok_remote_cb(GtkWidget *win _U_, gpointer *data _U_)
-{
- GtkTreeIter iter, child;
- GtkTreeModel *model;
- gchar *name, *new_hide;
- gboolean hide;
- gint first_if = TRUE;
-
- GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
- model = gtk_tree_view_get_model(remote_l);
-
- new_hide = (char *)g_malloc0(MAX_VAL_LEN);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 1, &name, 2, &hide, -1);
- if (!name && gtk_tree_model_iter_children(model, &child, &iter)) {
- do {
- gtk_tree_model_get(model, &child, 1, &name, 2, &hide, -1);
- if (!hide) {
- continue;
- } else {
- if (first_if != TRUE) {
- g_strlcat (new_hide, ",", MAX_VAL_LEN);
- }
- g_strlcat (new_hide, name, MAX_VAL_LEN);
- first_if = FALSE;
- }
- } while (gtk_tree_model_iter_next(model, &child));
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(name);
- }
- hide_interface(new_hide);
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as remote interfaces). */
- refresh_non_local_interface_lists();
-}
-
-static gboolean
-select_host_cb(GtkTreeSelection *selection _U_,
- GtkTreeModel *model,
- GtkTreePath *path,
- gboolean path_currently_selected _U_,
- gpointer data _U_)
-{
- GtkTreeIter iter;
-
- gtk_tree_model_get_iter (model, &iter, path);
- if (gtk_tree_model_iter_has_child(model, &iter)) {
- num_selected++;
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), TRUE);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static void
-remove_remote_host(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkTreeIter iter, child;
- GtkTreeModel *model;
- gchar *host;
- gint num_children, i;
- interface_t device;
- GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
- GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
-
- model = gtk_tree_view_get_model(remote_l);
- if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &host, -1);
- if ((num_children = gtk_tree_model_iter_n_children(model, &iter)) > 0) {
- for (i = num_children-1; i >= 0; i--) {
- if (gtk_tree_model_iter_nth_child(model, &child, &iter, i)) {
- gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
- }
- }
- }
- gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
- if (--num_selected == 0) {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
- }
- for (i = global_capture_opts.all_ifaces->len-1; i >= 0; i--) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (device.local) {
- continue;
- } else {
- if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) == 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- capture_opts_free_interface_t(&device);
- }
- }
- }
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as remote interfaces). */
- refresh_non_local_interface_lists();
- }
-}
-#endif
-
-static void
-show_add_interfaces_dialog(GtkWidget *bt _U_, GtkWidget *parent_win)
-{
- GtkWidget *vbox, *top_hb;
- GtkWidget *hbox, *bbox, *list_bb, *edit_fr, *pipe_fr, *pipe_sc, *pipe_l, *props_fr, *props_vb;
- GtkWidget *main_nb;
- GtkWidget *temp_page, *tmp;
- GtkWidget *pipe_hb, *pipe_bt, *pipe_lb, *pipe_te, *pipe_vb;
- GtkWidget *add_bt, *cancel_bt, *new_bt, *del_bt, *middle_hb;
- GtkWidget *local_fr, *local_l, *local_sc, *local_vb;
- GtkWidget *apply_bt, *refresh_bt;
- GtkCellRenderer *renderer, *toggle_renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- GtkListStore *store;
-#if defined(HAVE_PCAP_REMOTE)
- GtkWidget *remote_fr, *remote_l, *remote_sc, *remote_vb;
- GtkWidget *delete_bt, *add_but, *ok_but;
- GtkWidget *button_hbox, *help_hbox;
- GtkTreeSelection *selection;
-#endif
-
- if (interface_management_w != NULL && G_IS_OBJECT(interface_management_w)) {
- /* There's already a "Manage Interfaces" dialog box; reactivate it. */
- reactivate_window(interface_management_w);
- return;
- }
-
- interface_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Interface Management");
- gtk_window_set_transient_for(GTK_WINDOW(interface_management_w), GTK_WINDOW(parent_win));
- gtk_window_set_destroy_with_parent(GTK_WINDOW(interface_management_w), TRUE);
-
- gtk_window_set_default_size(GTK_WINDOW(interface_management_w), 700, 300);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(interface_management_w), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
-
- /* --- Pipes --- */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Pipes");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
-
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- /* Pipe row */
- pipe_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(pipe_hb), 5);
- gtk_box_pack_start(GTK_BOX(temp_page), pipe_hb, TRUE, TRUE, 0);
-
- /* Container for each row of widgets */
- pipe_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(pipe_vb), 0);
- gtk_box_pack_start(GTK_BOX (pipe_hb), pipe_vb, TRUE, TRUE, 0);
- gtk_widget_show(pipe_vb);
-
- /* Top row: Buttons and pipe list */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX (pipe_vb), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- edit_fr = gtk_frame_new("");
- gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
- gtk_widget_show(edit_fr);
-
- list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
- gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
- gtk_widget_show(list_bb);
-
- new_bt = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- g_signal_connect(new_bt, "clicked", G_CALLBACK(pipe_new_bt_clicked_cb), NULL);
- gtk_widget_show(new_bt);
- gtk_box_pack_start (GTK_BOX (list_bb), new_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (new_bt, "Add a new pipe (with default properties)");
-
- del_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- g_signal_connect(del_bt, "clicked", G_CALLBACK(pipe_del_bt_clicked_cb), NULL);
- gtk_widget_show(del_bt);
- gtk_widget_set_sensitive(del_bt, FALSE);
- gtk_box_pack_start (GTK_BOX (list_bb), del_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (del_bt, "Remove the selected pipe from the list");
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY, del_bt);
-
- pipe_fr = gtk_frame_new("Pipes");
- gtk_box_pack_start(GTK_BOX(top_hb), pipe_fr, TRUE, TRUE, 0);
- gtk_widget_show(pipe_fr);
-
- pipe_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pipe_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (pipe_sc), 5);
- gtk_container_add(GTK_CONTAINER(pipe_fr), pipe_sc);
- gtk_widget_show(pipe_sc);
-
- store = gtk_list_store_new(1, G_TYPE_STRING);
- pipe_l = tree_view_new(GTK_TREE_MODEL(store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pipe_l), FALSE);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(pipe_l), column);
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY, pipe_l);
- g_signal_connect(sel, "changed", G_CALLBACK(pipe_sel_list_cb), pipe_vb);
- gtk_container_add(GTK_CONTAINER(pipe_sc), pipe_l);
- gtk_widget_show(pipe_l);
-
- fill_pipe_list();
-
- g_object_unref(G_OBJECT(store));
-
- props_fr = gtk_frame_new("");
- gtk_box_pack_start(GTK_BOX(pipe_vb), props_fr, FALSE, FALSE, 0);
- gtk_widget_show(props_fr);
-
- props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
- gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
- gtk_widget_show(props_vb);
-
- middle_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (props_vb), middle_hb, TRUE, TRUE, 0);
- gtk_widget_show(middle_hb);
-
- pipe_lb = gtk_label_new("Pipe:");
- gtk_box_pack_start(GTK_BOX(middle_hb), pipe_lb, FALSE, FALSE, 3);
- pipe_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_te),
- "Enter the name of the pipe data should be captured from. "
- );
- gtk_box_pack_start(GTK_BOX(middle_hb), pipe_te, TRUE, TRUE, 3);
- gtk_widget_set_sensitive(pipe_te, FALSE);
- pipe_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_bt),
- "Select a pipe from which data should be captured, "
- "instead of entering the pipe name directly. "
- );
- gtk_box_pack_start(GTK_BOX(middle_hb), pipe_bt, FALSE, FALSE, 0);
- g_signal_connect(pipe_te, "changed", G_CALLBACK(pipe_name_te_changed_cb), NULL);
- g_signal_connect(pipe_bt, "clicked", G_CALLBACK(capture_prep_pipe_cb), pipe_te);
-
- bbox = dlg_button_row_new(GTK_STOCK_SAVE, GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
-
- add_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(add_bt, "clicked", G_CALLBACK(add_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(add_bt), "Add pipe to the list of interfaces.");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
-
- gtk_widget_show(bbox);
- gtk_widget_show(temp_page);
-
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY, pipe_te);
-
- /* --- Local interfaces --- */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Local Interfaces");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- local_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(local_vb), 0);
- gtk_box_pack_start(GTK_BOX(temp_page), local_vb, TRUE, TRUE, 0);
- gtk_widget_show(local_vb);
-
- local_fr = gtk_frame_new("Local Interfaces");
- gtk_box_pack_start(GTK_BOX(local_vb), local_fr, TRUE, TRUE, 0);
- gtk_widget_show(local_fr);
-
- local_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(local_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (local_sc), 5);
- gtk_container_add(GTK_CONTAINER(local_fr), local_sc);
- gtk_widget_show(local_sc);
-
- local_l = gtk_tree_view_new();
-
-#ifdef _WIN32
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Friendly Name", renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
-#endif
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Interface Name", renderer, "text", 0+LOCAL_OFFSET, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0+LOCAL_OFFSET);
- gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
-
- toggle_renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 1+LOCAL_OFFSET, NULL);
- g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (local_hide_cb), NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
- gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
-
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY, local_l);
- gtk_container_add(GTK_CONTAINER(local_sc), local_l);
- gtk_widget_show(local_l);
-
- fill_local_list();
-
- bbox = dlg_button_row_new(GTK_STOCK_REFRESH, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL);
-
- gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
- refresh_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_REFRESH);
- g_signal_connect(refresh_bt, "clicked", G_CALLBACK(rescan_local_cb), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(refresh_bt), "Rescan the local interfaces and refresh the list");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(GTK_WIDGET(apply_bt), "clicked", G_CALLBACK(apply_local_cb), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(apply_bt), "Apply the changes to the general list of local interfaces");
-
- gtk_widget_show(bbox);
- gtk_widget_show(temp_page);
-
-
-#if defined (HAVE_PCAP_REMOTE)
- /* --- remote interfaces --- */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Remote Interfaces");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- remote_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(remote_vb), 0);
- gtk_box_pack_start(GTK_BOX(temp_page), remote_vb, TRUE, TRUE, 0);
- gtk_widget_show(remote_vb);
-
- remote_fr = gtk_frame_new("Remote Interfaces");
- gtk_box_pack_start(GTK_BOX(remote_vb), remote_fr, TRUE, TRUE, 0);
- gtk_widget_show(remote_fr);
-
- remote_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(remote_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (remote_sc), 5);
- gtk_container_add(GTK_CONTAINER(remote_fr), remote_sc);
- gtk_widget_show(remote_sc);
-
- remote_l = gtk_tree_view_new();
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", 1, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 1);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
-
- toggle_renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 2, NULL);
- g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (remote_hide_cb), NULL);
- gtk_tree_view_column_set_cell_data_func(column, toggle_renderer, button_hide_cb, NULL, FALSE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
- gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Control", renderer, "text", 3, NULL);
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
- gtk_tree_selection_set_select_function(selection, select_host_cb, NULL, FALSE);
-
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY, remote_l);
- gtk_container_add(GTK_CONTAINER(remote_sc), remote_l);
- gtk_widget_show(remote_l);
-
- recent_remote_host_list_foreach(populate_existing_remotes, NULL);
- fill_remote_list();
-
- bbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
- gtk_widget_show(bbox);
-
- button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_end(GTK_BOX(bbox), button_hbox, FALSE, FALSE, 0);
- gtk_widget_show(button_hbox);
- gtk_box_set_spacing(GTK_BOX(button_hbox), DLG_BUTTON_SPACING);
-
- help_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(bbox), help_hbox, FALSE, FALSE, 0);
- gtk_widget_show(help_hbox);
- gtk_box_set_spacing(GTK_BOX(help_hbox), DLG_BUTTON_SPACING);
-
- add_but = ws_gtk_button_new_from_stock(GTK_STOCK_ADD);
- g_object_set_data(G_OBJECT(bbox), GTK_STOCK_ADD, add_but);
- gtk_box_pack_start(GTK_BOX(help_hbox), add_but, FALSE, FALSE, 0);
- g_signal_connect(add_but, "clicked", G_CALLBACK(show_remote_dialog), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(add_but), "Add a remote host to the list");
- gtk_widget_show(add_but);
-
- delete_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- g_object_set_data(G_OBJECT(bbox), GTK_STOCK_DELETE, delete_bt);
- gtk_box_pack_start(GTK_BOX(help_hbox), delete_bt, FALSE, FALSE, 0);
- g_signal_connect(delete_bt, "clicked", G_CALLBACK(remove_remote_host), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(delete_bt), "Remove a remote host from the list");
- gtk_widget_set_sensitive(GTK_WIDGET(delete_bt), FALSE);
- g_object_set_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY, delete_bt);
- gtk_widget_show(delete_bt);
-
- ok_but = ws_gtk_button_new_from_stock(GTK_STOCK_APPLY);
- gtk_box_pack_end(GTK_BOX(button_hbox), ok_but, FALSE, FALSE, 0);
- g_signal_connect(GTK_WIDGET(ok_but), "clicked", G_CALLBACK(ok_remote_cb), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(ok_but), "Apply the changes to the general list of local interfaces");
- gtk_widget_show(ok_but);
-
- cancel_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_end(GTK_BOX(button_hbox), cancel_bt, FALSE, FALSE, 0);
- g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
- gtk_widget_show(cancel_bt);
-
- gtk_widget_show(temp_page);
-
-#endif
- gtk_widget_show_all(interface_management_w);
-}
-
-/* show capture prepare (options) dialog */
-
-/* XXX: Warning:
- Note that capture_interface_list() is called directly (or indirectly) during the
- creation of (and changes to) the capture options dialog window.
-
- Also note that capture_interface_list() indirectly runs the gtk main loop temporarily
- to process queued events (which may include button-presses, key-presses, etc).
- (This is done while awaiting a response from dumpcap which is invoked to obtain
- the capture interface list).
- This means other Wireshark callbacks can be invoked while the capture options window
- is being created or updated (in effect an "interrupt" can occur).
-
- Needless to say, "race conditions" may occur in "interrupt" code which depends upon the exact
- state of the capture options dialog window and which may be invoked during the
- creation of (or changes to) the capture options dialog window.
-
- For example: if a user hits "Capture:Options" and then immediately hits "Capture:Start",
- capture_start_cb() may be invoked before capture_prep_cb() has been completed (i.e., during
- a call to capture_interface_list() in the code which creates the capture options window).
- capture_start_cb() depends upon certain properties of the capture options window having been
- initialized and thus fails if the properties have not (yet) been initialized.
-
- An interlock has been added to handle this particular situation;
- Ideally a more general solution should be implemented since it's probably difficult
- (if not nearly impossible) to identify all the possible "race conditions".
-
- ? Prevent the temporary running of the gtk main loop in cases wherein dumpcap is invoked for a
- simple request/reply ? (e.g., capture_interface_list()) ??
-
- ? Other ??
-*/
-
-static gboolean
-columns_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GtkWidget *menu = (GtkWidget *)data;
- GdkEventButton *event_button = NULL;
-
- /* context menu handler */
- if (event->type == GDK_BUTTON_PRESS) {
- event_button = (GdkEventButton *) event;
-
- /* To quote the "Gdk Event Structures" doc:
- * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
- if (event_button->button == 3) {
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, widget,
- event_button->button,
- event_button->time);
- g_signal_stop_emission_by_name(widget, "button_press_event");
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static void
-update_properties_all(void)
-{
- unsigned int i;
- interface_t device;
- gboolean capture_all;
- gboolean promisc_all;
- gboolean filter_all;
- gchar * filter_str;
- GtkWidget *promisc_b;
- GtkWidget *capture_b;
- GtkWidget *all_filter_te;
-
- /* If we don't have a Capture Options dialog open, there's nothing
- for us to do. */
- if (!cap_open_w)
- return;
-
- /* Determine whether all interfaces:
-
- are selected for capturing;
-
- all selected interfaces are in promiscuous mode;
-
- all selected interfaces have the same capture filter.
-
- Start out by assuming that all three are the case, and change that
- once we find an interface where it's not the case. */
- capture_all = TRUE;
- promisc_all = TRUE;
- filter_all = TRUE;
- filter_str = NULL;
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (!device.hidden) {
- if (!device.selected) {
- /* This interface isn't selected, so not all interfaces are selected. */
- capture_all = FALSE;
- } else {
- /* This interface is selected; is it in promiscuous mode? */
- if (!device.pmode) {
- /* No, so not all selected interfaces are in promiscuous mode. */
- promisc_all = FALSE;
- }
- /* Have we seen the same capture filter on all interfaces at
- which we've looked so far? */
- if (device.cfilter != NULL && filter_all) {
- /* Yes. Is this the first interface for which we've seen a
- filter? */
- if (filter_str == NULL) {
- /* First selected interface - save its capture filter;
- there aren't any filters against which to compare. */
- filter_str = g_strdup(device.cfilter);
- } else {
- /* Not the first selected interface; is its capture filter
- the same as the one the other interfaces we've looked
- at have? */
- if (strcmp(device.cfilter, filter_str) != 0) {
- /* No, so not all selected interfaces have the same capture
- filter. */
- g_free(filter_str);
- filter_str = NULL;
- filter_all = FALSE;
- }
- }
- }
- }
- }
- }
-
- /* If all interfaces are selected, check the "capture on all interfaces"
- checkbox, otherwise un-check it. */
- capture_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL);
- g_signal_handler_block(capture_b, capture_all_handler_id);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(capture_b), capture_all);
- g_signal_handler_unblock(capture_b, capture_all_handler_id);
-
- /* If all selected interfaces are in promiscuous mode, check the global
- "promiscuous mode" checkbox, otherwise un-check it. */
- promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
- g_signal_handler_block(promisc_b, promisc_all_handler_id);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), promisc_all);
- g_signal_handler_unblock(promisc_b, promisc_all_handler_id);
-
- /* If all selected interfaces have the same filter string, set the
- global filter string to it. */
- all_filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY)));
- if (filter_all) {
- /* Either no interfaces were selected, or all selected interfaces
- have the same filter. In the former case, make the global capture
- filter empty; in the latter case, make it that filter. */
- if (filter_str != NULL) {
- gtk_entry_set_text(GTK_ENTRY(all_filter_te), filter_str);
- g_free(filter_str);
- } else {
- gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
- }
- } else {
- /* Not all selected interfaces have the same filter, so there is no
- global capture filter; make it empty to reflect that. */
- gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
- }
-}
-
-
-static gboolean
-column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GtkWidget *col = (GtkWidget *) data;
- GtkTreeView *view;
- GtkWidget *menu = (GtkWidget *)g_object_get_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY);
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- g_object_set_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY, col);
- return columns_menu_handler (widget, event, menu);
-}
-
-
-void
-capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *main_vb,
- *main_hb, *left_vb, *right_vb,
- *capture_fr, *capture_vb,
- *all_hb, *all_cb,
- *promisc_cb, *pcap_ng_cb,
- *file_fr, *file_vb,
- *file_hb, *file_bt, *file_lb, *file_te,
- *multi_hb, *multi_grid, *multi_files_on_cb,
- *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
- *file_interval_cb, *file_interval_sb, *file_interval_cbx,
- *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
- *stop_files_cb, *stop_files_sb, *stop_files_lb,
- *limit_fr, *limit_vb, *limit_hb, *limit_grid,
- *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
- *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
- *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
- *display_fr, *display_vb,
- *sync_cb, *auto_scroll_cb, *hide_info_cb,
- *resolv_fr, *resolv_vb,
- *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb,
- *bbox, *close_bt,
- *all_filter_cm, *all_filter_te, *all_filter_bt, *all_filter_hb,
- *all_vb,
- *help_bt;
-#ifdef HAVE_AIRPCAP
- GtkWidget *decryption_cb;
- int err;
- gchar *err_str;
-#endif
- GtkWidget *iftype_cbx;
-
- GtkAdjustment *ringbuffer_nbf_adj,
- *stop_packets_adj, *stop_filesize_adj, *stop_duration_adj, *stop_files_adj,
- *ring_filesize_adj, *file_interval_adj;
- int row;
- guint32 value;
- gchar *cap_title;
- GtkWidget *view;
- GtkWidget *swindow;
- GtkCellRenderer *renderer;
- GtkCellRenderer *toggle_renderer;
- GtkTreeSelection *selection;
- GtkTreeViewColumn *column;
- gboolean if_present = TRUE;
- GList *all_cfilter_list, *cf_entry;
- window_geometry_t tl_geom;
- const gchar *new_cfilter;
-
- if (interfaces_dialog_window_present()) {
- destroy_if_window();
- }
- if (cap_open_w != NULL && G_IS_OBJECT(cap_open_w)) {
- /* There's already a "Capture Options" dialog box; reactivate it. */
- reactivate_window(cap_open_w);
- return;
- }
- init_columns_menu();
-
- /* use user-defined title if preference is set */
-
- cap_title = create_user_window_title("Wireshark: Capture Options");
-
- cap_open_complete = FALSE;
- cap_open_w = dlg_window_new(cap_title);
- g_free(cap_title);
-
-#ifdef HAVE_AIRPCAP
- /* update airpcap interface list */
-
- /* load the airpcap interfaces */
- g_airpcap_if_list = get_airpcap_interface_list(&err, &err_str);
-
- /* If we don't get a list don't do any thing.
- * If the error is AIRPCAP_NOT_LOADED it avoids an unnecessary rescan of the packet list
- * ( see airpcap_loader.h for error codes).
- */
- if (g_airpcap_if_list == NULL) {
- if (err == CANT_GET_AIRPCAP_INTERFACE_LIST) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
- g_free(err_str);
- }
- }else{
- decryption_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
- /* XXXX update_decryption_mode_list() triggers a rescan, should only be done if the mode is changed */
- update_decryption_mode_list(decryption_cb);
- /* select the first as default (THIS SHOULD BE CHANGED) */
- airpcap_if_active = airpcap_get_default_if(g_airpcap_if_list);
- }
-#endif
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(cap_open_w), main_vb);
-
- /* Capture-related options frame */
- capture_fr = frame_new("Capture");
- gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
-
- capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
-
- swindow = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_set_size_request(swindow, 676, 100);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
-
- view = gtk_tree_view_new ();
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (view), TRUE);
- g_signal_connect(view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)cap_open_w);
-
- toggle_renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Capture", GTK_CELL_RENDERER(toggle_renderer), "active", CAPTURE, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (toggle_callback), NULL);
- g_object_set (GTK_TREE_VIEW(view), "has-tooltip", TRUE, NULL);
- g_signal_connect (GTK_TREE_VIEW(view), "query-tooltip", G_CALLBACK (query_tooltip_tree_view_cb), NULL);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- GTK_CELL_RENDERER(renderer),
- "text", IFACE_HIDDEN_NAME,
- NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_visible(column, FALSE);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), -1, "Interface", renderer, "markup", INTERFACE, NULL);
- column = gtk_tree_view_get_column(GTK_TREE_VIEW (view), INTERFACE);
- gtk_tree_view_column_set_min_width(column, 200);
- gtk_tree_view_column_set_resizable(column, TRUE );
- gtk_tree_view_column_set_alignment(column, 0.5f);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(INTERFACE));
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("INTERFACE"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("Link-layer header", renderer, "text", LINK, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW (view),LINK), TRUE );
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(LINK));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("LINK"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_tree_view_column_set_alignment(column, 0.5f);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Prom. Mode", renderer, "text", PMODE, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- g_object_set(renderer, "xalign", 0.5f, NULL);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(PMODE));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("PMODE"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_tree_view_column_set_alignment(column, 0.5f);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Snaplen [B]", renderer, "text", SNAPLEN, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(SNAPLEN));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("SNAPLEN"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(renderer, "xalign", 0.5f, NULL);
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Buffer [MiB]", renderer, "text", BUFFER, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(BUFFER));
- gtk_tree_view_column_set_clickable(column, TRUE);
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("BUFFER"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(renderer, "xalign", 0.5f, NULL);
-#endif
-
-#if defined (HAVE_PCAP_CREATE)
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("Mon. Mode", renderer, "text", MONITOR, NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, activate_monitor, NULL, FALSE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(MONITOR));
- gtk_tree_view_column_set_clickable(column, TRUE);
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("MONITOR"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(renderer, "xalign", 0.5f, NULL);
-#endif
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", FILTER, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_alignment(column, 0.5f);
- create_and_fill_model(GTK_TREE_VIEW(view));
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(FILTER));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("FILTER"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_container_add (GTK_CONTAINER (swindow), view);
- gtk_box_pack_start(GTK_BOX(capture_vb), swindow, TRUE, TRUE, 0);
-
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY, view);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
- gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 0);
- all_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(all_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), all_vb, TRUE, TRUE, 0);
-
- all_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(all_hb), 0);
- gtk_box_pack_start(GTK_BOX(all_vb), all_hb, TRUE, TRUE, 0);
-
- left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
- gtk_box_pack_start(GTK_BOX(all_hb), left_vb, TRUE, TRUE, 0);
-
- right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
- gtk_box_pack_start(GTK_BOX(all_hb), right_vb, FALSE, FALSE, 3);
-
- all_cb = gtk_check_button_new_with_mnemonic( "Capture on all interfaces");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(all_cb), FALSE);
- capture_all_handler_id = g_signal_connect(all_cb, "toggled", G_CALLBACK(capture_all_cb), NULL);
- gtk_widget_set_tooltip_text(all_cb, "Activate the box to capture on all interfaces. "
- "Deactivate it to capture on none and set the interfaces individually.");
- gtk_box_pack_start(GTK_BOX(left_vb), all_cb, TRUE, TRUE, 0);
-
- gtk_widget_set_sensitive(GTK_WIDGET(all_cb), if_present);
- /* Promiscuous mode row */
- promisc_cb = gtk_check_button_new_with_mnemonic("Use _promiscuous mode on all interfaces");
- if (!global_capture_session.session_started) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
- } else {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), get_all_prom_mode());
- }
- promisc_all_handler_id = g_signal_connect(promisc_cb, "toggled", G_CALLBACK(promisc_mode_callback), NULL);
-
- gtk_widget_set_tooltip_text(promisc_cb,
- "Usually a network adapter will only capture the traffic sent to its own network address. "
- "If you want to capture all traffic that all network adapters can \"see\", select this option. "
- "If you want to set this option on a per-interface basis, do not select this option. "
- "Instead, select the individual checkboxes in the interface list's \"Prom. Mode\" column. "
- "See the FAQ for some more details of capturing packets from a switched network.");
- gtk_box_pack_start(GTK_BOX(left_vb), promisc_cb, TRUE, TRUE, DLG_LABEL_SPACING);
-
- iftype_cbx = gtk_button_new_with_label("Manage Interfaces");
- gtk_widget_set_tooltip_text(iftype_cbx, "Add a new interface or pipe to capture from or remove "
- "an interface from the list.");
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFTYPE_CBX_KEY, iftype_cbx);
-
- gtk_box_pack_start(GTK_BOX(right_vb), iftype_cbx, FALSE, FALSE, 0);
- g_signal_connect(iftype_cbx, "clicked", G_CALLBACK(show_add_interfaces_dialog), NULL);
- gtk_widget_show(iftype_cbx);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
- gtk_box_pack_start(GTK_BOX(main_vb), main_hb, FALSE, FALSE, 0);
-
- left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
-
- right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 0);
-
- /* Filter row */
- all_filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(all_vb), all_filter_hb, FALSE, FALSE, DLG_LABEL_SPACING);
-
- all_filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
- g_signal_connect(all_filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
- g_signal_connect(all_filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
- gtk_widget_set_tooltip_text(all_filter_bt,
- "Select a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it."
- );
- gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_bt, FALSE, FALSE, 0);
-
- /* Create the capture filter combo box*/
- all_filter_cm = gtk_combo_box_text_new_with_entry();
- g_object_set_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY, all_filter_cm);
- all_filter_te = gtk_bin_get_child(GTK_BIN(all_filter_cm));
- colorize_filter_te_as_empty(all_filter_te);
- g_signal_connect(all_filter_te, "changed", G_CALLBACK(capture_all_filter_check_syntax_cb), NULL);
- g_signal_connect(all_filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
-
- all_cfilter_list = recent_get_cfilter_list(NULL);
- for (cf_entry = all_cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
- new_cfilter = (const gchar *)cf_entry->data;
- /* If this is the default cfilter, don't put it in the list, as it'll
- be added later. */
- if (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), new_cfilter);
- }
- }
- if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), global_capture_opts.default_options.cfilter);
- gtk_combo_box_set_active(GTK_COMBO_BOX(all_filter_cm), 0);
- }
-
- gtk_widget_set_tooltip_text(all_filter_cm,
- "Enter a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it. "
- "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
- );
- gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_cm, TRUE, TRUE, DLG_BUTTON_SPACING);
-
- /* let an eventually capture filters dialog know the text entry to fill in */
- g_object_set_data(G_OBJECT(all_filter_bt), E_FILT_TE_PTR_KEY, all_filter_te);
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- all_compile_bt = gtk_button_new_with_label("Compile selected BPFs");
- g_signal_connect(all_compile_bt, "clicked", G_CALLBACK(capture_all_filter_compile_cb), NULL);
- gtk_widget_set_tooltip_text(all_compile_bt,
- "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
- /* We can't compile without any supported link-types, so disable the button in that case */
- gtk_box_pack_start(GTK_BOX(all_filter_hb), all_compile_bt, FALSE, FALSE, DLG_BUTTON_SPACING);
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
- } else {
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
- }
-#endif
-
- /* Capture file-related options frame */
- file_fr = frame_new("Capture Files");
- gtk_box_pack_start(GTK_BOX (left_vb), file_fr, TRUE, TRUE, 0);
-
- file_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(file_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(file_fr), file_vb);
-
- /* File row */
- file_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(file_vb), file_hb, FALSE, FALSE, 0);
-
- file_lb = gtk_label_new("File:");
- gtk_box_pack_start(GTK_BOX(file_hb), file_lb, FALSE, FALSE, 3);
-
- file_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(file_te,
- "Enter the file name to which captured data will be written. "
- "If you don't enter something here, a temporary file will be used."
- );
- gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 3);
-
- file_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- gtk_widget_set_tooltip_text(file_bt,
- "Select a file to which captured data will be written, "
- "instead of entering the file name directly. "
- );
- gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 0);
-
- g_signal_connect(file_bt, "clicked", G_CALLBACK(capture_prep_file_cb), file_te);
-
- /* multiple files table */
- /* XXX We want multi_grid to shrink to its minimum size horizontally
- * and be left-aligned within file_fr. Using a horizontal GtkBox works
- * in Gtk2 but not Gtk3. The situation gets sillier below with limit_fr
- * and limit_grid because we have both horizontal and vertical GtkBoxes.
- */
- multi_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(file_vb), multi_hb, FALSE, FALSE, 0);
- multi_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(multi_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(multi_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(multi_hb), multi_grid, FALSE, FALSE, 0);
- row = 0;
-
- /* multiple files row */
- multi_files_on_cb = gtk_check_button_new_with_mnemonic("Use _multiple files");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb),
- global_capture_opts.multi_files_on);
- g_signal_connect(multi_files_on_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity),
- cap_open_w);
- gtk_widget_set_tooltip_text(multi_files_on_cb,
- "Instead of using a single capture file, multiple files will be created. "
- "The generated file names will contain an incrementing number and the start time of the capture.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), multi_files_on_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- /* Pcapng row */
- pcap_ng_cb = gtk_check_button_new_with_mnemonic("Use pcapng format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), global_capture_opts.use_pcapng);
- gtk_widget_set_tooltip_text(pcap_ng_cb, "Capture packets in the next-generation capture file format. "
- "This is still experimental.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), pcap_ng_cb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
- row++;
-
- /* Ring buffer filesize row */
- ring_filesize_cb = gtk_check_button_new_with_label("Next file every");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb),
- global_capture_opts.has_autostop_filesize || !global_capture_opts.has_file_interval);
- g_signal_connect(ring_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(ring_filesize_cb,
- "If the selected file size is exceeded, capturing switches to the next file.\n"
- "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ring_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- ring_filesize_sb = gtk_spin_button_new (ring_filesize_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ring_filesize_sb), TRUE);
- gtk_widget_set_size_request(ring_filesize_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ring_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cbx, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
- gtk_adjustment_set_value(ring_filesize_adj, (gdouble) value);
-
- row++;
-
- /* Ring buffer duration row */
- file_interval_cb = gtk_check_button_new_with_label("Next file every");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_interval_cb),
- global_capture_opts.has_file_interval);
- g_signal_connect(file_interval_cb, "toggled",
- G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(file_interval_cb,
- "If the selected duration is exceeded, capturing switches to the next file.\n"
- "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_interval_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- file_interval_adj = (GtkAdjustment *)gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- file_interval_sb = gtk_spin_button_new (file_interval_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (file_interval_sb), TRUE);
- gtk_widget_set_size_request(file_interval_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_interval_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- file_interval_cbx = time_unit_combo_box_new(global_capture_opts.file_interval);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_interval_cbx, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = time_unit_combo_box_convert_value(global_capture_opts.file_interval);
- gtk_adjustment_set_value(file_interval_adj, (gdouble) value);
- row++;
-
- /* Ring buffer files row */
- ringbuffer_nbf_cb = gtk_check_button_new_with_label("Ring buffer with");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb),
- global_capture_opts.has_ring_num_files);
- g_signal_connect(ringbuffer_nbf_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(ringbuffer_nbf_cb,
- "After capturing has switched to the next file and the given number of files has exceeded, "
- "the oldest file will be removed."
- );
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ringbuffer_nbf_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.ring_num_files,
- 2/*RINGBUFFER_MIN_NUM_FILES*/, RINGBUFFER_MAX_NUM_FILES, 1.0, 10.0, 0.0);
- ringbuffer_nbf_sb = gtk_spin_button_new (ringbuffer_nbf_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ringbuffer_nbf_sb), TRUE);
- gtk_widget_set_size_request(ringbuffer_nbf_sb, 80, -1);
- g_signal_connect(ringbuffer_nbf_sb, "changed", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ringbuffer_nbf_lb = gtk_label_new("files");
- gtk_misc_set_alignment(GTK_MISC(ringbuffer_nbf_lb), 0, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_lb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- row++;
-
- /* Capture limits frame */
- limit_fr = frame_new("Stop Capture Automatically After...");
- gtk_box_pack_start(GTK_BOX (left_vb), limit_fr, TRUE, TRUE, 0);
-
- limit_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(limit_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(limit_fr), limit_vb);
-
- /* limits table */
- limit_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(limit_vb), limit_hb, FALSE, FALSE, 0);
- limit_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(limit_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(limit_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(limit_hb), limit_grid, FALSE, FALSE, 0);
- row = 0;
-
- /* Packet count row */
- stop_packets_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_packets_cb),
- global_capture_opts.has_autostop_packets);
- g_signal_connect(stop_packets_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_packets_cb, "Stop capturing after the specified number of packets have been captured.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_packets_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_packets,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_packets_sb = gtk_spin_button_new (stop_packets_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_packets_sb), TRUE);
- gtk_widget_set_size_request(stop_packets_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_packets_lb = gtk_label_new("packet(s)");
- gtk_misc_set_alignment(GTK_MISC(stop_packets_lb), 0, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_lb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- /* Filesize row */
- stop_filesize_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_filesize_cb),
- global_capture_opts.has_autostop_filesize);
- g_signal_connect(stop_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_filesize_cb, "Stop capturing after the specified amount of data has been captured.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cb, 3, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_filesize_sb = gtk_spin_button_new (stop_filesize_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_filesize_sb), TRUE);
- gtk_widget_set_size_request(stop_filesize_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_sb, 4, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cbx, 5, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
- gtk_adjustment_set_value(stop_filesize_adj, (gdouble) value);
-
- row++;
-
- /* Files row */
- stop_files_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_files_cb),
- global_capture_opts.has_autostop_files);
- g_signal_connect(stop_files_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_files_cb, "Stop capturing after the given number of \"file switches\" have been done.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_files_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_files,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_files_sb = gtk_spin_button_new (stop_files_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_files_sb), TRUE);
- gtk_widget_set_size_request(stop_files_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_files_lb = gtk_label_new("file(s)");
- gtk_misc_set_alignment(GTK_MISC(stop_files_lb), 0, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_lb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- /* Duration row */
- stop_duration_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_duration_cb),
- global_capture_opts.has_autostop_duration);
- g_signal_connect(stop_duration_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_duration_cb, "Stop capturing after the specified amount of time has passed.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cb, 3, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_duration_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_duration_sb = gtk_spin_button_new (stop_duration_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_duration_sb), TRUE);
- gtk_widget_set_size_request(stop_duration_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_sb, 4, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_duration_cbx = time_unit_combo_box_new(global_capture_opts.autostop_duration);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cbx, 5, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = time_unit_combo_box_convert_value(global_capture_opts.autostop_duration);
- gtk_adjustment_set_value(stop_duration_adj, (gdouble) value);
- row++;
-
- /* Display-related options frame */
- display_fr = frame_new("Display Options");
- gtk_box_pack_start(GTK_BOX (right_vb), display_fr, TRUE, TRUE, 0);
-
- display_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(display_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(display_fr), display_vb);
-
- /* "Update display in real time" row */
- sync_cb = gtk_check_button_new_with_mnemonic(
- "_Update list of packets in real time");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sync_cb),
- global_capture_opts.real_time_mode);
- g_signal_connect(sync_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(sync_cb,
- "Using this option will show the captured packets immediately on the main screen. "
- "Please note: this will slow down capturing, so increased packet drops might appear.");
- gtk_box_pack_start(GTK_BOX (display_vb), sync_cb, FALSE, TRUE, 0);
-
- /* "Auto-scroll live update" row */
- auto_scroll_cb = gtk_check_button_new_with_mnemonic("_Automatically scroll during live capture");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_scroll_cb), auto_scroll_live);
- gtk_widget_set_tooltip_text(auto_scroll_cb,
- "This will scroll the \"Packet List\" automatically to the latest captured packet, "
- "when the \"Update List of packets in real time\" option is used.");
- gtk_box_pack_start(GTK_BOX (display_vb), auto_scroll_cb, FALSE, TRUE, 0);
-
- /* "Hide capture info" row */
- hide_info_cb = gtk_check_button_new_with_mnemonic("_Hide capture info dialog");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hide_info_cb), !global_capture_opts.show_info);
- gtk_widget_set_tooltip_text(hide_info_cb, "Hide the capture info dialog while capturing.");
- gtk_box_pack_start(GTK_BOX (display_vb), hide_info_cb, FALSE, TRUE, 0);
-
- /* Name Resolution frame */
- resolv_fr = frame_new("Name Resolution");
- gtk_box_pack_start(GTK_BOX (right_vb), resolv_fr, TRUE, TRUE, 0);
-
- resolv_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(resolv_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(resolv_fr), resolv_vb);
-
- m_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Resolve _MAC addresses");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_resolv_cb),
- gbl_resolv_flags.mac_name);
- gtk_widget_set_tooltip_text(m_resolv_cb, "Perform MAC layer name resolution while capturing.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), m_resolv_cb, FALSE, TRUE, 0);
-
- n_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Resolve _network-layer names");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(n_resolv_cb),
- gbl_resolv_flags.network_name);
- gtk_widget_set_tooltip_text(n_resolv_cb, "Perform network layer name resolution while capturing.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), n_resolv_cb, FALSE, TRUE, 0);
-
- t_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Resolve _transport-layer name");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(t_resolv_cb),
- gbl_resolv_flags.transport_name);
- gtk_widget_set_tooltip_text(t_resolv_cb,
- "Perform transport layer name resolution while capturing.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), t_resolv_cb, FALSE, TRUE, 0);
-
- e_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Use _external network name resolver");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e_resolv_cb),
- gbl_resolv_flags.use_external_net_name_resolver);
- gtk_widget_set_tooltip_text(e_resolv_cb,
- "Use the (system's) configured name resolver (e.g., DNS) to resolve network names.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), e_resolv_cb, FALSE, TRUE, 0);
-
- /* Button row: "Start", "Cancel" and "Help" buttons */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CAPTURE_START, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_START);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(capture_start_cb), NULL);
- gtk_widget_set_tooltip_text(ok_bt, "Start the capture process.");
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
- }
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- gtk_widget_set_tooltip_text(close_bt,
- "Exit dialog.");
- window_set_cancel_button(cap_open_w, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- gtk_widget_set_tooltip_text(help_bt,
- "Show help about capturing.");
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), GUINT_TO_POINTER(HELP_CAPTURE_OPTIONS_DIALOG));
- gtk_widget_grab_default(ok_bt);
-
- /* Attach pointers to needed widgets to the capture prefs window/object */
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL, all_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL, promisc_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY, pcap_ng_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_TE_KEY, file_te);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_MULTI_FILES_ON_CB_KEY, multi_files_on_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_CB_KEY, ringbuffer_nbf_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CB_KEY, ring_filesize_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_SB_KEY, ring_filesize_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CBX_KEY, ring_filesize_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_INTERVAL_CB_KEY, file_interval_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_INTERVAL_SB_KEY, file_interval_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_INTERVAL_CBX_KEY, file_interval_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_HIDE_INFO_KEY, hide_info_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_CB_KEY, stop_packets_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_SB_KEY, stop_packets_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_LB_KEY, stop_packets_lb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CB_KEY, stop_filesize_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_SB_KEY, stop_filesize_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CBX_KEY, stop_filesize_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CB_KEY, stop_duration_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_SB_KEY, stop_duration_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CBX_KEY, stop_duration_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_CB_KEY, stop_files_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_SB_KEY, stop_files_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_LB_KEY, stop_files_lb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_E_RESOLVE_KEY, e_resolv_cb);
-
- /* Set the sensitivity of various widgets as per the settings of other
- widgets. */
- capture_prep_adjust_sensitivity(NULL, cap_open_w);
-
- update_properties_all();
- update_visible_columns_menu ();
-
- /* Catch the "activate" signal on the text
- entries, so that if the user types Return there, we act as if the
- "OK" button had been selected, as happens if Return is typed if some
- widget that *doesn't* handle the Return key has the input focus. */
- /*dlg_set_activate(gtk_bin_get_child(GTK_BIN(if_cb)), ok_bt);*/
- dlg_set_activate(file_te, ok_bt);
- dlg_set_activate(all_filter_te, ok_bt);
- gtk_widget_grab_focus(all_filter_te);
-
- g_signal_connect(cap_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(cap_open_w, "destroy", G_CALLBACK(capture_prep_destroy_cb), NULL);
-
- window_get_geometry(top_level, &tl_geom);
- gtk_window_set_default_size(GTK_WINDOW(cap_open_w), tl_geom.width * 8 / 10, -1);
-
- gtk_widget_show_all(cap_open_w);
- window_present(cap_open_w);
-
- cap_open_complete = TRUE; /* "Capture:Start" is now OK */
- global_capture_session.session_started = TRUE;
-}
-
-/* user pressed the "Start" button (in dialog or toolbar) */
-void
-capture_start_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- interface_options interface_opts;
- guint i;
- gchar * filter_str;
-
-#ifdef HAVE_AIRPCAP
- airpcap_if_active = airpcap_if_selected;
- if (airpcap_if_active)
- airpcap_set_toolbar_start_capture(airpcap_if_active);
-#endif
-
- /* XXX - will closing this remove a temporary file? */
- if(!do_file_close(&cfile, FALSE, " before starting a new capture")){
- return;
- }
- if (cap_open_w) {
- /*
- * There's an options dialog; get the values from it and close it.
- */
- gboolean success;
-
- /* Determine if "capture start" while building of the "capture options" window */
- /* is in progress. If so, ignore the "capture start. */
- /* XXX: Would it be better/cleaner for the "capture options" window code to */
- /* disable the capture start button temporarily ? */
- if (cap_open_complete == FALSE) {
- return; /* Building options window: ignore "capture start" */
- }
- success = capture_dlg_prep(cap_open_w);
- if (success)
- window_destroy(GTK_WIDGET(cap_open_w));
- if (!success)
- return; /* error in options dialog */
- }
- if (global_capture_opts.num_selected == 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "You didn't specify an interface on which to capture packets.");
- return;
- }
-
- /* everything's prepared, now it's really time to start the capture */
-
- /* XXX - we might need to init other pref data as well... */
- main_auto_scroll_live_changed(auto_scroll_live);
-
- /* XXX - can this ever happen? */
- if (global_capture_session.state != CAPTURE_STOPPED)
- return;
-
- /* close the currently loaded capture file */
- cf_close((capture_file *)global_capture_session.cf);
-
- /* Copy the selected interfaces to the set of interfaces to use for
- this capture. */
- collect_ifaces(&global_capture_opts);
-
- if (capture_start(&global_capture_opts, &global_capture_session, &global_info_data, main_window_update)) {
- /* The capture succeeded, which means the capture filters specified are
- valid; add them to the recent capture filter lists for the interfaces.
-
- If the same capture filter is used for all the selected interfaces,
- add it to the global recent capture filter list as well. */
- filter_str = NULL;
- for (i = 0; i < global_capture_opts.ifaces->len; i++) {
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
- if (interface_opts.cfilter) {
- recent_add_cfilter(interface_opts.name, interface_opts.cfilter);
- if (filter_str == NULL) {
- /* First selected interface - save its capture filter. */
- filter_str = g_strdup(interface_opts.cfilter);
- } else {
- /* Not the first selected interface; is its capture filter
- the same as the one the other interfaces we've looked
- at have? */
- if (strcmp(interface_opts.cfilter, filter_str) != 0) {
- /* No, so not all selected interfaces have the same capture filter. */
- g_free(filter_str);
- filter_str = NULL;
- }
- }
- }
- }
- if (filter_str != NULL) {
- if (filter_str[0] != '\0') {
- recent_add_cfilter(NULL, filter_str);
- }
- g_free(filter_str);
- }
- }
-}
-
-
-/* user change linktype selection;, convert to internal DLT value */
-static void
-select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_)
-{
- gpointer ptr;
- int dlt;
- interface_t device;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
- if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- device.active_dlt = dlt;
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- capture_filter_check_syntax_cb(linktype_combo_box, data);
-}
-
-/* user pressed "File" button */
-static void
-capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te)
-{
- file_selection_browse(file_bt, file_te, "Wireshark: Specify a Capture File", FILE_SELECTION_WRITE_BROWSE);
-}
-
-/* user pressed "Pipe" button */
-static void
-capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te)
-{
- file_selection_browse(pipe_bt, pipe_te, "Wireshark: Specify a Pipe", FILE_SELECTION_WRITE_BROWSE);
-}
-
-
-/* convert dialog settings into capture_opts values */
-static gboolean
-capture_dlg_prep(gpointer parent_w) {
- GtkWidget *pcap_ng_cb,
- *file_te, *multi_files_on_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_cb,
- *sync_cb, *auto_scroll_cb, *hide_info_cb,
- *stop_packets_cb, *stop_packets_sb,
- *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
- *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
- *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
- *file_interval_cb, *file_interval_sb, *file_interval_cbx,
- *stop_files_cb, *stop_files_sb,
- *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb;
- const gchar *g_save_file;
- gchar *cf_name;
- gchar *dirname;
- gint32 tmp;
-
- pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_PCAP_NG_KEY);
- file_te = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_TE_KEY);
- multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
- ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
- ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
- ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
- ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
- ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
- file_interval_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CB_KEY);
- file_interval_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_SB_KEY);
- file_interval_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CBX_KEY);
- sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
- auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
- hide_info_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_HIDE_INFO_KEY);
- stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
- stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
- stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
- stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
- stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
- stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
- stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
- stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
- stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
- stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
- m_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY);
- n_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY);
- t_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY);
- e_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_E_RESOLVE_KEY);
-
- if (global_capture_opts.num_selected == 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "You didn't specify an interface on which to capture packets.");
- return FALSE;
- }
- global_capture_opts.use_pcapng =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pcap_ng_cb));
- /* Wireshark always saves to a capture file. */
- global_capture_opts.saving_to_file = TRUE;
- g_save_file = gtk_entry_get_text(GTK_ENTRY(file_te));
- if (g_save_file && g_save_file[0]) {
- /* User specified a file to which the capture should be written. */
- global_capture_opts.save_file = g_strdup(g_save_file);
- global_capture_opts.orig_save_file = g_strdup(g_save_file);
- /* Save the directory name for future file dialogs. */
- cf_name = g_strdup(g_save_file);
- dirname = get_dirname(cf_name); /* Overwrites cf_name */
- set_last_open_dir(dirname);
- g_free(cf_name);
- } else {
- /* User didn't specify a file; save to a temporary file. */
- global_capture_opts.save_file = NULL;
- }
-
- global_capture_opts.has_autostop_packets =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb));
- if (global_capture_opts.has_autostop_packets)
- global_capture_opts.autostop_packets =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_packets_sb));
-
- global_capture_opts.has_autostop_duration =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb));
- if (global_capture_opts.has_autostop_duration) {
- global_capture_opts.autostop_duration =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_duration_sb));
- global_capture_opts.autostop_duration =
- time_unit_combo_box_get_value(stop_duration_cbx, global_capture_opts.autostop_duration);
- }
-
- global_capture_opts.real_time_mode =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb));
-
- auto_scroll_live =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb));
-
- global_capture_opts.show_info =
- !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hide_info_cb));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_resolv_cb)))
- gbl_resolv_flags.mac_name = TRUE;
- else
- gbl_resolv_flags.mac_name = FALSE;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(n_resolv_cb)))
- gbl_resolv_flags.network_name = TRUE;
- else
- gbl_resolv_flags.network_name = FALSE;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t_resolv_cb)))
- gbl_resolv_flags.transport_name = TRUE;
- else
- gbl_resolv_flags.transport_name = FALSE;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(e_resolv_cb)))
- gbl_resolv_flags.use_external_net_name_resolver = TRUE;
- else
- gbl_resolv_flags.use_external_net_name_resolver = FALSE;
-
- global_capture_opts.has_ring_num_files =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb));
-
- global_capture_opts.ring_num_files =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ringbuffer_nbf_sb));
- if (global_capture_opts.ring_num_files > RINGBUFFER_MAX_NUM_FILES)
- global_capture_opts.ring_num_files = RINGBUFFER_MAX_NUM_FILES;
-#if RINGBUFFER_MIN_NUM_FILES > 0
- else if (global_capture_opts.ring_num_files < RINGBUFFER_MIN_NUM_FILES)
- global_capture_opts.ring_num_files = RINGBUFFER_MIN_NUM_FILES;
-#endif
-
- global_capture_opts.multi_files_on =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb));
-
- global_capture_opts.has_file_interval =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb));
- if (global_capture_opts.has_file_interval) {
- global_capture_opts.file_interval =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(file_interval_sb));
- global_capture_opts.file_interval =
- time_unit_combo_box_get_value(file_interval_cbx, global_capture_opts.file_interval);
- }
-
- global_capture_opts.has_autostop_files =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb));
- if (global_capture_opts.has_autostop_files)
- global_capture_opts.autostop_files =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_files_sb));
-
- if (global_capture_opts.multi_files_on) {
- global_capture_opts.has_autostop_filesize =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb));
- if (global_capture_opts.has_autostop_filesize) {
- tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ring_filesize_sb));
- tmp = size_unit_combo_box_convert_value(ring_filesize_cbx, tmp);
- if (tmp != 0) {
- global_capture_opts.autostop_filesize = tmp;
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sMultiple files: Requested file size too large.%s\n\n"
- "The setting \"Next file every x byte(s)\" can't be greater than %u bytes (2GiB).",
- simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
- return FALSE;
- }
- }
-
- /* test if the settings are ok for a ringbuffer */
- if (global_capture_opts.save_file == NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sMultiple files: No capture file name given.%s\n\n"
- "You must specify a filename if you want to use multiple files.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- return FALSE;
- } else if (!global_capture_opts.has_autostop_filesize && !global_capture_opts.has_file_interval) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sMultiple files: No file limit given.%s\n\n"
- "You must specify a file size or interval at which is switched to the next capture file\n"
- "if you want to use multiple files.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- g_free(global_capture_opts.save_file);
- global_capture_opts.save_file = NULL;
- return FALSE;
- }
- } else {
- global_capture_opts.has_autostop_filesize =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb));
- if (global_capture_opts.has_autostop_filesize) {
- tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_filesize_sb));
- tmp = size_unit_combo_box_convert_value(stop_filesize_cbx, tmp);
- if (tmp != 0) {
- global_capture_opts.autostop_filesize = tmp;
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sStop Capture: Requested file size too large.%s\n\n"
- "The setting \"after x byte(s)\" can't be greater than %u bytes (2GiB).",
- simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
- return FALSE;
- }
- }
- } /* multi_files_on */
- return TRUE;
-}
-
-static GtkTreeModel *
-create_and_fill_model(GtkTreeView *view)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GList *list;
- char *temp, *snaplen_string, *linkname;
- guint i;
- link_row *linkr = NULL;
- interface_t device;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- gint buffer;
-#endif
- gint snaplen;
- gboolean hassnap, pmode;
-
-#if defined(HAVE_PCAP_CREATE)
- 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);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- 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);
-#else
- 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);
-#endif
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (!device.hidden) {
- if (device.no_addresses == 0) {
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- } else {
- temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
- }
- set_active_dlt(&device, global_capture_opts.default_options.linktype);
- linkname = NULL;
- for (list = device.links; list != NULL; list = g_list_next(list)) {
- linkr = (link_row*)(list->data);
- if (linkr->dlt == device.active_dlt) {
- linkname = g_strdup(linkr->name);
- break;
- }
- }
- if (!linkname)
- linkname = g_strdup("unknown");
- if (capture_dev_user_pmode_find(device.name, &pmode)) {
- device.pmode = pmode;
- }
- if (capture_dev_user_snaplen_find(device.name, &hassnap, &snaplen)) {
- /* Default snap length set in preferences */
- device.snaplen = snaplen;
- device.has_snaplen = hassnap;
- } else {
- /* No preferences set yet, use default values */
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- device.has_snaplen = FALSE;
- }
-
- snaplen_string = g_strdup_printf("%d", device.snaplen);
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if (capture_dev_user_buffersize_find(device.name) != -1) {
- buffer = capture_dev_user_buffersize_find(device.name);
- device.buffer = buffer;
- } else {
- device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
- }
-#endif
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- gtk_list_store_append (store, &iter);
-#if defined(HAVE_PCAP_CREATE)
- 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);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- 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);
-#else
- 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);
-#endif
- g_free(linkname);
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
- return GTK_TREE_MODEL(store);
-}
-
-static gboolean
-query_tooltip_tree_view_cb (GtkWidget *widget,
- gint x,
- gint y,
- gboolean keyboard_tip,
- GtkTooltip *tooltip,
- gpointer data _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
- GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
- GtkTreePath *path = NULL;
- gchar *tmp;
- GtkTreeViewColumn *column;
- GtkCellRenderer* renderer = NULL;
- GList *renderer_list;
- gint idx;
-
- char buffer[512];
-
- if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
- return FALSE;
-
- gtk_tree_model_get (model, &iter, 0, &tmp, -1);
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), (gint) x, (gint) y, NULL, &column, NULL, NULL)) {
- idx = col_title_to_index((const gchar *)gtk_tree_view_column_get_title(column));
-
- switch (idx)
- {
- case CAPTURE: g_snprintf (buffer, sizeof(buffer), "Choose which interface (network adapter) will be used to capture packets from. "
- "Be sure to select the correct one, as it's a common mistake to select the wrong interface.");
- break;
- case INTERFACE: g_snprintf (buffer, sizeof(buffer), "Lists the interface name and the IP address(es) assigned to it. ");
- break;
- case LINK: g_snprintf (buffer, sizeof(buffer), "Link-layer type the interface supports.");
- break;
- case PMODE: g_snprintf (buffer, sizeof(buffer), "Usually a network adapter will only capture the traffic sent to its own network address. "
- "If you want to capture all traffic that the network adapter can \"see\", promiscuous mode should be configured.");
- break;
- case SNAPLEN: g_snprintf(buffer, sizeof(buffer), "Limit the maximum number of bytes to be captured from each packet. This size includes the "
- "link-layer header and all subsequent headers.");
- break;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
- "If you notice packet drops, you can try increasing this size.");
- break;
-#endif
-#if defined(HAVE_PCAP_CREATE)
- case MONITOR: g_snprintf (buffer, sizeof(buffer), "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture "
- "the traffic on the BSS to which it's associated. "
- "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", select this option. "
- "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
- "it might be necessary to turn this option on.\n\n"
- "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
- break;
-#endif
- case FILTER: g_snprintf(buffer, sizeof(buffer), "Selected capture filter to reduce the amount of packets to be captured.");
- break;
- default: g_snprintf(buffer, sizeof(buffer), "another option");
- }
-
- gtk_tooltip_set_markup (tooltip, buffer);
- renderer_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
- /* get the first renderer */
- if (g_list_first(renderer_list)) {
- renderer = (GtkCellRenderer*)g_list_nth_data(renderer_list, 0);
- gtk_tree_view_set_tooltip_cell (tree_view, tooltip, path, column, renderer);
- }
- }
- gtk_tree_path_free (path);
-
- return TRUE;
-}
-
-#if defined (HAVE_PCAP_CREATE)
-static void
-activate_monitor(GtkTreeViewColumn *tree_column _U_, GtkCellRenderer *renderer,
- GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data _U_)
-{
- interface_t device;
- GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
- int indx = 0;
-
- if (gtk_tree_path_get_depth(path) == 0) {
- indx = 0;
- } else {
- indx = gtk_tree_path_get_indices(path)[0];
- }
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
-
- if (device.monitor_mode_supported == TRUE) {
- g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
- } else {
- g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_INERT, NULL);
- }
-}
-#endif
-
-/* user requested to destroy the dialog */
-static void
-capture_prep_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- GtkWidget *fs;
-#ifdef HAVE_PCAP_REMOTE
- GList *if_list;
-#endif
-
- if (!cap_open_w || !G_IS_OBJECT(cap_open_w))
- return;
- /* Is there a file selection dialog associated with this
- Capture Options dialog? */
- fs = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_FILE_SEL_DIALOG_PTR_KEY);
-
-#ifdef HAVE_PCAP_REMOTE
- if_list = (GList *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY);
- if (if_list && g_list_length(if_list)>0) {
- free_interface_list(if_list);
- }
-#endif
-
- if (fs != NULL && G_IS_OBJECT(fs)) {
- /* Yes. Destroy it. */
- window_destroy(fs);
- }
-
- /* Note that we no longer have a "Capture Options" dialog box. */
- cap_open_w = NULL;
-
-#ifdef HAVE_AIRPCAP
- /* update airpcap toolbar */
- if (airpcap_if_active)
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
-#endif
-}
-
-
-#ifdef HAVE_PCAP_CREATE
-/* user changed the setting of the monitor-mode checkbox */
-static void
-capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp _U_)
-{
- GList *lt_entry;
- gchar *if_string;
- gboolean monitor_mode;
- if_capabilities_t *caps;
- gint linktype_count = 0, i;
- data_link_info_t *data_link_info;
- interface_t device;
- link_row *linkr;
- GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
- GtkWidget *linktype_lb = (GtkWidget *)g_object_get_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY);
- gchar *auth_str = NULL;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
-
-
- if_string = g_strdup(device.name);
- monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor));
-#ifdef HAVE_PCAP_REMOTE
- if (device.remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD) {
- auth_str = g_strdup_printf("%s:%s", device.remote_opts.remote_host_opts.auth_username,
- device.remote_opts.remote_host_opts.auth_password);
- }
-#endif
- caps = capture_get_if_capabilities(if_string, monitor_mode, auth_str, NULL, main_window_update);
- g_free(auth_str);
-
- if (caps != NULL) {
- g_signal_handlers_disconnect_by_func(linktype_combo_box, G_CALLBACK(select_link_type_cb), NULL );
- ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box));
- for (i = (gint)g_list_length(device.links)-1; i >= 0; i--) {
- GList* rem = g_list_nth(device.links, i);
- device.links = g_list_remove_link(device.links, rem);
- g_list_free_1(rem);
- }
- device.active_dlt = -1;
- linktype_count = 0;
- device.monitor_mode_supported = caps->can_set_rfmon;
- device.monitor_mode_enabled = monitor_mode;
- for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
- linkr = (link_row *)g_malloc(sizeof(link_row));
- data_link_info = (data_link_info_t *)lt_entry->data;
- /*
- * For link-layer types libpcap/WinPcap doesn't know about, the
- * name will be "DLT n", and the description will be null.
- * We mark those as unsupported, and don't allow them to be
- * used - capture filters won't work on them, for example.
- */
- if (data_link_info->description != NULL) {
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
- data_link_info->description,
- GINT_TO_POINTER(data_link_info->dlt));
- linkr->dlt = data_link_info->dlt;
- if (linktype_count == 0) {
- device.active_dlt = data_link_info->dlt;
- }
- linkr->name = g_strdup(data_link_info->description);
- } else {
- gchar *str;
- /* XXX - should we just omit them? */
- str = g_strdup_printf("%s (not supported)", data_link_info->name);
- ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
- NULL,
- str,
- GINT_TO_POINTER(-1), /* Flag as "not supported" */
- FALSE);
- linkr->dlt = -1;
- linkr->name = g_strdup(str);
- g_free(str);
- }
- device.links = g_list_append(device.links, linkr);
- linktype_count++;
- }
- free_if_capabilities(caps);
- } else {
- /* We don't know whether this supports monitor mode or not;
- don't ask for monitor mode. */
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
- }
- gtk_widget_set_sensitive(linktype_lb, linktype_count >= 2);
- gtk_widget_set_sensitive(linktype_combo_box, linktype_count >= 2);
- ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),0);
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
-}
-#endif
-
-/*
- * Adjust the sensitivity of various widgets as per the current setting
- * of other widgets.
- */
-static void
-capture_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
-{
- GtkWidget *multi_files_on_cb, *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
- *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
- *file_interval_cb, *file_interval_sb, *file_interval_cbx,
- *sync_cb, *auto_scroll_cb,
- *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
- *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
- *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
- *stop_files_cb, *stop_files_sb, *stop_files_lb;
-
- multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
- ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
- ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
- ringbuffer_nbf_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_LB_KEY);
- ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
- ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
- ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
- file_interval_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CB_KEY);
- file_interval_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_SB_KEY);
- file_interval_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CBX_KEY);
- sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
- auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
- stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
- stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
- stop_packets_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_LB_KEY);
- stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
- stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
- stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
- stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
- stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
- stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
- stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
- stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
- stop_files_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_LB_KEY);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb))) {
- /* "Update list of packets in real time" captures enabled; we don't
- support ring buffer mode for those captures, so turn ring buffer
- mode off if it's on, and make its toggle button, and the spin
- button for the number of ring buffer files (and the spin button's
- label), insensitive. */
-#if 0
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), FALSE);
-#endif
-
- /* Auto-scroll mode is meaningful only in "Update list of packets
- in real time" captures, so make its toggle button sensitive. */
- gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), TRUE);
-
- /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), TRUE);*/
- } else {
- /* "Update list of packets in real time" captures disabled; that
- means ring buffer mode is OK, so make its toggle button
- sensitive. */
-/* gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), TRUE);*/
-
- /* Auto-scroll mode is meaningful only in "Update list of packets
- in real time" captures, so make its toggle button insensitive. */
- gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), FALSE);
-
- /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), FALSE);*/
- }
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb))) {
- /* Ring buffer mode enabled. */
-
- /* Force at least one of the "file switch" conditions (we need at least one) */
- if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)) == FALSE) &&
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb)) == FALSE)) {
- if (tb == ring_filesize_cb)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_interval_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb), TRUE);
- }
-
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
-
- /* The ring filesize spinbox is sensitive if the "Next capture file
- after N kilobytes" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
-
- /* The ring interval spinbox is sensitive if the "Next capture file
- after N seconds" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb)));
-
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx), FALSE);
-
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
- } else {
- /* Ring buffer mode disabled. */
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), FALSE);
-
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),FALSE);
-
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_sb),FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cbx),FALSE);
-
- /* The maximum file size spinbox is sensitive if the "Stop capture
- after N kilobytes" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
-
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb), FALSE);
- }
-
- /* The maximum packet count spinbox is sensitive if the "Stop capture
- after N packets" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_lb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
-
- /* The capture duration spinbox is sensitive if the "Stop capture
- after N seconds" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
-}
-
-gboolean capture_dlg_window_present(void)
-{
- return (cap_open_w?TRUE:FALSE);
-}
-
-/*
- * Refresh everything visible that shows an interface list that
- * includes local interfaces.
- */
-void
-refresh_local_interface_lists(void)
-{
- /* Reload the local interface list. */
- scan_local_interfaces(main_window_update);
-
- /* If there's an interfaces dialog up, refresh it. */
- if (interfaces_dialog_window_present())
- refresh_if_window();
-
- /* If there's a capture options dialog up, refresh it. */
- if (capture_dlg_window_present())
- capture_dlg_refresh_if();
-
- /* If the welcome screen is up, refresh its interface list. */
- if (get_welcome_window() != NULL)
- welcome_if_panel_reload();
-
- /* Refresh the 802.11 toolbar. */
- tb80211_refresh_interfaces();
-}
-
-/*
- * Refresh everything visible that shows an interface list that
- * includes non-local interfaces.
- */
-void
-refresh_non_local_interface_lists(void)
-{
- /* If there's a capture options dialog up, refresh it. */
- if (capture_dlg_window_present())
- capture_dlg_refresh_if();
-
- /* If the welcome screen is up, refresh its interface list. */
- if (get_welcome_window() != NULL)
- welcome_if_panel_reload();
-}
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */