diff options
author | Guy Harris <guy@alum.mit.edu> | 2010-03-04 01:12:04 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2010-03-04 01:12:04 +0000 |
commit | 167ab3a98c4583344f8b95d81b079b7a5df7e5ff (patch) | |
tree | c2af1e714cc510427cdd87a9b63979038cfc40ac /gtk | |
parent | 98d800bae8939f6edaf4aa54f02787148da48c0f (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.c | 22 | ||||
-rw-r--r-- | gtk/capture_if_dlg.c | 97 | ||||
-rw-r--r-- | gtk/capture_if_dlg.h | 2 | ||||
-rw-r--r-- | gtk/prefs_capture.c | 3 |
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" |