aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2010-03-04 01:12:04 +0000
committerGuy Harris <guy@alum.mit.edu>2010-03-04 01:12:04 +0000
commit167ab3a98c4583344f8b95d81b079b7a5df7e5ff (patch)
treec2af1e714cc510427cdd87a9b63979038cfc40ac /gtk
parent98d800bae8939f6edaf4aa54f02787148da48c0f (diff)
In Wireshark and TShark, run dumpcap to get interface lists and lists of
link-layer header types for interfaces; if special privileges are necessary to open capture devices, Wireshark and TShark shouldn't have those privileges, but dumpcap should. svn path=/trunk/; revision=32104
Diffstat (limited to 'gtk')
-rw-r--r--gtk/capture_dlg.c22
-rw-r--r--gtk/capture_if_dlg.c97
-rw-r--r--gtk/capture_if_dlg.h2
-rw-r--r--gtk/prefs_capture.c3
4 files changed, 88 insertions, 36 deletions
diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c
index 5905ba0f84..e029fb8efd 100644
--- a/gtk/capture_dlg.c
+++ b/gtk/capture_dlg.c
@@ -46,6 +46,7 @@
#include "../capture.h"
#include "../globals.h"
#include "../capture_errs.h"
+#include "../capture_ifinfo.h"
#include "../simple_dialog.h"
#include "../capture-pcap-util.h"
#include "../capture_ui_utils.h"
@@ -263,8 +264,8 @@ set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry)
GtkWidget *if_ip_lb;
GString *ip_str = g_string_new("IP address: ");
int ips = 0;
- GSList *curr_ip;
- if_addr_t *ip_addr;
+ GSList *curr_addr;
+ if_addr_t *addr;
#ifdef HAVE_PCAP_REMOTE
GtkWidget *iftype_cbx;
int iftype;
@@ -344,25 +345,26 @@ set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry)
lt_list = capture_pcap_linktype_list(if_name, NULL);
/* create string of list of IP addresses of this interface */
- for (; (curr_ip = g_slist_nth(if_info->ip_addr, ips)) != NULL; ips++) {
+ for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) {
if (ips != 0)
g_string_append(ip_str, ", ");
- ip_addr = (if_addr_t *)curr_ip->data;
- switch (ip_addr->type) {
+ addr = (if_addr_t *)curr_addr->data;
+ switch (addr->ifat_type) {
- case AT_IPv4:
+ case IF_AT_IPv4:
g_string_append(ip_str,
- ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr));
+ ip_to_str((guint8 *)&addr->addr.ip4_addr));
break;
- case AT_IPv6:
+ case IF_AT_IPv6:
g_string_append(ip_str,
- ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr));
+ ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr));
break;
default:
- g_assert_not_reached();
+ /* In case we add non-IP addresses */
+ break;
}
}
diff --git a/gtk/capture_if_dlg.c b/gtk/capture_if_dlg.c
index ef3b676afa..2604485a1f 100644
--- a/gtk/capture_if_dlg.c
+++ b/gtk/capture_if_dlg.c
@@ -40,10 +40,11 @@
#include <epan/prefs.h>
#include "../globals.h"
-#include "../capture-pcap-util.h"
+#include "../capture_errs.h"
+#include "../capture_ifinfo.h"
#include "../simple_dialog.h"
#include "../capture.h"
-#include "../capture_errs.h"
+#include "../capture-pcap-util.h"
#include "../capture_ui_utils.h"
#include "wsutil/file_util.h"
#include <wiretap/wtap.h>
@@ -442,28 +443,55 @@ GtkWidget * capture_get_if_icon(const if_info_t* if_info _U_)
}
+static int
+get_ip_addr_count(GSList *addr_list)
+{
+ GSList *curr_addr;
+ if_addr_t *addr;
+ int count;
+
+ count = 0;
+ for (curr_addr = addr_list; curr_addr != NULL;
+ curr_addr = g_slist_next(curr_addr)) {
+ addr = (if_addr_t *)curr_addr->data;
+ switch (addr->ifat_type) {
+
+ case IF_AT_IPv4:
+ case IF_AT_IPv6:
+ count++;
+ break;
+
+ default:
+ /* In case we add non-IP addresses */
+ break;
+ }
+ }
+ return count;
+}
+
static const gchar *
-set_ip_addr_label(GSList *ip_addr_list, GtkWidget *ip_lb, guint selected_ip_addr)
+set_ip_addr_label(GSList *addr_list, GtkWidget *ip_lb, guint selected_ip_addr)
{
- GSList *curr_ip;
- if_addr_t *ip_addr;
+ GSList *curr_addr;
+ if_addr_t *addr;
const gchar *addr_str = NULL;
- curr_ip = g_slist_nth(ip_addr_list, selected_ip_addr);
- if (curr_ip) {
- ip_addr = (if_addr_t *)curr_ip->data;
- switch (ip_addr->type) {
+ curr_addr = g_slist_nth(addr_list, selected_ip_addr);
+ if (curr_addr) {
+ addr = (if_addr_t *)curr_addr->data;
+ switch (addr->ifat_type) {
- case AT_IPv4:
- addr_str = ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr);
+ case IF_AT_IPv4:
+ addr_str = ip_to_str((guint8 *)&addr->addr.ip4_addr);
break;
- case AT_IPv6:
- addr_str = ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr);
+ case IF_AT_IPv6:
+ addr_str = ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr);
break;
default:
- g_assert_not_reached();
+ /* Ignore non-IP addresses, in case we ever support them */
+ break;
}
}
@@ -500,17 +528,40 @@ static gboolean
ip_label_press_cb(GtkWidget *widget, GdkEvent *event _U_, gpointer data)
{
GtkWidget *ip_lb = g_object_get_data(G_OBJECT(widget), CAPTURE_IF_IP_ADDR_LABEL);
- GSList *ip_addr_list = data;
+ GSList *addr_list = data;
+ GSList *curr_addr, *start_addr;
+ if_addr_t *addr;
guint selected_ip_addr = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(ip_lb), CAPTURE_IF_SELECTED_IP_ADDR));
/* Select next IP address */
- selected_ip_addr++;
- if (g_slist_length(ip_addr_list) <= selected_ip_addr) {
- /* Probably have the last one, start over again */
- selected_ip_addr = 0;
+ start_addr = g_slist_nth(addr_list, selected_ip_addr);
+ for (;;) {
+ selected_ip_addr++;
+ if (g_slist_length(addr_list) <= selected_ip_addr) {
+ /* Wrap around */
+ selected_ip_addr = 0;
+ }
+ curr_addr = g_slist_nth(addr_list, selected_ip_addr);
+ if (curr_addr == start_addr) {
+ /* We wrapped all the way around */
+ break;
+ }
+
+ addr = (if_addr_t *)curr_addr->data;
+ switch (addr->ifat_type) {
+
+ case IF_AT_IPv4:
+ case IF_AT_IPv6:
+ goto found;
+
+ default:
+ /* In case we add non-IP addresses */
+ break;
+ }
}
- set_ip_addr_label(ip_addr_list, ip_lb, selected_ip_addr);
+found:
+ set_ip_addr_label(addr_list, ip_lb, selected_ip_addr);
return FALSE;
}
@@ -734,7 +785,7 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
/* Only one IP address will be shown, start with the first */
g_string_append(if_tool_str, "IP: ");
if_dlg_data->ip_lb = gtk_label_new("");
- addr_str = set_ip_addr_label (if_info->ip_addr, if_dlg_data->ip_lb, 0);
+ addr_str = set_ip_addr_label (if_info->addrs, if_dlg_data->ip_lb, 0);
if (addr_str) {
gtk_widget_set_sensitive(if_dlg_data->ip_lb, TRUE);
g_string_append(if_tool_str, addr_str);
@@ -745,12 +796,12 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
eb = gtk_event_box_new ();
gtk_container_add(GTK_CONTAINER(eb), if_dlg_data->ip_lb);
gtk_table_attach_defaults(GTK_TABLE(if_tb), eb, 3, 4, row, row+1);
- if (g_slist_length(if_info->ip_addr) > 1) {
+ if (get_ip_addr_count(if_info->addrs) > 1) {
/* More than one IP address, make it possible to toggle */
g_object_set_data(G_OBJECT(eb), CAPTURE_IF_IP_ADDR_LABEL, if_dlg_data->ip_lb);
g_signal_connect(eb, "enter-notify-event", G_CALLBACK(ip_label_enter_cb), NULL);
g_signal_connect(eb, "leave-notify-event", G_CALLBACK(ip_label_leave_cb), NULL);
- g_signal_connect(eb, "button-press-event", G_CALLBACK(ip_label_press_cb), if_info->ip_addr);
+ g_signal_connect(eb, "button-press-event", G_CALLBACK(ip_label_press_cb), if_info->addrs);
}
g_string_append(if_tool_str, "\n");
diff --git a/gtk/capture_if_dlg.h b/gtk/capture_if_dlg.h
index aa15b5a6e4..dcf59aee06 100644
--- a/gtk/capture_if_dlg.h
+++ b/gtk/capture_if_dlg.h
@@ -34,7 +34,7 @@ set_capture_if_dialog_for_capture_in_progress(gboolean capture_in_progress);
#ifdef HAVE_LIBPCAP
-#include "capture-pcap-util.h" /* for if_info_t */
+#include "capture_ifinfo.h" /* for if_info_t */
/** User requested the "Capture Interfaces" dialog box by menu or toolbar.
*
diff --git a/gtk/prefs_capture.c b/gtk/prefs_capture.c
index fd13eeee25..17cd411a32 100644
--- a/gtk/prefs_capture.c
+++ b/gtk/prefs_capture.c
@@ -35,9 +35,8 @@
#include "../globals.h"
#include "../simple_dialog.h"
-#include "../capture-pcap-util.h"
+#include "../capture_ifinfo.h"
#include "../capture_ui_utils.h"
-#include "../capture.h"
#include "gtk/prefs_capture.h"
#include "gtk/prefs_dlg.h"