summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--capture_opts.c93
-rw-r--r--gtk/capture_dlg.c93
-rw-r--r--gtk/main.c63
-rw-r--r--gtk/main_welcome.c4
4 files changed, 145 insertions, 108 deletions
diff --git a/capture_opts.c b/capture_opts.c
index af631d0ae3..a28e8b18f2 100644
--- a/capture_opts.c
+++ b/capture_opts.c
@@ -441,6 +441,7 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str
int err;
gchar *err_str;
interface_options interface_opts;
+ gboolean found = FALSE;
/*
@@ -451,6 +452,21 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str
* names that begin with digits. It can be useful on Windows, where
* more than one interface can have the same name.
*/
+ if_list = capture_interface_list(&err, &err_str);
+ if (if_list == NULL) {
+ switch (err) {
+
+ case CANT_GET_INTERFACE_LIST:
+ cmdarg_err("%s", err_str);
+ g_free(err_str);
+ break;
+
+ case NO_INTERFACES_FOUND:
+ cmdarg_err("There are no interfaces on which a capture can be done");
+ break;
+ }
+ return 2;
+ }
adapter_index = strtol(optarg_str_p, &p, 10);
if (p != NULL && *p == '\0') {
if (adapter_index < 0) {
@@ -466,63 +482,66 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str
cmdarg_err("There is no interface with that adapter index");
return 1;
}
- if_list = capture_interface_list(&err, &err_str);
- if (if_list == NULL) {
- switch (err) {
- case CANT_GET_INTERFACE_LIST:
- cmdarg_err("%s", err_str);
- g_free(err_str);
- break;
-
- case NO_INTERFACES_FOUND:
- cmdarg_err("There are no interfaces on which a capture can be done");
- break;
- }
- return 2;
- }
if_info = (if_info_t *)g_list_nth_data(if_list, adapter_index - 1);
if (if_info == NULL) {
cmdarg_err("There is no interface with that adapter index");
return 1;
}
+ found = TRUE;
interface_opts.name = g_strdup(if_info->name);
/* We don't set iface_descr here because doing so requires
* capture_ui_utils.c which requires epan/prefs.c which is
* probably a bit too much dependency for here...
*/
- free_interface_list(if_list);
} else {
- interface_opts.name = g_strdup(optarg_str_p);
+ GList *curr;
+
+ for (curr = g_list_first(if_list); curr; curr = g_list_next(curr)) {
+ if_info = curr->data;
+ if (strcmp(if_info->name, optarg_str_p) == 0) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (found) {
+ interface_opts.name = g_strdup(optarg_str_p);
+ }
}
- interface_opts.descr = g_strdup(capture_opts->default_options.descr);
- interface_opts.cfilter = g_strdup(capture_opts->default_options.cfilter);
- interface_opts.snaplen = capture_opts->default_options.snaplen;
- interface_opts.has_snaplen = capture_opts->default_options.has_snaplen;
- interface_opts.linktype = capture_opts->default_options.linktype;
- interface_opts.promisc_mode = capture_opts->default_options.promisc_mode;
+ free_interface_list(if_list);
+ if (found) {
+ interface_opts.descr = g_strdup(capture_opts->default_options.descr);
+ interface_opts.cfilter = g_strdup(capture_opts->default_options.cfilter);
+ interface_opts.snaplen = capture_opts->default_options.snaplen;
+ interface_opts.has_snaplen = capture_opts->default_options.has_snaplen;
+ interface_opts.linktype = capture_opts->default_options.linktype;
+ interface_opts.promisc_mode = capture_opts->default_options.promisc_mode;
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
- interface_opts.buffer_size = capture_opts->default_options.buffer_size;
+ interface_opts.buffer_size = capture_opts->default_options.buffer_size;
#endif
- interface_opts.monitor_mode = capture_opts->default_options.monitor_mode;
+ interface_opts.monitor_mode = capture_opts->default_options.monitor_mode;
#ifdef HAVE_PCAP_REMOTE
- interface_opts.src_type = capture_opts->default_options.src_type;
- interface_opts.remote_host = g_strdup(capture_opts->default_options.remote_host);
- interface_opts.remote_port = g_strdup(capture_opts->default_options.remote_port);
- interface_opts.auth_type = capture_opts->default_options.auth_type;
- interface_opts.auth_username = g_strdup(capture_opts->default_options.auth_username);
- interface_opts.auth_password = g_strdup(capture_opts->default_options.auth_password);
- interface_opts.datatx_udp = capture_opts->default_options.datatx_udp;
- interface_opts.nocap_rpcap = capture_opts->default_options.nocap_rpcap;
- interface_opts.nocap_local = capture_opts->default_options.nocap_local;
+ interface_opts.src_type = capture_opts->default_options.src_type;
+ interface_opts.remote_host = g_strdup(capture_opts->default_options.remote_host);
+ interface_opts.remote_port = g_strdup(capture_opts->default_options.remote_port);
+ interface_opts.auth_type = capture_opts->default_options.auth_type;
+ interface_opts.auth_username = g_strdup(capture_opts->default_options.auth_username);
+ interface_opts.auth_password = g_strdup(capture_opts->default_options.auth_password);
+ interface_opts.datatx_udp = capture_opts->default_options.datatx_udp;
+ interface_opts.nocap_rpcap = capture_opts->default_options.nocap_rpcap;
+ interface_opts.nocap_local = capture_opts->default_options.nocap_local;
#endif
#ifdef HAVE_PCAP_SETSAMPLING
- interface_opts.sampling_method = capture_opts->default_options.sampling_method;
- interface_opts.sampling_param = capture_opts->default_options.sampling_param;
+ interface_opts.sampling_method = capture_opts->default_options.sampling_method;
+ interface_opts.sampling_param = capture_opts->default_options.sampling_param;
#endif
- g_array_append_val(capture_opts->ifaces, interface_opts);
-
+ g_array_append_val(capture_opts->ifaces, interface_opts);
+ } else {
+ cmdarg_err("There is no interface with that name (%s)", optarg_str_p);
+ return 1;
+ }
+
return 0;
}
diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c
index fa7a193988..fd23e488c9 100644
--- a/gtk/capture_dlg.c
+++ b/gtk/capture_dlg.c
@@ -245,7 +245,7 @@ capture_get_cap_settings (gchar *if_name)
cap_settings = *cap_settings_p;
} else {
cap_settings.monitor_mode = prefs_capture_device_monitor_mode(if_name);
- cap_settings.linktype = capture_dev_user_linktype_find(if_name);;
+ cap_settings.linktype = capture_dev_user_linktype_find(if_name);
}
return cap_settings;
@@ -1678,7 +1678,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
GtkAdjustment *snap_adj, *ringbuffer_nbf_adj,
*stop_packets_adj, *stop_filesize_adj, *stop_duration_adj, *stop_files_adj,
*ring_filesize_adj, *file_duration_adj;
- GList *if_list = NULL, *combo_list, *cfilter_list, *if_entry;
+ GList *if_list = NULL, *combo_list, *cfilter_list;
int row;
int err;
gchar *err_str = NULL;
@@ -1741,11 +1741,11 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
if_info = g_list_first(if_list)->data;
interface_opts.name = g_strdup(if_info->name);
interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
- interface_opts.linktype = capture_dev_user_linktype_find(interface_opts.name);
+ interface_opts.linktype = capture_dev_user_linktype_find(interface_opts.name);
interface_opts.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen;
interface_opts.snaplen = global_capture_opts.default_options.snaplen;
- cap_settings = capture_get_cap_settings (interface_opts.name);;
+ cap_settings = capture_get_cap_settings (interface_opts.name);
interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode;
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
interface_opts.buffer_size = global_capture_opts.default_options.buffer_size;
@@ -1767,10 +1767,10 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
interface_opts.sampling_param = global_capture_opts.default_options.sampling_param;
#endif
g_array_append_val(global_capture_opts.ifaces, interface_opts);
- }
+ }
}
#ifdef HAVE_PCAP_REMOTE
- if (interface_opts.src_type == CAPTURE_IFREMOTE) {
+ if (global_capture_opts.ifaces->len > 0 && interface_opts.src_type == CAPTURE_IFREMOTE) {
if_list = get_remote_interface_list(interface_opts.remote_host,
interface_opts.remote_port,
interface_opts.auth_type,
@@ -1849,28 +1849,8 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
gtk_box_pack_start(GTK_BOX(if_hb), iftype_cbx, FALSE, FALSE, 0);
#endif
- if (interface_opts.name == NULL && prefs.capture_device != NULL) {
- /* No interface was specified on the command line or in a previous
- capture, but there is one specified in the preferences file;
- make the one from the preferences file the default */
- if_device = g_strdup(prefs.capture_device);
- for (if_entry = if_list; if_entry != NULL; if_entry = g_list_next(if_entry)) {
- if_info = (if_info_t*)if_entry->data;
- if (strcmp(if_info->name, get_if_name(if_device)) == 0) {
- interface_opts.name = g_strdup(get_if_name(if_device));
- /* Warning: see capture_prep_cb() */
- /* XXX: Could the following code be changed to use the if_list obtained above instead */
- /* of maybe calling capture_interface_list() again ? */
- interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
- break;
- }
- }
- g_free(if_device);
- if_device = NULL;
- }
-
/* If we have a prefered interface, get the string to compare with to select the active text*/
- if (interface_opts.name != NULL) {
+ if (global_capture_opts.ifaces->len > 0 && interface_opts.name != NULL) {
if_device = build_capture_combo_name(if_list, interface_opts.name);
}
#if GTK_CHECK_VERSION(2,24,0)
@@ -1912,13 +1892,14 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
#ifdef HAVE_AIRPCAP
/* get the airpcap interface (if it IS an airpcap interface, and update the
toolbar... and of course enable the advanced button...)*/
- airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list,interface_opts.name);
+ if (global_capture_opts.ifaces->len >= 0)
+ airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list,interface_opts.name);
#endif
free_capture_combo_list(combo_list);
#ifdef HAVE_PCAP_REMOTE
/* Only delete if fetched local */
- if (interface_opts.src_type == CAPTURE_IFLOCAL)
+ if (global_capture_opts.ifaces->len >= 0 && interface_opts.src_type == CAPTURE_IFLOCAL)
#endif
free_interface_list(if_list);
gtk_widget_set_tooltip_text(if_cb,
@@ -1997,8 +1978,13 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
/* 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),
+ if (global_capture_opts.ifaces->len > 0) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
interface_opts.promisc_mode);
+ } else {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
+ global_capture_opts.default_options.promisc_mode);
+ }
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. "
@@ -2009,10 +1995,15 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
/* 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),
+ if (global_capture_opts.ifaces->len > 0) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb),
interface_opts.monitor_mode);
- g_signal_connect(monitor_cb, "toggled",
+ g_signal_connect(monitor_cb, "toggled",
G_CALLBACK(capture_prep_monitor_changed_cb), NULL);
+ } else {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb),
+ global_capture_opts.default_options.monitor_mode);
+ }
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. "
@@ -2034,12 +2025,14 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
* you have it, the monitor mode checkbox. That's why we do this
* now.
*/
- global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0);
- /* To keep consistency, the status has to be stored */
- g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts);
- set_if_capabilities(FALSE);
+ if (global_capture_opts.ifaces->len > 0) {
+ global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0);
+ /* To keep consistency, the status has to be stored */
+ g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts);
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0);
+ set_if_capabilities(FALSE);
+ interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0);
+ }
/* Pcap-NG row */
pcap_ng_cb = gtk_check_button_new_with_mnemonic("Capture packets in pcap-ng format");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), global_capture_opts.use_pcapng);
@@ -2105,7 +2098,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
#endif
}
}
- if (g_array_index(global_capture_opts.ifaces, interface_options, 0).cfilter)
+ if (global_capture_opts.ifaces->len > 0 && g_array_index(global_capture_opts.ifaces, interface_options, 0).cfilter)
#if GTK_CHECK_VERSION(2,24,0)
gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), g_array_index(global_capture_opts.ifaces, interface_options, 0).cfilter);
#else
@@ -2170,11 +2163,17 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
buffer_size_hb = gtk_hbox_new(FALSE, 3);
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) interface_opts.buffer_size,
- 1, 65535, 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) interface_opts.buffer_size);
+ if (global_capture_opts.ifaces->len > 0) {
+ buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) interface_opts.buffer_size,
+ 1, 65535, 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) interface_opts.buffer_size);
+ } else {
+ buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.default_options.buffer_size,
+ 1, 65535, 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) global_capture_opts.default_options.buffer_size);
+ }
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,
@@ -2503,9 +2502,11 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
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);
-
- global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0);
- g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts);
+
+ if (global_capture_opts.ifaces->len > 0) {
+ global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0);
+ g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts);
+ }
gtk_widget_grab_default(ok_bt);
/* Attach pointers to needed widgets to the capture prefs window/object */
diff --git a/gtk/main.c b/gtk/main.c
index 11f4a4673e..260ddf134e 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -2770,35 +2770,52 @@ main(int argc, char *argv[])
#endif
if ((global_capture_opts.ifaces->len == 0) &&
(prefs.capture_device != NULL)) {
- interface_options interface_opts;
-
- interface_opts.name = g_strdup(get_if_name(prefs.capture_device));
- interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
- interface_opts.monitor_mode = prefs_capture_device_monitor_mode(interface_opts.name);
- interface_opts.linktype = capture_dev_user_linktype_find(interface_opts.name);
- interface_opts.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
- interface_opts.snaplen = global_capture_opts.default_options.snaplen;
- interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen;
- interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode;
+ gboolean found = FALSE;
+ if_list = capture_interface_list(&err, NULL);
+ if (g_list_length(if_list) > 0) {
+ GList *curr;
+ if_info_t *if_info;
+
+ for (curr = g_list_first(if_list); curr; curr = g_list_next(curr)) {
+ if_info = curr->data;
+ if (strcmp(if_info->name, prefs.capture_device) == 0) {
+ found = TRUE;
+ break;
+ }
+ }
+ free_interface_list(if_list);
+ }
+ if (found) {
+ interface_options interface_opts;
+
+ interface_opts.name = g_strdup(get_if_name(prefs.capture_device));
+ interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
+ interface_opts.monitor_mode = prefs_capture_device_monitor_mode(interface_opts.name);
+ interface_opts.linktype = capture_dev_user_linktype_find(interface_opts.name);
+ interface_opts.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
+ interface_opts.snaplen = global_capture_opts.default_options.snaplen;
+ interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen;
+ interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode;
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
- interface_opts.buffer_size = global_capture_opts.default_options.buffer_size;
+ interface_opts.buffer_size = global_capture_opts.default_options.buffer_size;
#endif
#ifdef HAVE_PCAP_REMOTE
- interface_opts.src_type = global_capture_opts.default_options.src_type;
- interface_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
- interface_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
- interface_opts.auth_type = global_capture_opts.default_options.auth_type;
- interface_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
- interface_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
- interface_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
- interface_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
- interface_opts.nocap_local = global_capture_opts.default_options.nocap_local;
+ interface_opts.src_type = global_capture_opts.default_options.src_type;
+ interface_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
+ interface_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
+ interface_opts.auth_type = global_capture_opts.default_options.auth_type;
+ interface_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
+ interface_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
+ interface_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
+ interface_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
+ interface_opts.nocap_local = global_capture_opts.default_options.nocap_local;
#endif
#ifdef HAVE_PCAP_SETSAMPLING
- interface_opts.sampling_method = global_capture_opts.default_options.sampling_method;
- interface_opts.sampling_param = global_capture_opts.default_options.sampling_param;
+ interface_opts.sampling_method = global_capture_opts.default_options.sampling_method;
+ interface_opts.sampling_param = global_capture_opts.default_options.sampling_param;
#endif
- g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts);
+ g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts);
+ }
}
#endif
diff --git a/gtk/main_welcome.c b/gtk/main_welcome.c
index 5d3cef327b..51f7c06ec6 100644
--- a/gtk/main_welcome.c
+++ b/gtk/main_welcome.c
@@ -92,6 +92,7 @@ static GtkWidget *welcome_file_panel_vb = NULL;
#ifdef HAVE_LIBPCAP
static GtkWidget *welcome_if_panel_vb = NULL;
static GtkWidget *if_view = NULL;
+static GtkWidget *swindow;
#endif
static GSList *status_messages = NULL;
@@ -821,7 +822,7 @@ select_ifaces(void)
GtkTreeModel *model;
GtkTreeSelection *entry;
- if (global_capture_opts.ifaces->len > 0) {
+ if (global_capture_opts.ifaces->len > 0 && swindow) {
view = g_object_get_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES);
model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
entry = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
@@ -988,7 +989,6 @@ welcome_new(void)
DWORD ce_size = sizeof(chimney_enabled);
#endif
#ifdef HAVE_LIBPCAP
- GtkWidget *swindow;
GtkTreeSelection *selection;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;