2004-02-20 09:09:12 +00:00
/* hostlist_table.c 2004 Ian Schorr
* modified from endpoint_talkers_table . c 2003 Ronnie Sahlberg
* Helper routines common to all host list taps .
*
2004-07-18 00:24:25 +00:00
* $ Id $
2004-02-20 09:09:12 +00:00
*
2006-05-21 05:12:17 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2004-02-20 09:09:12 +00:00
* Copyright 1998 Gerald Combs
2004-06-03 21:46:27 +00:00
*
2004-02-20 09:09:12 +00:00
* 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 .
2004-06-03 21:46:27 +00:00
*
2004-02-20 09:09:12 +00:00
* 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 .
2004-06-03 21:46:27 +00:00
*
2004-02-20 09:09:12 +00:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
2012-06-28 22:56:06 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2004-02-20 09:09:12 +00:00
*/
2012-09-20 01:48:30 +00:00
# include "config.h"
2004-02-20 09:09:12 +00:00
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# include <math.h>
2009-10-09 09:01:04 +00:00
# include <locale.h>
2005-01-01 12:49:54 +00:00
2004-02-20 09:09:12 +00:00
# include <gtk/gtk.h>
2005-01-01 12:49:54 +00:00
# include <epan/packet_info.h>
# include <epan/to_str.h>
# include <epan/addr_resolv.h>
# include <epan/tap.h>
2008-10-27 14:17:04 +00:00
# include <epan/strutil.h>
2008-10-27 04:50:57 +00:00
# ifdef HAVE_GEOIP
2012-07-18 02:47:56 +00:00
# include <GeoIP.h>
2008-12-19 23:49:03 +00:00
# include <epan/geoip_db.h>
2008-12-23 18:17:01 +00:00
# include <epan/pint.h>
2009-02-11 20:25:17 +00:00
# include <epan/filesystem.h>
2008-10-27 04:50:57 +00:00
# endif
2005-01-01 12:49:54 +00:00
2009-03-09 14:53:22 +00:00
# include <wsutil/file_util.h>
2012-01-16 01:07:52 +00:00
# include "ui/simple_dialog.h"
# include "ui/alert_box.h"
2012-08-01 19:18:49 +00:00
# include "ui/utf8_entities.h"
2009-06-14 22:19:08 +00:00
# include "../tempfile.h"
2008-04-13 03:32:24 +00:00
2012-01-15 21:59:11 +00:00
# include "ui/gtk/hostlist_table.h"
# include "ui/gtk/filter_utils.h"
# include "ui/gtk/gtkglobals.h"
2008-05-17 23:03:17 +00:00
2012-01-15 21:59:11 +00:00
# include "ui/gtk/gui_utils.h"
# include "ui/gtk/dlg_utils.h"
# include "ui/gtk/help_dlg.h"
# include "ui/gtk/main.h"
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
2012-01-15 21:59:11 +00:00
# include "ui/gtk/webbrowser.h"
# include "ui/gtk/stock_icons.h"
2009-02-11 20:25:17 +00:00
# endif
2008-04-13 03:32:24 +00:00
2012-01-15 21:59:11 +00:00
# include "ui/gtk/old-gtk-compat.h"
2011-07-21 17:44:02 +00:00
2007-11-30 14:36:18 +00:00
# define HOST_PTR_KEY "hostlist-pointer"
# define NB_PAGES_KEY "notebook-pages"
2013-03-21 18:39:16 +00:00
# define HL_DLG_HEIGHT 550
2004-02-20 09:09:12 +00:00
2010-01-29 14:24:18 +00:00
# define CMP_INT(i1, i2) \
if ( ( i1 ) > ( i2 ) ) \
return 1 ; \
else if ( ( i1 ) < ( i2 ) ) \
return - 1 ; \
else \
return 0 ;
2009-10-09 09:01:04 +00:00
2008-10-27 21:38:40 +00:00
# define COL_STR_LEN 32
2004-02-20 09:09:12 +00:00
/* convert a port number into a string */
static char *
2010-01-29 14:24:18 +00:00
hostlist_port_to_str ( int port_type_val , guint32 port )
2004-02-20 09:09:12 +00:00
{
2010-01-29 14:24:18 +00:00
static int i = 0 ;
static gchar * strp , str [ 4 ] [ 12 ] ;
gchar * bp ;
switch ( port_type_val ) {
case PT_TCP :
case PT_UDP :
case PT_SCTP :
2009-03-18 14:44:15 +00:00
i = ( i + 1 ) % 4 ;
2010-01-29 14:24:18 +00:00
strp = str [ i ] ;
2009-10-09 09:01:04 +00:00
bp = & strp [ 11 ] ;
2010-08-30 16:10:01 +00:00
2009-10-09 09:01:04 +00:00
* bp = 0 ;
do {
2010-01-29 14:24:18 +00:00
* - - bp = ( port % 10 ) + ' 0 ' ;
2009-10-09 09:01:04 +00:00
} while ( ( port / = 10 ) ! = 0 & & bp > strp ) ;
2010-01-29 14:24:18 +00:00
return bp ;
}
return NULL ;
2004-02-20 09:09:12 +00:00
}
2009-03-18 14:44:15 +00:00
# define FN_ANY_ADDRESS 0
# define FN_ANY_PORT 1
2004-02-20 09:27:24 +00:00
2010-01-29 14:24:18 +00:00
/* Given an address (to distinguish between ipv4 and ipv6 for tcp/udp,
2004-02-20 09:09:12 +00:00
a port_type and a name_type ( FN_ . . . )
2010-01-29 14:24:18 +00:00
return a string for the filter name .
2004-02-20 09:09:12 +00:00
2010-01-29 14:24:18 +00:00
Some addresses , like AT_ETHER may actually be any of multiple types
2004-06-03 21:46:27 +00:00
of protocols , either ethernet , tokenring , fddi etc so we must be more
2010-01-29 14:24:18 +00:00
specific there ; that ' s why we need specific_addr_type .
2004-02-20 09:09:12 +00:00
*/
2005-08-05 20:59:08 +00:00
static const char *
2010-01-29 14:24:18 +00:00
hostlist_get_filter_name ( address * addr , int specific_addr_type_val , int port_type_val , int name_type_val )
2004-02-20 09:09:12 +00:00
{
2010-01-29 14:24:18 +00:00
switch ( name_type_val ) {
2009-03-18 14:44:15 +00:00
case FN_ANY_ADDRESS :
switch ( addr - > type ) {
case AT_ETHER :
2010-01-29 14:24:18 +00:00
switch ( specific_addr_type_val ) {
2009-03-18 14:44:15 +00:00
case SAT_ETHER :
return " eth.addr " ;
case SAT_WLAN :
return " wlan.addr " ;
case SAT_FDDI :
return " fddi.addr " ;
case SAT_TOKENRING :
return " tr.addr " ;
default :
break ;
}
break ;
case AT_IPv4 :
return " ip.addr " ;
case AT_IPv6 :
return " ipv6.addr " ;
case AT_IPX :
return " ipx.addr " ;
case AT_FC :
return " fc.id " ;
case AT_URI :
2010-01-29 14:24:18 +00:00
switch ( specific_addr_type_val ) {
2009-03-18 14:44:15 +00:00
case SAT_JXTA :
return " jxta.message.address " ;
default :
break ;
}
break ;
case AT_USB :
return " usb.addr " ;
default :
break ;
}
2011-03-26 15:16:40 +00:00
break ;
2009-03-18 14:44:15 +00:00
case FN_ANY_PORT :
2010-01-29 14:24:18 +00:00
switch ( port_type_val ) {
2009-03-18 14:44:15 +00:00
case PT_TCP :
return " tcp.port " ;
case PT_UDP :
return " udp.port " ;
case PT_SCTP :
return " sctp.port " ;
}
break ;
}
g_assert_not_reached ( ) ;
return NULL ;
2004-02-20 09:09:12 +00:00
}
static void
reset_hostlist_table_data ( hostlist_table * hosts )
{
2004-06-03 21:46:27 +00:00
guint32 i ;
2012-06-03 22:03:05 +00:00
char * display_name ;
2004-06-03 21:46:27 +00:00
char title [ 256 ] ;
2008-02-17 00:35:55 +00:00
GString * error_string ;
const char * filter ;
2009-10-09 09:01:04 +00:00
GtkListStore * store ;
2008-02-17 00:35:55 +00:00
if ( hosts - > use_dfilter ) {
filter = gtk_entry_get_text ( GTK_ENTRY ( main_display_filter_widget ) ) ;
} else {
filter = hosts - > filter ;
}
error_string = set_tap_dfilter ( hosts , filter ) ;
if ( error_string ) {
2008-10-31 09:53:56 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " %s " , error_string - > str ) ;
2008-02-17 00:35:55 +00:00
g_string_free ( error_string , TRUE ) ;
return ;
}
2008-08-05 17:33:14 +00:00
2004-02-20 09:09:12 +00:00
2004-05-02 21:16:09 +00:00
if ( hosts - > page_lb ) {
2012-06-03 22:03:05 +00:00
display_name = cf_get_display_name ( & cfile ) ;
g_snprintf ( title , sizeof ( title ) , " Endpoints: %s " , display_name ) ;
g_free ( display_name ) ;
2004-06-03 21:46:27 +00:00
gtk_window_set_title ( GTK_WINDOW ( hosts - > win ) , title ) ;
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s " , hosts - > name ) ;
2004-06-03 21:46:27 +00:00
gtk_label_set_text ( GTK_LABEL ( hosts - > page_lb ) , title ) ;
2004-05-02 21:16:09 +00:00
gtk_widget_set_sensitive ( hosts - > page_lb , FALSE ) ;
2008-02-17 00:35:55 +00:00
if ( hosts - > use_dfilter ) {
if ( filter & & strlen ( filter ) ) {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s Endpoints - Filter: %s " , hosts - > name , filter ) ;
2008-02-17 00:35:55 +00:00
} else {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s Endpoints - No Filter " , hosts - > name ) ;
2008-02-17 00:35:55 +00:00
}
} else {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s Endpoints " , hosts - > name ) ;
2008-02-17 00:35:55 +00:00
}
gtk_label_set_text ( GTK_LABEL ( hosts - > name_lb ) , title ) ;
2004-05-02 21:16:09 +00:00
} else {
2012-06-03 22:03:05 +00:00
display_name = cf_get_display_name ( & cfile ) ;
g_snprintf ( title , sizeof ( title ) , " %s Endpoints: %s " , hosts - > name , display_name ) ;
g_free ( display_name ) ;
2004-06-03 21:46:27 +00:00
gtk_window_set_title ( GTK_WINDOW ( hosts - > win ) , title ) ;
2004-05-02 21:16:09 +00:00
}
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
/* remove all entries from the list */
store = GTK_LIST_STORE ( gtk_tree_view_get_model ( GTK_TREE_VIEW ( hosts - > table ) ) ) ;
gtk_list_store_clear ( store ) ;
2004-02-20 09:09:12 +00:00
2004-06-03 21:46:27 +00:00
/* delete all hosts */
for ( i = 0 ; i < hosts - > num_hosts ; i + + ) {
2009-10-09 09:01:04 +00:00
hostlist_talker_t * host = & g_array_index ( hosts - > hosts , hostlist_talker_t , i ) ;
2013-03-21 02:29:09 +00:00
g_free ( ( gpointer ) host - > myaddress . data ) ;
2004-06-03 21:46:27 +00:00
}
2009-10-09 09:01:04 +00:00
if ( hosts - > hosts )
g_array_free ( hosts - > hosts , TRUE ) ;
2010-08-30 16:10:01 +00:00
if ( hosts - > hashtable ! = NULL )
2009-10-09 09:01:04 +00:00
g_hash_table_destroy ( hosts - > hashtable ) ;
2004-06-03 21:46:27 +00:00
hosts - > hosts = NULL ;
2009-10-09 09:01:04 +00:00
hosts - > hashtable = NULL ;
2004-06-03 21:46:27 +00:00
hosts - > num_hosts = 0 ;
2004-02-20 09:09:12 +00:00
}
2005-01-01 12:49:54 +00:00
static void
reset_hostlist_table_data_cb ( void * arg )
{
2013-03-11 06:47:34 +00:00
reset_hostlist_table_data ( ( hostlist_table * ) arg ) ;
2005-01-01 12:49:54 +00:00
}
2004-02-20 09:09:12 +00:00
static void
hostlist_win_destroy_cb ( GtkWindow * win _U_ , gpointer data )
{
2009-03-18 14:44:15 +00:00
hostlist_table * hosts = ( hostlist_table * ) data ;
2004-02-20 09:09:12 +00:00
2009-03-18 14:44:15 +00:00
remove_tap_listener ( hosts ) ;
2004-02-20 09:09:12 +00:00
2009-03-18 14:44:15 +00:00
reset_hostlist_table_data ( hosts ) ;
g_free ( hosts ) ;
2004-02-20 09:09:12 +00:00
}
2010-08-30 16:10:01 +00:00
enum
2004-02-20 09:09:12 +00:00
{
2010-01-29 14:24:18 +00:00
ADR_COLUMN ,
PORT_COLUMN ,
PACKETS_COLUMN ,
BYTES_COLUMN ,
PKT_AB_COLUMN ,
BYTES_AB_COLUMN ,
PKT_BA_COLUMN ,
BYTES_BA_COLUMN ,
2009-10-09 09:01:04 +00:00
# ifdef HAVE_GEOIP
2010-01-29 14:24:18 +00:00
GEOIP1_COLUMN ,
GEOIP2_COLUMN ,
GEOIP3_COLUMN ,
GEOIP4_COLUMN ,
GEOIP5_COLUMN ,
GEOIP6_COLUMN ,
GEOIP7_COLUMN ,
GEOIP8_COLUMN ,
GEOIP9_COLUMN ,
GEOIP10_COLUMN ,
GEOIP11_COLUMN ,
GEOIP12_COLUMN ,
GEOIP13_COLUMN ,
2009-10-09 09:01:04 +00:00
# endif
2010-01-29 14:24:18 +00:00
INDEX_COLUMN ,
N_COLUMNS
2009-10-09 09:01:04 +00:00
} ;
2008-08-05 17:33:14 +00:00
2009-10-09 09:01:04 +00:00
static gint
hostlist_sort_column ( GtkTreeModel * model ,
2010-01-29 14:24:18 +00:00
GtkTreeIter * a ,
GtkTreeIter * b ,
gpointer user_data )
2004-02-20 09:09:12 +00:00
{
2010-01-29 14:24:18 +00:00
guint32 idx1 , idx2 ;
2009-10-09 09:01:04 +00:00
gint data_column = GPOINTER_TO_INT ( user_data ) ;
2013-03-11 06:47:34 +00:00
hostlist_table * hl = ( hostlist_table * ) g_object_get_data ( G_OBJECT ( model ) , HOST_PTR_KEY ) ;
2010-01-29 14:24:18 +00:00
hostlist_talker_t * host1 = NULL ;
2009-10-09 09:01:04 +00:00
hostlist_talker_t * host2 = NULL ;
gtk_tree_model_get ( model , a , INDEX_COLUMN , & idx1 , - 1 ) ;
gtk_tree_model_get ( model , b , INDEX_COLUMN , & idx2 , - 1 ) ;
2010-01-29 14:24:18 +00:00
if ( ! hl | | idx1 > = hl - > num_hosts | | idx2 > = hl - > num_hosts )
return 0 ;
2009-10-09 09:01:04 +00:00
2010-01-29 14:24:18 +00:00
host1 = & g_array_index ( hl - > hosts , hostlist_talker_t , idx1 ) ;
host2 = & g_array_index ( hl - > hosts , hostlist_talker_t , idx2 ) ;
2009-10-09 09:01:04 +00:00
2010-01-29 14:24:18 +00:00
switch ( data_column ) {
case 0 : /* Address */
2013-03-21 02:29:09 +00:00
return ( CMP_ADDRESS ( & host1 - > myaddress , & host2 - > myaddress ) ) ;
2010-01-29 14:24:18 +00:00
case 1 : /* (Port) */
CMP_INT ( host1 - > port , host2 - > port ) ;
2010-02-28 20:56:21 +00:00
# ifdef HAVE_GEOIP
default :
{
gchar * text1 , * text2 ;
double loc1 = 0 , loc2 = 0 ;
2010-08-30 16:10:01 +00:00
2010-02-28 20:56:21 +00:00
gtk_tree_model_get ( model , a , data_column , & text1 , - 1 ) ;
gtk_tree_model_get ( model , b , data_column , & text2 , - 1 ) ;
2010-08-30 16:10:01 +00:00
2010-02-28 20:56:21 +00:00
if ( text1 ) {
loc1 = atof ( text1 ) ;
g_free ( text1 ) ;
}
if ( text2 ) {
loc2 = atof ( text2 ) ;
g_free ( text2 ) ;
}
CMP_INT ( loc1 , loc2 ) ;
}
break ;
# endif
2010-01-29 14:24:18 +00:00
}
g_assert_not_reached ( ) ;
2011-04-22 07:15:45 +00:00
return 0 ;
2004-02-20 09:09:12 +00:00
}
static void
hostlist_select_filter_cb ( GtkWidget * widget _U_ , gpointer callback_data , guint callback_action )
{
2009-10-09 09:01:04 +00:00
guint idx ;
2009-03-18 14:44:15 +00:00
hostlist_table * hl = ( hostlist_table * ) callback_data ;
char * str = NULL ;
char * sport ;
2009-10-09 09:01:04 +00:00
GtkTreeIter iter ;
GtkTreeModel * model ;
GtkTreeSelection * sel ;
2010-01-29 14:24:18 +00:00
hostlist_talker_t * host = NULL ;
2009-10-09 09:01:04 +00:00
sel = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( hl - > table ) ) ;
if ( ! gtk_tree_selection_get_selected ( sel , & model , & iter ) )
return ;
2009-03-18 14:44:15 +00:00
2010-08-30 16:10:01 +00:00
gtk_tree_model_get ( model , & iter ,
2009-10-09 09:01:04 +00:00
INDEX_COLUMN , & idx ,
- 1 ) ;
if ( idx > = hl - > num_hosts ) {
2009-03-18 14:44:15 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " No hostlist selected " ) ;
return ;
}
2010-01-29 14:24:18 +00:00
host = & g_array_index ( hl - > hosts , hostlist_talker_t , idx ) ;
2009-03-18 14:44:15 +00:00
2009-10-09 09:01:04 +00:00
sport = hostlist_port_to_str ( host - > port_type , host - > port ) ;
2009-03-18 14:44:15 +00:00
str = g_strdup_printf ( " %s==%s%s%s%s%s " ,
2013-03-21 02:29:09 +00:00
hostlist_get_filter_name ( & host - > myaddress , host - > sat , host - > port_type , FN_ANY_ADDRESS ) ,
ep_address_to_str ( & host - > myaddress ) ,
2009-03-18 14:44:15 +00:00
sport ? " && " : " " ,
2013-03-21 02:29:09 +00:00
sport ? hostlist_get_filter_name ( & host - > myaddress , host - > sat , host - > port_type , FN_ANY_PORT ) : " " ,
2009-03-18 14:44:15 +00:00
sport ? " == " : " " ,
sport ? sport : " " ) ;
apply_selected_filter ( callback_action , str ) ;
g_free ( str ) ;
2004-02-20 09:09:12 +00:00
}
2010-07-30 12:41:56 +00:00
static gboolean
2004-02-20 09:09:12 +00:00
hostlist_show_popup_menu_cb ( void * widg _U_ , GdkEvent * event , hostlist_table * et )
{
2004-06-01 23:00:24 +00:00
GdkEventButton * bevent = ( GdkEventButton * ) event ;
2004-02-20 09:09:12 +00:00
2004-06-01 23:00:24 +00:00
if ( event - > type = = GDK_BUTTON_PRESS & & bevent - > button = = 3 ) {
2004-06-03 21:46:27 +00:00
gtk_menu_popup ( GTK_MENU ( et - > menu ) , NULL , NULL , NULL , NULL ,
2009-03-18 14:44:15 +00:00
bevent - > button , bevent - > time ) ;
2004-06-01 23:00:24 +00:00
}
2004-02-20 09:09:12 +00:00
2004-06-01 23:00:24 +00:00
return FALSE ;
2004-02-20 09:09:12 +00:00
}
2010-09-03 08:41:04 +00:00
/* Action callbacks */
2010-08-30 14:23:25 +00:00
static void
apply_as_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
apply_as_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
apply_as_and_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_AND_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
apply_as_or_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_OR_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
apply_as_and_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_AND_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
apply_as_or_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_OR_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
prep_as_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
prep_as_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
prep_as_and_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_AND_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
prep_as_or_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_OR_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
prep_as_and_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_AND_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
prep_as_or_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_OR_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
find_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_FIND_FRAME ( ACTYPE_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
find_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_FIND_FRAME ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
find_prev_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_FIND_PREVIOUS ( ACTYPE_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
find_prev_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_FIND_PREVIOUS ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
find_next_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_FIND_NEXT ( ACTYPE_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
find_next_not_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_FIND_NEXT ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static void
color_selected_cb ( GtkWidget * widget , gpointer user_data )
{
2011-09-21 18:55:03 +00:00
hostlist_select_filter_cb ( widget , user_data , CALLBACK_COLORIZE ( ACTYPE_SELECTED , 0 ) ) ;
2010-08-30 14:23:25 +00:00
}
static const char * ui_desc_hostlist_table_popup =
" <ui> \n "
" <popup name='HostlistTableFilterPopup'> \n "
" <menu action='/Apply as Filter'> \n "
" <menuitem action='/Apply as Filter/Selected'/> \n "
2010-10-03 15:26:03 +00:00
" <menuitem action='/Apply as Filter/Not Selected'/> \n "
2010-10-03 16:09:25 +00:00
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/> \n "
2010-08-30 14:23:25 +00:00
" </menu> \n "
" <menu action='/Prepare a Filter'> \n "
" <menuitem action='/Prepare a Filter/Selected'/> \n "
2010-10-03 15:26:03 +00:00
" <menuitem action='/Prepare a Filter/Not Selected'/> \n "
2010-10-03 16:09:25 +00:00
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/> \n "
2010-08-30 14:23:25 +00:00
" </menu> \n "
" <menu action='/Find Frame'> \n "
" <menu action='/Find Frame/Find Frame'> \n "
" <menuitem action='/Find Frame/Selected'/> \n "
" <menuitem action='/Find Frame/Not Selected'/> \n "
" </menu> \n "
" <menu action='/Find Frame/Find Next'> \n "
" <menuitem action='/Find Next/Selected'/> \n "
" <menuitem action='/Find Next/Not Selected'/> \n "
" </menu> \n "
" <menu action='/Find Frame/Find Previous'> \n "
" <menuitem action='/Find Previous/Selected'/> \n "
" <menuitem action='/Find Previous/Not Selected'/> \n "
" </menu> \n "
" </menu> \n "
" <menu action='/Colorize Procedure'> \n "
" <menuitem action='/Colorize Procedure/Colorize Host Traffic'/> \n "
" </menu> \n "
" </popup> \n "
" </ui> \n " ;
2011-07-11 18:35:36 +00:00
/*
2010-08-30 14:23:25 +00:00
* GtkActionEntry
* typedef struct {
* const gchar * name ;
* const gchar * stock_id ;
* const gchar * label ;
* const gchar * accelerator ;
* const gchar * tooltip ;
* GCallback callback ;
* } GtkActionEntry ;
2011-09-21 18:55:03 +00:00
* const gchar * name ; The name of the action .
* const gchar * stock_id ; The stock id for the action , or the name of an icon from the icon theme .
* const gchar * label ; The label for the action . This field should typically be marked for translation ,
2011-07-11 18:35:36 +00:00
* see gtk_action_group_set_translation_domain ( ) .
2011-09-21 18:55:03 +00:00
* If label is NULL , the label of the stock item with id stock_id is used .
* const gchar * accelerator ; The accelerator for the action , in the format understood by gtk_accelerator_parse ( ) .
* const gchar * tooltip ; The tooltip for the action . This field should typically be marked for translation ,
* see gtk_action_group_set_translation_domain ( ) .
* GCallback callback ; The function to call when the action is activated .
2010-08-30 14:23:25 +00:00
*
*/
2013-03-11 06:47:34 +00:00
static const GtkActionEntry service_resp_t_popup_entries [ ] = {
2011-09-21 18:55:03 +00:00
{ " /Apply as Filter " , NULL , " Apply as Filter " , NULL , NULL , NULL } ,
{ " /Prepare a Filter " , NULL , " Prepare a Filter " , NULL , NULL , NULL } ,
{ " /Find Frame " , NULL , " Find Frame " , NULL , NULL , NULL } ,
{ " /Find Frame/Find Frame " , NULL , " Find Frame " , NULL , NULL , NULL } ,
{ " /Find Frame/Find Next " , NULL , " Find Next " , NULL , NULL , NULL } ,
{ " /Find Frame/Find Previous " , NULL , " Find Previous " , NULL , NULL , NULL } ,
{ " /Colorize Procedure " , NULL , " Colorize Procedure " , NULL , NULL , NULL } ,
{ " /Apply as Filter/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( apply_as_selected_cb ) } ,
{ " /Apply as Filter/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( apply_as_not_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , G_CALLBACK ( apply_as_and_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , G_CALLBACK ( apply_as_or_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , G_CALLBACK ( apply_as_and_not_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , G_CALLBACK ( apply_as_or_not_selected_cb ) } ,
{ " /Prepare a Filter/Selected " , NULL , " Selected " , NULL , " selcted " , G_CALLBACK ( prep_as_selected_cb ) } ,
{ " /Prepare a Filter/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( prep_as_not_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , G_CALLBACK ( prep_as_and_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , G_CALLBACK ( prep_as_or_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , G_CALLBACK ( prep_as_and_not_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , G_CALLBACK ( prep_as_or_not_selected_cb ) } ,
{ " /Find Frame/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( find_selected_cb ) } ,
{ " /Find Frame/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( find_not_selected_cb ) } ,
{ " /Find Previous/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( find_prev_selected_cb ) } ,
{ " /Find Previous/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( find_prev_not_selected_cb ) } ,
{ " /Find Next/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( find_next_selected_cb ) } ,
{ " /Find Next/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( find_next_not_selected_cb ) } ,
{ " /Colorize Procedure/Colorize Host Traffic " , NULL , " Colorize Host Traffic " , NULL , " Colorize Host Traffic " , G_CALLBACK ( color_selected_cb ) } ,
2010-08-30 14:23:25 +00:00
} ;
2004-02-20 09:09:12 +00:00
static void
hostlist_create_popup_menu ( hostlist_table * hl )
{
2011-09-21 18:55:03 +00:00
GtkUIManager * ui_manager ;
GtkActionGroup * action_group ;
GError * error = NULL ;
action_group = gtk_action_group_new ( " HostlistTablePopupActionGroup " ) ;
gtk_action_group_add_actions ( action_group , /* the action group */
2013-03-11 06:47:34 +00:00
service_resp_t_popup_entries , /* an array of action descriptions */
G_N_ELEMENTS ( service_resp_t_popup_entries ) , /* the number of entries */
2011-09-21 18:55:03 +00:00
hl ) ; /* data to pass to the action callbacks */
ui_manager = gtk_ui_manager_new ( ) ;
gtk_ui_manager_insert_action_group ( ui_manager ,
action_group ,
0 ) ; /* the position at which the group will be inserted */
gtk_ui_manager_add_ui_from_string ( ui_manager , ui_desc_hostlist_table_popup , - 1 , & error ) ;
if ( error ! = NULL )
2011-07-11 18:35:36 +00:00
{
fprintf ( stderr , " Warning: building hostlist table filter popup failed: %s \n " ,
error - > message ) ;
g_error_free ( error ) ;
error = NULL ;
}
2011-09-21 18:55:03 +00:00
hl - > menu = gtk_ui_manager_get_widget ( ui_manager , " /HostlistTableFilterPopup " ) ;
g_signal_connect ( hl - > table , " button_press_event " , G_CALLBACK ( hostlist_show_popup_menu_cb ) , hl ) ;
2004-02-20 09:09:12 +00:00
}
2004-07-27 18:34:02 +00:00
/* Draw/refresh the address field of a single entry at the specified index */
static void
2012-12-26 05:57:06 +00:00
get_hostlist_table_address ( hostlist_table * hl , hostlist_talker_t * host , const char * * entries )
2004-07-27 18:34:02 +00:00
{
char * port ;
guint32 pt ;
2005-02-22 01:55:04 +00:00
if ( ! hl - > resolve_names )
2013-03-21 02:29:09 +00:00
entries [ 0 ] = ep_address_to_str ( & host - > myaddress ) ;
2005-02-22 01:55:04 +00:00
else
2013-03-21 02:29:09 +00:00
entries [ 0 ] = ( char * ) get_addr_name ( & host - > myaddress ) ;
2004-07-27 18:34:02 +00:00
2009-10-09 09:01:04 +00:00
pt = host - > port_type ;
2004-07-27 18:34:02 +00:00
if ( ! hl - > resolve_names ) pt = PT_NONE ;
switch ( pt ) {
case ( PT_TCP ) :
2009-10-09 09:01:04 +00:00
entries [ 1 ] = get_tcp_port ( host - > port ) ;
2004-07-27 18:34:02 +00:00
break ;
case ( PT_UDP ) :
2009-10-09 09:01:04 +00:00
entries [ 1 ] = get_udp_port ( host - > port ) ;
2004-07-27 18:34:02 +00:00
break ;
2008-02-08 12:33:26 +00:00
case ( PT_SCTP ) :
2009-10-09 09:01:04 +00:00
entries [ 1 ] = get_sctp_port ( host - > port ) ;
2008-02-08 12:33:26 +00:00
break ;
2004-07-27 18:34:02 +00:00
default :
2009-10-09 09:01:04 +00:00
port = hostlist_port_to_str ( host - > port_type , host - > port ) ;
entries [ 1 ] = port ? port : " " ;
2004-07-27 18:34:02 +00:00
}
}
/* Refresh the address fields of all entries in the list */
2004-06-03 21:46:27 +00:00
static void
2004-05-03 22:15:22 +00:00
draw_hostlist_table_addresses ( hostlist_table * hl )
{
2004-06-01 23:00:24 +00:00
guint32 i ;
2012-12-26 05:57:06 +00:00
const char * entries [ 2 ] ;
2009-10-09 09:01:04 +00:00
GtkListStore * store ;
2010-08-30 16:10:01 +00:00
store = GTK_LIST_STORE ( gtk_tree_view_get_model ( hl - > table ) ) ;
2009-10-09 09:01:04 +00:00
g_object_ref ( store ) ;
gtk_tree_view_set_model ( GTK_TREE_VIEW ( hl - > table ) , NULL ) ;
2004-05-03 22:15:22 +00:00
2004-06-01 23:00:24 +00:00
for ( i = 0 ; i < hl - > num_hosts ; i + + ) {
2009-10-09 09:01:04 +00:00
hostlist_talker_t * host = & g_array_index ( hl - > hosts , hostlist_talker_t , i ) ;
get_hostlist_table_address ( hl , host , entries ) ;
gtk_list_store_set ( store , & host - > iter ,
2010-01-29 14:24:18 +00:00
ADR_COLUMN , entries [ 0 ] ,
2009-10-09 09:01:04 +00:00
PORT_COLUMN , entries [ 1 ] ,
- 1 ) ;
2004-06-01 23:00:24 +00:00
}
2009-10-09 09:01:04 +00:00
gtk_tree_view_set_model ( GTK_TREE_VIEW ( hl - > table ) , GTK_TREE_MODEL ( store ) ) ;
g_object_unref ( store ) ;
2004-05-03 22:15:22 +00:00
}
2004-02-20 09:09:12 +00:00
2004-06-03 21:46:27 +00:00
static void
2004-02-20 09:09:12 +00:00
draw_hostlist_table_data ( hostlist_table * hl )
{
2004-06-01 23:00:24 +00:00
guint32 i ;
char title [ 256 ] ;
2009-10-09 09:01:04 +00:00
GtkListStore * store ;
gboolean first = TRUE ;
2004-05-02 21:16:09 +00:00
if ( hl - > page_lb ) {
if ( hl - > num_hosts ) {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s: %u " , hl - > name , hl - > num_hosts ) ;
2004-05-02 21:16:09 +00:00
} else {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s " , hl - > name ) ;
2004-05-02 21:16:09 +00:00
}
2004-06-01 23:00:24 +00:00
gtk_label_set_text ( GTK_LABEL ( hl - > page_lb ) , title ) ;
2004-05-02 21:16:09 +00:00
gtk_widget_set_sensitive ( hl - > page_lb , hl - > num_hosts ) ;
2008-02-17 00:35:55 +00:00
} else {
if ( hl - > num_hosts ) {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s Endpoints: %u " , hl - > name , hl - > num_hosts ) ;
2008-02-17 00:35:55 +00:00
} else {
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s Endpoints " , hl - > name ) ;
2008-02-17 00:35:55 +00:00
}
gtk_label_set_text ( GTK_LABEL ( hl - > name_lb ) , title ) ;
2004-05-02 21:16:09 +00:00
}
2004-02-20 09:09:12 +00:00
2010-08-30 16:10:01 +00:00
store = GTK_LIST_STORE ( gtk_tree_view_get_model ( hl - > table ) ) ;
2004-06-01 23:00:24 +00:00
for ( i = 0 ; i < hl - > num_hosts ; i + + ) {
2009-10-09 09:01:04 +00:00
hostlist_talker_t * host = & g_array_index ( hl - > hosts , hostlist_talker_t , i ) ;
2010-08-30 16:10:01 +00:00
2009-10-09 09:01:04 +00:00
if ( ! host - > modified )
continue ;
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
if ( first ) {
g_object_ref ( store ) ;
gtk_tree_view_set_model ( GTK_TREE_VIEW ( hl - > table ) , NULL ) ;
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
first = FALSE ;
}
host - > modified = FALSE ;
if ( ! host - > iter_valid ) {
2012-12-26 05:57:06 +00:00
const char * entries [ 2 ] ;
2009-10-09 09:01:04 +00:00
# ifdef HAVE_GEOIP
2012-05-30 06:44:37 +00:00
char * geoip [ NUM_GEOIP_COLS ] ;
2009-10-09 09:01:04 +00:00
guint j ;
2013-03-21 02:29:09 +00:00
if ( ( host - > myaddress . type = = AT_IPv4 | | host - > myaddress . type = = AT_IPv6 ) & & ! hl - > geoip_visible ) {
2010-01-29 14:24:18 +00:00
GList * columns , * list ;
2009-10-09 09:01:04 +00:00
GtkTreeViewColumn * column ;
columns = gtk_tree_view_get_columns ( GTK_TREE_VIEW ( hl - > table ) ) ;
2009-10-09 09:06:22 +00:00
list = columns ;
2009-10-09 09:01:04 +00:00
while ( columns ) {
2010-01-29 14:24:18 +00:00
const gchar * title_p ;
2009-10-09 09:01:04 +00:00
gint id ;
2013-03-11 06:47:34 +00:00
column = ( GtkTreeViewColumn * ) columns - > data ;
2010-01-29 14:24:18 +00:00
title_p = gtk_tree_view_column_get_title ( column ) ;
2009-10-09 09:01:04 +00:00
id = gtk_tree_view_column_get_sort_column_id ( column ) ;
2010-01-29 14:24:18 +00:00
if ( title_p [ 0 ] ! = 0 & & id > = GEOIP1_COLUMN ) {
2009-10-09 09:01:04 +00:00
gtk_tree_view_column_set_visible ( column , TRUE ) ;
}
columns = g_list_next ( columns ) ;
}
2009-10-09 09:06:22 +00:00
g_list_free ( list ) ;
2009-10-09 09:01:04 +00:00
hl - > geoip_visible = TRUE ;
}
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
/* Filled in from the GeoIP config, if any */
for ( j = 0 ; j < NUM_GEOIP_COLS ; j + + ) {
2013-03-21 02:29:09 +00:00
if ( host - > myaddress . type = = AT_IPv4 & & j < geoip_db_num_dbs ( ) ) {
const guchar * name = geoip_db_lookup_ipv4 ( j , pntohl ( host - > myaddress . data ) , " - " ) ;
2012-05-30 06:44:37 +00:00
geoip [ j ] = g_strdup ( name ) ;
2013-03-21 02:29:09 +00:00
} else if ( host - > myaddress . type = = AT_IPv6 & & j < geoip_db_num_dbs ( ) ) {
2011-10-05 22:27:51 +00:00
const guchar * name ;
2013-03-21 02:29:09 +00:00
const struct e_in6_addr * addr = ( const struct e_in6_addr * ) host - > myaddress . data ;
2011-10-05 22:27:51 +00:00
name = geoip_db_lookup_ipv6 ( j , * addr , " - " ) ;
2012-05-30 06:44:37 +00:00
geoip [ j ] = g_strdup ( name ) ;
2009-10-09 09:01:04 +00:00
} else {
2012-05-30 06:44:37 +00:00
geoip [ j ] = NULL ;
2010-01-29 14:24:18 +00:00
}
2009-10-09 09:01:04 +00:00
}
# endif /* HAVE_GEOIP */
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
get_hostlist_table_address ( hl , host , entries ) ;
host - > iter_valid = TRUE ;
2010-01-29 14:24:18 +00:00
gtk_list_store_insert_with_values ( store , & host - > iter , G_MAXINT ,
ADR_COLUMN , entries [ 0 ] ,
2009-10-09 09:01:04 +00:00
PORT_COLUMN , entries [ 1 ] ,
PACKETS_COLUMN , host - > tx_frames + host - > rx_frames ,
BYTES_COLUMN , host - > tx_bytes + host - > rx_bytes ,
PKT_AB_COLUMN , host - > tx_frames ,
BYTES_AB_COLUMN , host - > tx_bytes ,
PKT_BA_COLUMN , host - > rx_frames ,
BYTES_BA_COLUMN , host - > rx_bytes ,
# ifdef HAVE_GEOIP
GEOIP1_COLUMN , geoip [ 0 ] ,
GEOIP2_COLUMN , geoip [ 1 ] ,
GEOIP3_COLUMN , geoip [ 2 ] ,
GEOIP4_COLUMN , geoip [ 3 ] ,
GEOIP5_COLUMN , geoip [ 4 ] ,
GEOIP6_COLUMN , geoip [ 5 ] ,
GEOIP7_COLUMN , geoip [ 6 ] ,
GEOIP8_COLUMN , geoip [ 7 ] ,
GEOIP9_COLUMN , geoip [ 8 ] ,
GEOIP10_COLUMN , geoip [ 9 ] ,
GEOIP11_COLUMN , geoip [ 10 ] ,
GEOIP12_COLUMN , geoip [ 11 ] ,
GEOIP13_COLUMN , geoip [ 12 ] ,
# endif
INDEX_COLUMN , i ,
- 1 ) ;
2012-05-30 06:44:37 +00:00
# ifdef HAVE_GEOIP
for ( j = 0 ; j < NUM_GEOIP_COLS ; j + + )
g_free ( geoip [ j ] ) ;
# endif /* HAVE_GEOIP */
2009-10-09 09:01:04 +00:00
}
else {
gtk_list_store_set ( store , & host - > iter ,
PACKETS_COLUMN , host - > tx_frames + host - > rx_frames ,
BYTES_COLUMN , host - > tx_bytes + host - > rx_bytes ,
PKT_AB_COLUMN , host - > tx_frames ,
BYTES_AB_COLUMN , host - > tx_bytes ,
PKT_BA_COLUMN , host - > rx_frames ,
BYTES_BA_COLUMN , host - > rx_bytes ,
- 1 ) ;
}
2004-06-01 23:00:24 +00:00
}
2009-10-09 09:01:04 +00:00
if ( ! first ) {
if ( ! hl - > fixed_col & & hl - > num_hosts > = 1000 ) {
/* finding the right size for a column isn't easy
* let it run in autosize a little ( 1000 is arbitrary )
* and then switch to fixed width .
*/
hl - > fixed_col = TRUE ;
switch_to_fixed_col ( hl - > table ) ;
}
2008-08-05 17:33:14 +00:00
2009-10-09 09:01:04 +00:00
gtk_tree_view_set_model ( GTK_TREE_VIEW ( hl - > table ) , GTK_TREE_MODEL ( store ) ) ;
g_object_unref ( store ) ;
}
2005-01-01 12:49:54 +00:00
}
static void
draw_hostlist_table_data_cb ( void * arg )
{
2013-03-11 06:47:34 +00:00
draw_hostlist_table_data ( ( hostlist_table * ) arg ) ;
2004-02-20 09:09:12 +00:00
}
2009-10-09 09:01:04 +00:00
typedef struct {
2010-01-29 14:24:18 +00:00
int nb_cols ;
gint columns_order [ N_COLUMNS ] ;
GString * CSV_str ;
2009-10-09 09:01:04 +00:00
hostlist_table * talkers ;
} csv_t ;
/* output in C locale */
static gboolean
csv_handle ( GtkTreeModel * model , GtkTreePath * path _U_ , GtkTreeIter * iter ,
gpointer data )
{
2010-01-29 14:24:18 +00:00
csv_t * csv = ( csv_t * ) data ;
gchar * table_text ;
int i ;
2013-01-04 05:22:43 +00:00
guint idx ;
2009-10-09 09:01:04 +00:00
guint64 value ;
2010-01-29 14:24:18 +00:00
gtk_tree_model_get ( model , iter , INDEX_COLUMN , & idx , - 1 ) ;
2009-10-09 09:01:04 +00:00
2010-01-29 14:24:18 +00:00
for ( i = 0 ; i < csv - > nb_cols ; i + + ) {
if ( i )
g_string_append ( csv - > CSV_str , " , " ) ;
2009-10-09 09:01:04 +00:00
2010-01-29 14:24:18 +00:00
switch ( csv - > columns_order [ i ] ) {
case ADR_COLUMN :
case PORT_COLUMN :
gtk_tree_model_get ( model , iter , csv - > columns_order [ i ] , & table_text , - 1 ) ;
if ( table_text ) {
2010-11-17 03:29:12 +00:00
g_string_append_printf ( csv - > CSV_str , " \" %s \" " , table_text ) ;
2010-01-29 14:24:18 +00:00
g_free ( table_text ) ;
2009-10-09 09:01:04 +00:00
}
2010-01-29 14:24:18 +00:00
break ;
case PACKETS_COLUMN :
case BYTES_COLUMN :
case PKT_AB_COLUMN :
case BYTES_AB_COLUMN :
case PKT_BA_COLUMN :
case BYTES_BA_COLUMN :
gtk_tree_model_get ( model , iter , csv - > columns_order [ i ] , & value , - 1 ) ;
2010-11-17 03:29:12 +00:00
g_string_append_printf ( csv - > CSV_str , " \" % " G_GINT64_MODIFIER " u \" " , value ) ;
2010-01-29 14:24:18 +00:00
break ;
default :
gtk_tree_model_get ( model , iter , csv - > columns_order [ i ] , & table_text , - 1 ) ;
if ( table_text ) {
2010-11-17 03:29:12 +00:00
g_string_append_printf ( csv - > CSV_str , " \" %s \" " , table_text ) ;
2010-01-29 14:24:18 +00:00
g_free ( table_text ) ;
}
break ;
}
}
g_string_append ( csv - > CSV_str , " \n " ) ;
2009-10-09 09:01:04 +00:00
2010-01-29 14:24:18 +00:00
return FALSE ;
2009-10-09 09:01:04 +00:00
}
2010-01-29 14:24:18 +00:00
2004-07-20 23:48:50 +00:00
static void
2007-11-30 14:36:18 +00:00
copy_as_csv_cb ( GtkWindow * copy_bt , gpointer data _U_ )
2004-07-20 23:48:50 +00:00
{
2010-01-29 14:24:18 +00:00
GtkClipboard * cb ;
char * savelocale ;
GList * columns , * list ;
2009-10-09 09:01:04 +00:00
GtkTreeViewColumn * column ;
2010-01-29 14:24:18 +00:00
GtkListStore * store ;
csv_t csv ;
2009-10-09 09:01:04 +00:00
2013-03-11 06:47:34 +00:00
csv . talkers = ( hostlist_table * ) g_object_get_data ( G_OBJECT ( copy_bt ) , HOST_PTR_KEY ) ;
2009-10-09 09:01:04 +00:00
if ( ! csv . talkers )
2009-03-18 14:44:15 +00:00
return ;
2009-10-09 09:01:04 +00:00
savelocale = setlocale ( LC_NUMERIC , NULL ) ;
setlocale ( LC_NUMERIC , " C " ) ;
csv . CSV_str = g_string_new ( " " ) ;
columns = gtk_tree_view_get_columns ( GTK_TREE_VIEW ( csv . talkers - > table ) ) ;
2009-10-09 09:06:22 +00:00
list = columns ;
2009-10-09 09:01:04 +00:00
csv . nb_cols = 0 ;
while ( columns ) {
2013-03-11 06:47:34 +00:00
column = ( GtkTreeViewColumn * ) columns - > data ;
2009-10-09 09:01:04 +00:00
if ( gtk_tree_view_column_get_visible ( column ) ) {
csv . columns_order [ csv . nb_cols ] = gtk_tree_view_column_get_sort_column_id ( column ) ;
if ( csv . nb_cols )
g_string_append ( csv . CSV_str , " , " ) ;
2010-11-17 03:29:12 +00:00
g_string_append_printf ( csv . CSV_str , " \" %s \" " , gtk_tree_view_column_get_title ( column ) ) ;
2009-10-09 09:01:04 +00:00
csv . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
columns = g_list_next ( columns ) ;
2008-08-05 17:33:14 +00:00
}
2009-10-09 09:06:22 +00:00
g_list_free ( list ) ;
2009-10-09 09:01:04 +00:00
g_string_append ( csv . CSV_str , " \n " ) ;
store = GTK_LIST_STORE ( gtk_tree_view_get_model ( GTK_TREE_VIEW ( csv . talkers - > table ) ) ) ;
gtk_tree_model_foreach ( GTK_TREE_MODEL ( store ) , csv_handle , & csv ) ;
2004-07-20 23:48:50 +00:00
2009-03-18 14:44:15 +00:00
/* Now that we have the CSV data, copy it into the default clipboard */
2009-10-09 09:01:04 +00:00
cb = gtk_clipboard_get ( GDK_SELECTION_CLIPBOARD ) ; /* Get the default clipboard */
gtk_clipboard_set_text ( cb , csv . CSV_str - > str , - 1 ) ; /* Copy the CSV data into the clipboard */
setlocale ( LC_NUMERIC , savelocale ) ;
g_string_free ( csv . CSV_str , TRUE ) ; /* Free the memory */
2008-08-05 17:33:14 +00:00
}
2004-07-20 23:48:50 +00:00
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
2009-10-09 09:01:04 +00:00
typedef struct {
2010-01-29 14:24:18 +00:00
int nb_cols ;
gint32 col_lat , col_lon , col_country , col_city , col_as_num , col_ip , col_packets , col_bytes ;
FILE * out_file ;
gboolean hosts_written ;
hostlist_table * talkers ;
2009-10-09 09:01:04 +00:00
} map_t ;
2012-12-26 05:57:06 +00:00
static const char * map_endpoint_opener ;
2012-09-26 12:54:46 +00:00
static void
map_init ( void )
{
map_endpoint_opener = " { \n " ;
}
2009-10-09 09:01:04 +00:00
/* XXX output in C locale */
static gboolean
map_handle ( GtkTreeModel * model , GtkTreePath * path _U_ , GtkTreeIter * iter ,
gpointer data )
{
2010-01-29 14:24:18 +00:00
map_t * map = ( map_t * ) data ;
2012-04-05 22:10:53 +00:00
gchar * table_entry , * esc_entry ;
2009-10-09 09:01:04 +00:00
guint64 value ;
/* Add the column values to the TSV data */
/* check, if we have a geolocation available for this host */
gtk_tree_model_get ( model , iter , map - > col_lat , & table_entry , - 1 ) ;
if ( strcmp ( table_entry , " - " ) = = 0 ) {
g_free ( table_entry ) ;
return FALSE ;
}
gtk_tree_model_get ( model , iter , map - > col_lon , & table_entry , - 1 ) ;
if ( strcmp ( table_entry , " - " ) = = 0 ) {
g_free ( table_entry ) ;
return FALSE ;
}
2012-04-05 22:10:53 +00:00
/*
{
' type ' : ' Feature ' , ' geometry ' : { ' type ' : ' Point ' , ' coordinates ' : [ - 122.583889 , 37.898889 ] } ,
' properties ' : { ' title ' : ' host . example . com ' , ' description ' : ' AS : AS12345 Ewok Holdings , Inc . < br / > Country : US < br / > City : Muir Woods , CA < br / > Packets : 6 < br / > Bytes : 980 ' }
} ,
*/
2012-09-26 12:54:46 +00:00
fputs ( map_endpoint_opener , map - > out_file ) ;
2012-04-05 22:10:53 +00:00
fputs ( " 'type': 'Feature', 'geometry': { 'type': 'Point', 'coordinates': [ " , map - > out_file ) ;
2009-10-09 09:01:04 +00:00
2010-02-16 23:10:00 +00:00
/* Longitude */
2009-10-09 09:01:04 +00:00
gtk_tree_model_get ( model , iter , map - > col_lon , & table_entry , - 1 ) ;
fputs ( table_entry , map - > out_file ) ;
g_free ( table_entry ) ;
2012-04-05 22:10:53 +00:00
fputs ( " , " , map - > out_file ) ;
/* Latitude */
gtk_tree_model_get ( model , iter , map - > col_lat , & table_entry , - 1 ) ;
fputs ( table_entry , map - > out_file ) ;
g_free ( table_entry ) ;
fputs ( " ] }, \n " , map - > out_file ) ;
fputs ( " 'properties': { 'title': ' " , map - > out_file ) ;
2009-10-09 09:01:04 +00:00
2010-02-16 23:10:00 +00:00
/* Title */
2009-10-09 09:01:04 +00:00
gtk_tree_model_get ( model , iter , map - > col_ip , & table_entry , - 1 ) ;
2012-04-05 22:10:53 +00:00
esc_entry = string_replace ( table_entry , " ' " , " ' " ) ;
fputs ( esc_entry , map - > out_file ) ;
2009-10-09 09:01:04 +00:00
g_free ( table_entry ) ;
2012-04-05 22:10:53 +00:00
g_free ( esc_entry ) ;
fputs ( " ', 'description': ' " , map - > out_file ) ;
2009-10-09 09:01:04 +00:00
2010-02-16 23:10:00 +00:00
/* Description */
if ( map - > col_as_num > = 0 ) {
gtk_tree_model_get ( model , iter , map - > col_as_num , & table_entry , - 1 ) ;
fputs ( " AS: " , map - > out_file ) ;
2012-04-05 22:10:53 +00:00
esc_entry = string_replace ( table_entry , " ' " , " ' " ) ;
fputs ( esc_entry , map - > out_file ) ;
2010-02-16 23:10:00 +00:00
g_free ( table_entry ) ;
2012-04-05 22:10:53 +00:00
g_free ( esc_entry ) ;
2010-02-16 23:10:00 +00:00
fputs ( " <br/> " , map - > out_file ) ;
}
2009-10-09 09:01:04 +00:00
2010-02-16 23:10:00 +00:00
if ( map - > col_country > = 0 ) {
gtk_tree_model_get ( model , iter , map - > col_country , & table_entry , - 1 ) ;
fputs ( " Country: " , map - > out_file ) ;
2012-04-05 22:10:53 +00:00
esc_entry = string_replace ( table_entry , " ' " , " ' " ) ;
fputs ( esc_entry , map - > out_file ) ;
2010-02-16 23:10:00 +00:00
g_free ( table_entry ) ;
2012-04-05 22:10:53 +00:00
g_free ( esc_entry ) ;
2010-02-16 23:10:00 +00:00
fputs ( " <br/> " , map - > out_file ) ;
}
2009-10-09 09:01:04 +00:00
2010-02-16 23:10:00 +00:00
if ( map - > col_country > = 0 ) {
gtk_tree_model_get ( model , iter , map - > col_city , & table_entry , - 1 ) ;
fputs ( " City: " , map - > out_file ) ;
2012-04-05 22:10:53 +00:00
esc_entry = string_replace ( table_entry , " ' " , " ' " ) ;
fputs ( esc_entry , map - > out_file ) ;
2010-02-16 23:10:00 +00:00
g_free ( table_entry ) ;
2012-04-05 22:10:53 +00:00
g_free ( esc_entry ) ;
2010-02-16 23:10:00 +00:00
fputs ( " <br/> " , map - > out_file ) ;
}
2009-10-09 09:01:04 +00:00
gtk_tree_model_get ( model , iter , map - > col_packets , & value , - 1 ) ;
fprintf ( map - > out_file , " Packets: % " G_GINT64_MODIFIER " u<br/> " , value ) ;
gtk_tree_model_get ( model , iter , map - > col_bytes , & value , - 1 ) ;
2012-04-05 22:10:53 +00:00
fprintf ( map - > out_file , " Bytes: % " G_GINT64_MODIFIER " u " , value ) ;
2009-10-09 09:01:04 +00:00
/* XXX - we could add specific icons, e.g. depending on the amount of packets or bytes */
2012-04-05 22:10:53 +00:00
fputs ( " ' } \n " , map - > out_file ) ;
2012-09-26 03:30:48 +00:00
fputs ( " } " , map - > out_file ) ;
2012-09-26 12:54:46 +00:00
map_endpoint_opener = " , \n { \n " ;
2012-09-26 03:30:48 +00:00
2009-10-09 09:01:04 +00:00
map - > hosts_written = TRUE ;
2010-01-29 14:24:18 +00:00
return FALSE ;
2009-10-09 09:01:04 +00:00
}
2012-04-05 22:10:53 +00:00
# define MAX_TPL_LINE_LEN 4096
2009-02-11 20:25:17 +00:00
static void
open_as_map_cb ( GtkWindow * copy_bt , gpointer data _U_ )
{
2012-04-05 22:10:53 +00:00
guint32 i ;
2010-01-29 14:24:18 +00:00
gchar * file_uri ;
gboolean uri_open ;
2012-04-05 22:10:53 +00:00
char * map_path , * map_filename ;
char * tpl_filename ;
char * tpl_line ;
2010-01-29 14:24:18 +00:00
GList * columns , * list ;
2009-10-09 09:01:04 +00:00
GtkTreeViewColumn * column ;
2010-01-29 14:24:18 +00:00
GtkListStore * store ;
map_t map ;
2012-04-05 22:10:53 +00:00
FILE * tpl_file ;
2009-03-18 14:44:15 +00:00
2013-03-11 06:47:34 +00:00
map . talkers = ( hostlist_table * ) g_object_get_data ( G_OBJECT ( copy_bt ) , HOST_PTR_KEY ) ;
2009-10-09 09:01:04 +00:00
if ( ! map . talkers )
2009-03-18 14:44:15 +00:00
return ;
2009-10-09 09:01:04 +00:00
map . col_lat = map . col_lon = map . col_country = map . col_city = map . col_as_num = map . col_ip = map . col_packets = map . col_bytes = - 1 ;
map . hosts_written = FALSE ;
2009-03-18 14:44:15 +00:00
/* Find the interesting columns */
2009-10-09 09:01:04 +00:00
columns = gtk_tree_view_get_columns ( GTK_TREE_VIEW ( map . talkers - > table ) ) ;
2009-10-09 09:06:22 +00:00
list = columns ;
2009-10-09 09:01:04 +00:00
map . nb_cols = 0 ;
while ( columns ) {
2013-03-11 06:47:34 +00:00
column = ( GtkTreeViewColumn * ) columns - > data ;
2009-10-09 09:01:04 +00:00
i = gtk_tree_view_column_get_sort_column_id ( column ) ;
if ( strcmp ( map . talkers - > default_titles [ i ] , " Latitude " ) = = 0 ) {
map . col_lat = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " Longitude " ) = = 0 ) {
map . col_lon = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " Country " ) = = 0 ) {
map . col_country = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " City " ) = = 0 ) {
map . col_city = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " AS Number " ) = = 0 ) {
map . col_as_num = i ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " Address " ) = = 0 ) {
map . col_ip = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " Packets " ) = = 0 ) {
map . col_packets = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
if ( strcmp ( map . talkers - > default_titles [ i ] , " Bytes " ) = = 0 ) {
map . col_bytes = i ;
map . nb_cols + + ;
2009-03-18 14:44:15 +00:00
}
2009-10-09 09:01:04 +00:00
columns = g_list_next ( columns ) ;
2009-02-11 20:25:17 +00:00
}
2009-10-09 09:06:22 +00:00
g_list_free ( list ) ;
2009-09-06 14:25:47 +00:00
2009-03-18 14:44:15 +00:00
/* check for the minimum required data */
2009-10-09 09:01:04 +00:00
if ( map . col_lat = = - 1 | | map . col_lon = = - 1 ) {
2009-03-18 14:44:15 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " Latitude/Longitude data not available (GeoIP installed?) " ) ;
return ;
2009-02-11 20:25:17 +00:00
}
2009-03-18 14:44:15 +00:00
2012-04-05 22:10:53 +00:00
/* Create a location map HTML file from a template */
2009-03-18 14:44:15 +00:00
/* XXX - add error handling */
2012-04-05 22:10:53 +00:00
tpl_filename = get_datafile_path ( " ipmap.html " ) ;
tpl_file = ws_fopen ( tpl_filename , " r " ) ;
if ( tpl_file = = NULL ) {
open_failure_alert_box ( tpl_filename , errno , FALSE ) ;
g_free ( tpl_filename ) ;
return ;
}
g_free ( tpl_filename ) ;
/* We should probably create a file with a temporary name and a .html extension instead */
2009-07-02 17:20:27 +00:00
if ( ! create_tempdir ( & map_path , " Wireshark IP Map " ) ) {
2009-06-14 22:19:08 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2009-07-02 17:20:27 +00:00
" Could not create temporary directory \n %s " ,
map_path ) ;
2012-05-15 22:25:35 +00:00
fclose ( tpl_file ) ;
2009-06-14 22:19:08 +00:00
return ;
}
2012-04-05 22:10:53 +00:00
map_filename = g_strdup_printf ( " %s%cipmap.html " , map_path , G_DIR_SEPARATOR ) ;
map . out_file = ws_fopen ( map_filename , " w " ) ;
2009-10-09 09:01:04 +00:00
if ( map . out_file = = NULL ) {
2012-04-05 22:10:53 +00:00
open_failure_alert_box ( map_filename , errno , TRUE ) ;
g_free ( map_filename ) ;
fclose ( tpl_file ) ;
2009-03-18 14:44:15 +00:00
return ;
2009-02-11 20:25:17 +00:00
}
2009-03-18 14:44:15 +00:00
2009-10-09 09:01:04 +00:00
store = GTK_LIST_STORE ( gtk_tree_view_get_model ( GTK_TREE_VIEW ( map . talkers - > table ) ) ) ;
2013-03-11 06:47:34 +00:00
tpl_line = ( char * ) g_malloc ( MAX_TPL_LINE_LEN ) ;
2009-03-18 14:44:15 +00:00
2012-04-05 22:10:53 +00:00
while ( fgets ( tpl_line , MAX_TPL_LINE_LEN , tpl_file ) ! = NULL ) {
fputs ( tpl_line , map . out_file ) ;
/* MUST match ipmap.html */
if ( strstr ( tpl_line , " // Start endpoint list " ) ) {
2012-09-26 12:54:46 +00:00
map_init ( ) ;
2012-04-05 22:10:53 +00:00
gtk_tree_model_foreach ( GTK_TREE_MODEL ( store ) , map_handle , & map ) ;
}
}
g_free ( tpl_line ) ;
2009-03-18 14:44:15 +00:00
2012-04-05 22:10:53 +00:00
fclose ( tpl_file ) ;
2009-10-09 09:01:04 +00:00
fclose ( map . out_file ) ;
2009-03-18 14:44:15 +00:00
2009-10-09 09:01:04 +00:00
if ( ! map . hosts_written ) {
2009-06-14 22:19:08 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " No latitude/longitude data found " ) ;
2012-04-05 22:10:53 +00:00
g_free ( map_filename ) ;
2009-06-14 22:19:08 +00:00
return ;
}
2009-03-18 14:44:15 +00:00
/* open the webbrowser */
2012-09-18 21:51:22 +00:00
file_uri = g_filename_to_uri ( map_filename , NULL , NULL ) ;
2012-04-05 22:10:53 +00:00
g_free ( map_filename ) ;
2009-03-18 14:44:15 +00:00
uri_open = browser_open_url ( file_uri ) ;
if ( ! uri_open ) {
2009-07-02 17:20:27 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " Couldn't open the file: \" %s \" in your web browser " , file_uri ) ;
2009-03-18 14:44:15 +00:00
g_free ( file_uri ) ;
return ;
2009-02-12 01:44:17 +00:00
}
2009-02-11 20:25:17 +00:00
g_free ( file_uri ) ;
}
# endif /* HAVE_GEOIP */
2009-10-09 09:01:04 +00:00
static gint default_col_size [ N_COLUMNS ] ;
static void
init_default_col_size ( GtkWidget * view )
{
default_col_size [ ADR_COLUMN ] = get_default_col_size ( view , " 00000000.000000000000 " ) ;
default_col_size [ PORT_COLUMN ] = get_default_col_size ( view , " 000000 " ) ;
default_col_size [ PACKETS_COLUMN ] = get_default_col_size ( view , " 00 000 000 " ) ;
default_col_size [ BYTES_COLUMN ] = get_default_col_size ( view , " 0 000 000 000 " ) ;
2010-08-30 16:10:01 +00:00
default_col_size [ PKT_AB_COLUMN ] = default_col_size [ PACKETS_COLUMN ] ;
2009-10-09 09:01:04 +00:00
default_col_size [ PKT_BA_COLUMN ] = default_col_size [ PACKETS_COLUMN ] ;
default_col_size [ BYTES_AB_COLUMN ] = default_col_size [ BYTES_COLUMN ] ;
default_col_size [ BYTES_BA_COLUMN ] = default_col_size [ BYTES_COLUMN ] ;
# ifdef HAVE_GEOIP
default_col_size [ GEOIP1_COLUMN ] = default_col_size [ ADR_COLUMN ] ;
default_col_size [ GEOIP2_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP3_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP4_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP5_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP6_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP7_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP8_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP9_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP10_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP11_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP12_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
default_col_size [ GEOIP13_COLUMN ] = default_col_size [ GEOIP1_COLUMN ] ;
# endif
}
2004-07-20 23:48:50 +00:00
2004-06-03 21:46:27 +00:00
static gboolean
2010-08-30 16:10:01 +00:00
init_hostlist_table_page ( hostlist_table * hosttable , GtkWidget * vbox , gboolean hide_ports , const char * table_name , const char * tap_name ,
2009-10-09 09:01:04 +00:00
const char * filter , tap_packet_cb packet_func )
2004-02-20 09:09:12 +00:00
{
2008-10-27 04:50:57 +00:00
guint i ;
2004-06-01 23:00:24 +00:00
GString * error_string ;
char title [ 256 ] ;
2009-10-09 09:01:04 +00:00
GtkListStore * store ;
GtkWidget * tree ;
GtkTreeViewColumn * column ;
GtkCellRenderer * renderer ;
GtkTreeSortable * sortable ;
GtkTreeSelection * sel ;
static gboolean col_size = FALSE ;
2004-07-20 23:48:50 +00:00
2008-10-27 04:50:57 +00:00
hosttable - > default_titles [ 0 ] = " Address " ;
hosttable - > default_titles [ 1 ] = " Port " ;
hosttable - > default_titles [ 2 ] = " Packets " ;
hosttable - > default_titles [ 3 ] = " Bytes " ;
hosttable - > default_titles [ 4 ] = " Tx Packets " ;
hosttable - > default_titles [ 5 ] = " Tx Bytes " ;
hosttable - > default_titles [ 6 ] = " Rx Packets " ;
hosttable - > default_titles [ 7 ] = " Rx Bytes " ;
# ifdef HAVE_GEOIP
for ( i = 0 ; i < NUM_GEOIP_COLS ; i + + ) {
2008-12-23 18:56:31 +00:00
if ( i < geoip_db_num_dbs ( ) ) {
2008-10-27 04:50:57 +00:00
hosttable - > default_titles [ NUM_BUILTIN_COLS + i ] = geoip_db_name ( i ) ;
} else {
hosttable - > default_titles [ NUM_BUILTIN_COLS + i ] = " " ;
}
}
# endif /* HAVE_GEOIP */
2008-04-25 19:42:27 +00:00
if ( strcmp ( table_name , " NCP " ) = = 0 ) {
hosttable - > default_titles [ 1 ] = " Connection " ;
}
2004-07-20 23:48:50 +00:00
hosttable - > has_ports = ! hide_ports ;
hosttable - > num_hosts = 0 ;
hosttable - > resolve_names = TRUE ;
2008-02-17 00:35:55 +00:00
hosttable - > page_lb = NULL ;
2009-10-09 09:01:04 +00:00
hosttable - > fixed_col = FALSE ;
hosttable - > geoip_visible = FALSE ;
2004-06-01 23:00:24 +00:00
2009-03-18 14:44:15 +00:00
g_snprintf ( title , sizeof ( title ) , " %s Endpoints " , table_name ) ;
2008-08-05 17:33:14 +00:00
hosttable - > name_lb = gtk_label_new ( title ) ;
2008-02-17 00:35:55 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hosttable - > name_lb , FALSE , FALSE , 0 ) ;
2004-06-01 23:00:24 +00:00
2009-10-09 09:01:04 +00:00
/* Create the store */
2010-01-29 14:24:18 +00:00
store = gtk_list_store_new ( N_COLUMNS , /* Total number of columns */
2009-10-09 09:01:04 +00:00
G_TYPE_STRING , /* Address */
G_TYPE_STRING , /* Port */
G_TYPE_UINT64 , /* Packets */
G_TYPE_UINT64 , /* Bytes */
G_TYPE_UINT64 , /* Packets A->B */
G_TYPE_UINT64 , /* Bytes A->B */
G_TYPE_UINT64 , /* Packets A<-B */
G_TYPE_UINT64 , /* Bytes A<-B */
# ifdef HAVE_GEOIP
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
G_TYPE_STRING ,
# endif
G_TYPE_UINT ) ; /* Index */
2004-06-01 23:00:24 +00:00
hosttable - > scrolled_window = scrolled_window_new ( NULL , NULL ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , hosttable - > scrolled_window , TRUE , TRUE , 0 ) ;
2009-10-09 09:01:04 +00:00
tree = gtk_tree_view_new_with_model ( GTK_TREE_MODEL ( store ) ) ;
hosttable - > table = GTK_TREE_VIEW ( tree ) ;
sortable = GTK_TREE_SORTABLE ( store ) ;
g_object_unref ( G_OBJECT ( store ) ) ;
if ( ! col_size ) {
col_size = TRUE ;
init_default_col_size ( GTK_WIDGET ( hosttable - > table ) ) ;
2004-06-01 23:00:24 +00:00
}
2010-08-30 16:10:01 +00:00
2009-10-09 09:01:04 +00:00
g_object_set_data ( G_OBJECT ( store ) , HOST_PTR_KEY , hosttable ) ;
g_object_set_data ( G_OBJECT ( hosttable - > table ) , HOST_PTR_KEY , hosttable ) ;
for ( i = 0 ; i < N_COLUMNS - 1 ; i + + ) {
renderer = gtk_cell_renderer_text_new ( ) ;
g_object_set ( renderer , " ypad " , 0 , NULL ) ;
switch ( i ) {
case 0 : /* address and port */
case 1 :
2010-08-30 16:10:01 +00:00
column = gtk_tree_view_column_new_with_attributes ( hosttable - > default_titles [ i ] , renderer , " text " ,
2010-01-29 14:24:18 +00:00
i , NULL ) ;
2009-10-09 09:01:04 +00:00
if ( hide_ports & & i = = 1 ) {
2010-01-29 14:24:18 +00:00
/* hide srcport and dstport if we don't use ports */
gtk_tree_view_column_set_visible ( column , FALSE ) ;
2009-10-09 09:01:04 +00:00
}
gtk_tree_sortable_set_sort_func ( sortable , i , hostlist_sort_column , GINT_TO_POINTER ( i ) , NULL ) ;
break ;
case 2 : /* counts */
2010-08-30 16:10:01 +00:00
case 3 :
case 4 :
2009-10-09 09:01:04 +00:00
case 5 :
case 6 :
case 7 : /* right align numbers */
g_object_set ( G_OBJECT ( renderer ) , " xalign " , 1.0 , NULL ) ;
column = gtk_tree_view_column_new_with_attributes ( hosttable - > default_titles [ i ] , renderer , NULL ) ;
gtk_tree_view_column_set_cell_data_func ( column , renderer , u64_data_func , GINT_TO_POINTER ( i ) , NULL ) ;
break ;
default : /* GEOIP */
2010-08-30 16:10:01 +00:00
column = gtk_tree_view_column_new_with_attributes ( hosttable - > default_titles [ i ] , renderer , " text " ,
2010-01-29 14:24:18 +00:00
i , NULL ) ;
gtk_tree_view_column_set_visible ( column , FALSE ) ;
2010-02-28 20:56:21 +00:00
# ifdef HAVE_GEOIP
if ( i > = NUM_BUILTIN_COLS & & i - NUM_BUILTIN_COLS < geoip_db_num_dbs ( ) ) {
int goip_type = geoip_db_type ( i - NUM_BUILTIN_COLS ) ;
if ( goip_type = = WS_LON_FAKE_EDITION | | goip_type = = WS_LAT_FAKE_EDITION ) {
g_object_set ( G_OBJECT ( renderer ) , " xalign " , 1.0 , NULL ) ;
gtk_tree_sortable_set_sort_func ( sortable , i , hostlist_sort_column , GINT_TO_POINTER ( i ) , NULL ) ;
}
}
# endif
2009-10-09 09:01:04 +00:00
break ;
}
gtk_tree_view_column_set_sort_column_id ( column , i ) ;
gtk_tree_view_column_set_resizable ( column , TRUE ) ;
gtk_tree_view_column_set_reorderable ( column , TRUE ) ;
gtk_tree_view_column_set_min_width ( column , 40 ) ;
gtk_tree_view_column_set_fixed_width ( column , default_col_size [ i ] ) ;
gtk_tree_view_append_column ( hosttable - > table , column ) ;
#if 0
/* make total frames be the default sort order, too slow */
if ( i = = PACKETS_COLUMN ) {
gtk_tree_view_column_clicked ( column ) ;
}
2010-08-30 16:10:01 +00:00
# endif
2007-11-30 14:36:18 +00:00
}
2004-05-03 22:15:22 +00:00
2004-06-01 23:00:24 +00:00
gtk_container_add ( GTK_CONTAINER ( hosttable - > scrolled_window ) , ( GtkWidget * ) hosttable - > table ) ;
2004-02-20 09:09:12 +00:00
2004-06-01 23:00:24 +00:00
hosttable - > num_hosts = 0 ;
hosttable - > hosts = NULL ;
2009-10-09 09:01:04 +00:00
hosttable - > hashtable = NULL ;
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
gtk_tree_view_set_rules_hint ( hosttable - > table , TRUE ) ;
gtk_tree_view_set_headers_clickable ( hosttable - > table , TRUE ) ;
gtk_tree_view_set_reorderable ( hosttable - > table , TRUE ) ;
2004-02-20 09:09:12 +00:00
2009-10-09 09:01:04 +00:00
sel = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( hosttable - > table ) ) ;
gtk_tree_selection_set_mode ( sel , GTK_SELECTION_SINGLE ) ;
2008-10-27 04:50:57 +00:00
2004-06-01 23:00:24 +00:00
/* create popup menu for this table */
hostlist_create_popup_menu ( hosttable ) ;
2004-02-20 09:09:12 +00:00
2004-06-01 23:00:24 +00:00
/* register the tap and rerun the taps on the packet list */
2009-06-05 22:42:47 +00:00
error_string = register_tap_listener ( tap_name , hosttable , filter , 0 , reset_hostlist_table_data_cb , packet_func , draw_hostlist_table_data_cb ) ;
2004-06-01 23:00:24 +00:00
if ( error_string ) {
2008-10-31 09:53:56 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " %s " , error_string - > str ) ;
2004-06-01 23:00:24 +00:00
g_string_free ( error_string , TRUE ) ;
g_free ( hosttable ) ;
return FALSE ;
}
2004-05-02 21:16:09 +00:00
return TRUE ;
}
void
2005-08-05 22:36:28 +00:00
init_hostlist_table ( gboolean hide_ports , const char * table_name , const char * tap_name , const char * filter , tap_packet_cb packet_func )
2004-05-02 21:16:09 +00:00
{
2004-06-01 23:00:24 +00:00
hostlist_table * hosttable ;
2012-06-03 22:03:05 +00:00
char * display_name ;
2004-06-01 23:00:24 +00:00
char title [ 256 ] ;
2004-05-02 21:16:09 +00:00
GtkWidget * vbox ;
GtkWidget * bbox ;
2005-01-20 23:17:23 +00:00
GtkWidget * close_bt , * help_bt ;
2004-05-02 21:16:09 +00:00
gboolean ret ;
2007-11-30 14:36:18 +00:00
GtkWidget * copy_bt ;
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
GtkWidget * map_bt ;
# endif
2013-03-21 18:39:16 +00:00
window_geometry_t tl_geom ;
2004-06-03 21:46:27 +00:00
2013-03-11 06:47:34 +00:00
hosttable = g_new ( hostlist_table , 1 ) ;
2004-05-02 21:16:09 +00:00
2004-06-01 23:00:24 +00:00
hosttable - > name = table_name ;
2008-02-17 00:35:55 +00:00
hosttable - > filter = filter ;
hosttable - > use_dfilter = FALSE ;
2012-06-03 22:03:05 +00:00
display_name = cf_get_display_name ( & cfile ) ;
g_snprintf ( title , sizeof ( title ) , " %s Endpoints: %s " , table_name , display_name ) ;
g_free ( display_name ) ;
2010-01-29 14:24:18 +00:00
hosttable - > win = dlg_window_new ( title ) ; /* transient_for top_level */
gtk_window_set_destroy_with_parent ( GTK_WINDOW ( hosttable - > win ) , TRUE ) ;
2008-08-05 17:33:14 +00:00
2013-03-21 18:39:16 +00:00
window_get_geometry ( top_level , & tl_geom ) ;
gtk_window_set_default_size ( GTK_WINDOW ( hosttable - > win ) , tl_geom . width * 8 / 10 , HL_DLG_HEIGHT ) ;
2004-05-02 21:16:09 +00:00
2013-03-21 18:39:16 +00:00
vbox = ws_gtk_box_new ( GTK_ORIENTATION_VERTICAL , DLG_LABEL_SPACING , FALSE ) ;
2004-06-01 23:00:24 +00:00
gtk_container_add ( GTK_CONTAINER ( hosttable - > win ) , vbox ) ;
2013-03-21 18:39:16 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , DLG_OUTER_MARGIN ) ;
2004-05-02 21:16:09 +00:00
ret = init_hostlist_table_page ( hosttable , vbox , hide_ports , table_name , tap_name , filter , packet_func ) ;
if ( ret = = FALSE ) {
2004-06-01 23:00:24 +00:00
g_free ( hosttable ) ;
2004-05-02 21:16:09 +00:00
return ;
}
2004-06-01 23:00:24 +00:00
/* Button row. */
2007-11-30 14:36:18 +00:00
/* XXX - maybe we want to have a "Copy as CSV" stock button here? */
/*copy_bt = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
2012-09-26 15:45:08 +00:00
if ( strstr ( table_name , " IPv4 " ) | | strstr ( table_name , " IPv6 " ) ) {
2009-02-12 01:44:17 +00:00
bbox = dlg_button_row_new ( GTK_STOCK_CLOSE , GTK_STOCK_COPY , WIRESHARK_STOCK_MAP , GTK_STOCK_HELP , NULL ) ;
} else {
bbox = dlg_button_row_new ( GTK_STOCK_CLOSE , GTK_STOCK_COPY , GTK_STOCK_HELP , NULL ) ;
}
2009-09-06 14:25:47 +00:00
# else
2008-06-21 13:36:31 +00:00
bbox = dlg_button_row_new ( GTK_STOCK_CLOSE , GTK_STOCK_COPY , GTK_STOCK_HELP , NULL ) ;
2009-02-11 20:25:17 +00:00
# endif
2008-04-07 03:46:01 +00:00
2004-06-01 23:00:24 +00:00
gtk_box_pack_end ( GTK_BOX ( vbox ) , bbox , FALSE , FALSE , 0 ) ;
2004-04-12 07:10:11 +00:00
2013-03-11 06:47:34 +00:00
close_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , GTK_STOCK_CLOSE ) ;
2004-05-23 23:24:07 +00:00
window_set_cancel_button ( hosttable - > win , close_bt , window_cancel_button_cb ) ;
2004-04-12 07:10:11 +00:00
2013-03-11 06:47:34 +00:00
copy_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , GTK_STOCK_COPY ) ;
2011-09-21 18:55:03 +00:00
gtk_widget_set_tooltip_text ( copy_bt , " Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format. " ) ;
2008-04-11 16:26:32 +00:00
g_object_set_data ( G_OBJECT ( copy_bt ) , HOST_PTR_KEY , hosttable ) ;
2008-04-11 23:16:06 +00:00
g_signal_connect ( copy_bt , " clicked " , G_CALLBACK ( copy_as_csv_cb ) , NULL ) ;
2007-11-30 14:36:18 +00:00
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
2013-03-11 06:47:34 +00:00
map_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , WIRESHARK_STOCK_MAP ) ;
2009-02-12 01:44:17 +00:00
if ( map_bt ! = NULL ) {
2011-07-12 06:15:24 +00:00
gtk_widget_set_tooltip_text ( map_bt , " Show a map of the IP addresses (internet connection required). " ) ;
2009-02-12 01:44:17 +00:00
g_object_set_data ( G_OBJECT ( map_bt ) , HOST_PTR_KEY , hosttable ) ;
g_signal_connect ( map_bt , " clicked " , G_CALLBACK ( open_as_map_cb ) , NULL ) ;
}
2009-02-11 20:25:17 +00:00
# endif /* HAVE_GEOIP */
2009-09-06 14:25:47 +00:00
2013-03-11 06:47:34 +00:00
help_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , GTK_STOCK_HELP ) ;
2008-06-21 13:36:31 +00:00
g_signal_connect ( help_bt , " clicked " , G_CALLBACK ( topic_cb ) , ( gpointer ) HELP_STATS_ENDPOINTS_DIALOG ) ;
2005-01-20 23:17:23 +00:00
2008-04-11 23:16:06 +00:00
g_signal_connect ( hosttable - > win , " delete_event " , G_CALLBACK ( window_delete_event_cb ) , NULL ) ;
g_signal_connect ( hosttable - > win , " destroy " , G_CALLBACK ( hostlist_win_destroy_cb ) , hosttable ) ;
2004-04-12 07:10:11 +00:00
2004-06-01 23:00:24 +00:00
gtk_widget_show_all ( hosttable - > win ) ;
2004-05-23 23:24:07 +00:00
window_present ( hosttable - > win ) ;
2009-06-05 22:42:47 +00:00
cf_retap_packets ( & cfile ) ;
2011-02-07 18:41:38 +00:00
gdk_window_raise ( gtk_widget_get_window ( hosttable - > win ) ) ;
2004-02-20 09:09:12 +00:00
}
2004-05-02 21:16:09 +00:00
2007-11-30 14:36:18 +00:00
static void
2011-07-13 22:32:05 +00:00
ct_nb_switch_page_cb ( GtkNotebook * nb , gpointer * pg _U_ , guint page , gpointer data )
2007-11-30 14:36:18 +00:00
{
GtkWidget * copy_bt = ( GtkWidget * ) data ;
2013-03-11 06:47:34 +00:00
void * * pages = ( void * * ) g_object_get_data ( G_OBJECT ( nb ) , NB_PAGES_KEY ) ;
2007-11-30 14:36:18 +00:00
page + + ;
if ( pages & & page > 0 & & ( int ) page < = GPOINTER_TO_INT ( pages [ 0 ] ) & & copy_bt ) {
2008-04-11 16:26:32 +00:00
g_object_set_data ( G_OBJECT ( copy_bt ) , HOST_PTR_KEY , pages [ page ] ) ;
2007-11-30 14:36:18 +00:00
}
}
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
static void
2011-07-13 22:32:05 +00:00
ct_nb_map_switch_page_cb ( GtkNotebook * nb , gpointer * pg _U_ , guint page , gpointer data )
2009-02-11 20:25:17 +00:00
{
2010-10-11 08:29:25 +00:00
GtkWidget * map_bt = ( GtkWidget * ) data ;
2013-03-11 06:47:34 +00:00
void * * pages = ( void * * ) g_object_get_data ( G_OBJECT ( nb ) , NB_PAGES_KEY ) ;
2009-02-11 20:25:17 +00:00
page + + ;
2010-10-11 08:29:25 +00:00
if ( pages & & page > 0 & & ( int ) page < = GPOINTER_TO_INT ( pages [ 0 ] ) & & map_bt ) {
g_object_set_data ( G_OBJECT ( map_bt ) , HOST_PTR_KEY , pages [ page ] ) ;
2012-09-26 15:45:08 +00:00
if ( strstr ( ( ( hostlist_table * ) pages [ page ] ) - > name , " IPv4 " ) | |
strstr ( ( ( hostlist_table * ) pages [ page ] ) - > name , " IPv6 " ) ) {
2010-10-11 08:29:25 +00:00
gtk_widget_set_sensitive ( map_bt , TRUE ) ;
2009-02-12 01:44:17 +00:00
} else {
2010-10-11 08:29:25 +00:00
gtk_widget_set_sensitive ( map_bt , FALSE ) ;
2009-02-12 01:44:17 +00:00
}
2009-02-11 20:25:17 +00:00
}
}
# endif /* HAVE_GEOIP */
2007-11-30 14:36:18 +00:00
2004-05-02 21:16:09 +00:00
static void
hostlist_win_destroy_notebook_cb ( GtkWindow * win _U_ , gpointer data )
{
2013-03-11 06:47:34 +00:00
void * * pages = ( void * * ) data ;
2004-05-02 21:16:09 +00:00
int page ;
/* first "page" contains the number of pages */
for ( page = 1 ; page < = GPOINTER_TO_INT ( pages [ 0 ] ) ; page + + ) {
hostlist_win_destroy_cb ( NULL , pages [ page ] ) ;
}
2007-11-30 14:36:18 +00:00
g_free ( pages ) ;
2004-05-02 21:16:09 +00:00
}
2004-06-03 21:46:27 +00:00
static hostlist_table *
2010-08-30 16:10:01 +00:00
init_hostlist_notebook_page_cb ( gboolean hide_ports , const char * table_name , const char * tap_name , const char * filter ,
2009-10-09 09:01:04 +00:00
tap_packet_cb packet_func )
2004-05-02 21:16:09 +00:00
{
gboolean ret ;
GtkWidget * page_vbox ;
2004-06-01 23:00:24 +00:00
hostlist_table * hosttable ;
2004-05-02 21:16:09 +00:00
2013-03-11 06:47:34 +00:00
hosttable = g_new ( hostlist_table , 1 ) ;
2004-06-01 23:00:24 +00:00
hosttable - > name = table_name ;
2008-02-17 00:35:55 +00:00
hosttable - > filter = filter ;
hosttable - > use_dfilter = FALSE ;
2004-05-02 21:16:09 +00:00
2012-04-21 16:40:14 +00:00
page_vbox = ws_gtk_box_new ( GTK_ORIENTATION_VERTICAL , 6 , FALSE ) ;
2004-05-02 21:16:09 +00:00
hosttable - > win = page_vbox ;
2004-06-01 23:00:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( page_vbox ) , 6 ) ;
2004-05-02 21:16:09 +00:00
ret = init_hostlist_table_page ( hosttable , page_vbox , hide_ports , table_name , tap_name , filter , packet_func ) ;
if ( ret = = FALSE ) {
2004-06-01 23:00:24 +00:00
g_free ( hosttable ) ;
2004-05-02 21:16:09 +00:00
return NULL ;
}
return hosttable ;
}
typedef struct {
2005-01-01 12:49:54 +00:00
gboolean hide_ports ; /* hide TCP / UDP port columns */
2007-05-25 19:13:49 +00:00
const char * table_name ; /* GUI output name */
const char * tap_name ; /* internal name */
const char * filter ; /* display filter string (unused) */
2005-01-01 12:49:54 +00:00
tap_packet_cb packet_func ; /* function to be called for new incoming packets */
2004-05-02 21:16:09 +00:00
} register_hostlist_t ;
2004-06-03 21:46:27 +00:00
static GSList * registered_hostlist_tables = NULL ;
2004-05-02 21:16:09 +00:00
void
2007-05-25 19:13:49 +00:00
register_hostlist_table ( gboolean hide_ports , const char * table_name , const char * tap_name , const char * filter , tap_packet_cb packet_func )
2004-05-02 21:16:09 +00:00
{
register_hostlist_t * table ;
2013-03-11 06:47:34 +00:00
table = g_new ( register_hostlist_t , 1 ) ;
2004-05-02 21:16:09 +00:00
table - > hide_ports = hide_ports ;
table - > table_name = table_name ;
table - > tap_name = tap_name ;
table - > filter = filter ;
table - > packet_func = packet_func ;
registered_hostlist_tables = g_slist_append ( registered_hostlist_tables , table ) ;
}
2004-05-03 22:15:22 +00:00
static void
hostlist_resolve_toggle_dest ( GtkWidget * widget , gpointer data )
{
int page ;
2013-03-11 06:47:34 +00:00
void * * pages = ( void * * ) data ;
2004-05-03 22:15:22 +00:00
gboolean resolve_names ;
2004-06-01 23:00:24 +00:00
hostlist_table * hosttable ;
2004-05-03 22:15:22 +00:00
resolve_names = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ;
for ( page = 1 ; page < = GPOINTER_TO_INT ( pages [ 0 ] ) ; page + + ) {
2013-03-11 06:47:34 +00:00
hosttable = ( hostlist_table * ) pages [ page ] ;
2004-05-03 22:15:22 +00:00
hosttable - > resolve_names = resolve_names ;
draw_hostlist_table_addresses ( hosttable ) ;
}
}
2008-02-17 00:35:55 +00:00
static void
hostlist_filter_toggle_dest ( GtkWidget * widget , gpointer data )
{
int page ;
2013-03-11 06:47:34 +00:00
void * * pages = ( void * * ) data ;
2008-02-17 00:35:55 +00:00
gboolean use_filter ;
2008-10-13 18:16:35 +00:00
hostlist_table * hosttable = NULL ;
2008-02-17 00:35:55 +00:00
use_filter = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ;
for ( page = 1 ; page < = GPOINTER_TO_INT ( pages [ 0 ] ) ; page + + ) {
2013-03-11 06:47:34 +00:00
hosttable = ( hostlist_table * ) pages [ page ] ;
2009-02-12 01:44:17 +00:00
hosttable - > use_dfilter = use_filter ;
reset_hostlist_table_data ( hosttable ) ;
2008-02-17 00:35:55 +00:00
}
2009-06-05 22:42:47 +00:00
cf_retap_packets ( & cfile ) ;
2008-10-13 18:16:35 +00:00
if ( hosttable ) {
2011-02-07 18:41:38 +00:00
gdk_window_raise ( gtk_widget_get_window ( hosttable - > win ) ) ;
2008-10-13 18:16:35 +00:00
}
2008-02-17 00:35:55 +00:00
}
2004-05-02 21:16:09 +00:00
void
init_hostlist_notebook_cb ( GtkWidget * w _U_ , gpointer d _U_ )
{
2004-06-01 23:00:24 +00:00
hostlist_table * hosttable ;
2012-06-03 22:03:05 +00:00
char * display_name ;
2004-06-01 23:00:24 +00:00
char title [ 256 ] ;
2004-05-02 21:16:09 +00:00
GtkWidget * vbox ;
2004-05-03 22:15:22 +00:00
GtkWidget * hbox ;
2004-05-02 21:16:09 +00:00
GtkWidget * bbox ;
2005-01-20 23:17:23 +00:00
GtkWidget * close_bt , * help_bt ;
2004-05-02 21:16:09 +00:00
GtkWidget * win ;
2004-05-03 22:15:22 +00:00
GtkWidget * resolv_cb ;
2008-02-17 00:35:55 +00:00
GtkWidget * filter_cb ;
2004-05-02 21:16:09 +00:00
int page ;
void * * pages ;
GtkWidget * nb ;
GtkWidget * page_lb ;
GSList * current_table ;
register_hostlist_t * registered ;
2007-11-30 14:36:18 +00:00
GtkWidget * copy_bt ;
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
GtkWidget * map_bt ;
# endif
2013-03-21 18:39:16 +00:00
window_geometry_t tl_geom ;
2004-05-02 21:16:09 +00:00
2013-03-11 06:47:34 +00:00
pages = ( void * * ) g_malloc ( sizeof ( void * ) * ( g_slist_length ( registered_hostlist_tables ) + 1 ) ) ;
2004-05-02 21:16:09 +00:00
2010-01-29 14:24:18 +00:00
win = dlg_window_new ( " hostlist " ) ; /* transient_for top_level */
gtk_window_set_destroy_with_parent ( GTK_WINDOW ( win ) , TRUE ) ;
2009-06-22 15:22:37 +00:00
2012-06-03 22:03:05 +00:00
display_name = cf_get_display_name ( & cfile ) ;
g_snprintf ( title , sizeof ( title ) , " Endpoints: %s " , display_name ) ;
g_free ( display_name ) ;
2004-05-23 23:24:07 +00:00
gtk_window_set_title ( GTK_WINDOW ( win ) , title ) ;
2004-05-02 21:16:09 +00:00
2013-03-21 18:39:16 +00:00
window_get_geometry ( top_level , & tl_geom ) ;
gtk_window_set_default_size ( GTK_WINDOW ( win ) , tl_geom . width * 8 / 10 , HL_DLG_HEIGHT ) ;
vbox = ws_gtk_box_new ( GTK_ORIENTATION_VERTICAL , DLG_LABEL_SPACING , FALSE ) ;
2004-06-01 23:00:24 +00:00
gtk_container_add ( GTK_CONTAINER ( win ) , vbox ) ;
2013-03-21 18:39:16 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , DLG_OUTER_MARGIN ) ;
2004-05-02 21:16:09 +00:00
nb = gtk_notebook_new ( ) ;
2012-07-19 11:47:00 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , nb , TRUE , TRUE , 0 ) ;
2008-04-11 16:26:32 +00:00
g_object_set_data ( G_OBJECT ( nb ) , NB_PAGES_KEY , pages ) ;
2004-05-02 21:16:09 +00:00
page = 0 ;
current_table = registered_hostlist_tables ;
while ( current_table ) {
2013-03-11 06:47:34 +00:00
registered = ( register_hostlist_t * ) current_table - > data ;
2004-05-02 21:16:09 +00:00
page_lb = gtk_label_new ( " " ) ;
2009-10-09 09:01:04 +00:00
hosttable = init_hostlist_notebook_page_cb ( registered - > hide_ports , registered - > table_name , registered - > tap_name ,
registered - > filter , registered - > packet_func ) ;
2008-04-11 16:26:32 +00:00
g_object_set_data ( G_OBJECT ( hosttable - > win ) , HOST_PTR_KEY , hosttable ) ;
2004-05-02 21:16:09 +00:00
gtk_notebook_append_page ( GTK_NOTEBOOK ( nb ) , hosttable - > win , page_lb ) ;
hosttable - > win = win ;
2004-06-01 23:00:24 +00:00
hosttable - > page_lb = page_lb ;
2004-05-02 21:16:09 +00:00
pages [ + + page ] = hosttable ;
current_table = g_slist_next ( current_table ) ;
}
pages [ 0 ] = GINT_TO_POINTER ( page ) ;
2013-03-21 18:39:16 +00:00
hbox = ws_gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , DLG_UNRELATED_SPACING , FALSE ) ;
2004-06-01 23:00:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , FALSE , 0 ) ;
2004-05-03 22:15:22 +00:00
2008-04-11 19:04:34 +00:00
resolv_cb = gtk_check_button_new_with_mnemonic ( " Name resolution " ) ;
2013-03-20 22:41:51 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , resolv_cb , FALSE , FALSE , 0 ) ;
2008-06-29 15:51:43 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( resolv_cb ) , TRUE ) ;
2011-09-21 18:55:03 +00:00
gtk_widget_set_tooltip_text ( resolv_cb ,
" Show results of name resolutions rather than the \" raw \" values. Please note: The corresponding name resolution must be enabled. " ) ;
2004-05-03 22:15:22 +00:00
2008-04-11 23:16:06 +00:00
g_signal_connect ( resolv_cb , " toggled " , G_CALLBACK ( hostlist_resolve_toggle_dest ) , pages ) ;
2004-05-03 22:15:22 +00:00
2008-04-11 19:04:34 +00:00
filter_cb = gtk_check_button_new_with_mnemonic ( " Limit to display filter " ) ;
2013-03-21 18:39:16 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , filter_cb , FALSE , FALSE , 0 ) ;
2008-06-29 15:51:43 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( filter_cb ) , FALSE ) ;
2011-09-21 18:55:03 +00:00
gtk_widget_set_tooltip_text ( filter_cb , " Limit the list to endpoints matching the current display filter. " ) ;
2008-02-17 00:35:55 +00:00
2008-04-11 23:16:06 +00:00
g_signal_connect ( filter_cb , " toggled " , G_CALLBACK ( hostlist_filter_toggle_dest ) , pages ) ;
2008-02-17 00:35:55 +00:00
2004-06-01 23:00:24 +00:00
/* Button row. */
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
bbox = dlg_button_row_new ( GTK_STOCK_CLOSE , GTK_STOCK_COPY , WIRESHARK_STOCK_MAP , GTK_STOCK_HELP , NULL ) ;
2009-09-06 14:25:47 +00:00
# else
2008-06-21 13:36:31 +00:00
bbox = dlg_button_row_new ( GTK_STOCK_CLOSE , GTK_STOCK_COPY , GTK_STOCK_HELP , NULL ) ;
2009-02-11 20:25:17 +00:00
# endif
2004-06-01 23:00:24 +00:00
gtk_box_pack_end ( GTK_BOX ( vbox ) , bbox , FALSE , FALSE , 0 ) ;
2004-05-02 21:16:09 +00:00
2013-03-11 06:47:34 +00:00
close_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , GTK_STOCK_CLOSE ) ;
2004-05-23 23:24:07 +00:00
window_set_cancel_button ( win , close_bt , window_cancel_button_cb ) ;
2004-05-02 21:16:09 +00:00
2013-03-11 06:47:34 +00:00
copy_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , GTK_STOCK_COPY ) ;
2011-07-12 06:15:24 +00:00
gtk_widget_set_tooltip_text ( copy_bt , " Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format. " ) ;
2008-04-11 23:16:06 +00:00
g_signal_connect ( copy_bt , " clicked " , G_CALLBACK ( copy_as_csv_cb ) , NULL ) ;
2008-04-11 16:26:32 +00:00
g_object_set_data ( G_OBJECT ( copy_bt ) , HOST_PTR_KEY , pages [ page ] ) ;
2007-11-30 14:36:18 +00:00
2009-02-11 20:25:17 +00:00
# ifdef HAVE_GEOIP
2013-03-11 06:47:34 +00:00
map_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , WIRESHARK_STOCK_MAP ) ;
2011-07-12 06:15:24 +00:00
gtk_widget_set_tooltip_text ( map_bt , " Show a map of the IP addresses (internet connection required). " ) ;
2009-02-12 02:33:19 +00:00
g_object_set_data ( G_OBJECT ( map_bt ) , HOST_PTR_KEY , pages [ page ] ) ;
2009-02-11 20:25:17 +00:00
g_signal_connect ( map_bt , " clicked " , G_CALLBACK ( open_as_map_cb ) , NULL ) ;
g_signal_connect ( nb , " switch-page " , G_CALLBACK ( ct_nb_map_switch_page_cb ) , map_bt ) ;
2009-02-12 01:44:17 +00:00
gtk_widget_set_sensitive ( map_bt , FALSE ) ;
2009-02-11 20:25:17 +00:00
# endif /* HAVE_GEOIP */
2009-09-06 14:25:47 +00:00
2008-04-11 23:16:06 +00:00
g_signal_connect ( nb , " switch-page " , G_CALLBACK ( ct_nb_switch_page_cb ) , copy_bt ) ;
2007-11-30 14:36:18 +00:00
2013-03-11 06:47:34 +00:00
help_bt = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( bbox ) , GTK_STOCK_HELP ) ;
2008-06-21 13:36:31 +00:00
g_signal_connect ( help_bt , " clicked " , G_CALLBACK ( topic_cb ) , ( gpointer ) HELP_STATS_ENDPOINTS_DIALOG ) ;
2005-01-20 23:17:23 +00:00
2008-04-11 23:16:06 +00:00
g_signal_connect ( win , " delete_event " , G_CALLBACK ( window_delete_event_cb ) , NULL ) ;
g_signal_connect ( win , " destroy " , G_CALLBACK ( hostlist_win_destroy_notebook_cb ) , pages ) ;
2004-05-02 21:16:09 +00:00
2004-06-01 23:00:24 +00:00
gtk_widget_show_all ( win ) ;
2004-05-23 23:24:07 +00:00
window_present ( win ) ;
2009-06-05 22:42:47 +00:00
cf_retap_packets ( & cfile ) ;
2011-02-07 18:41:38 +00:00
gdk_window_raise ( gtk_widget_get_window ( win ) ) ;
2004-05-02 21:16:09 +00:00
}
2009-10-09 09:01:04 +00:00
/*
* Compute the hash value for a given address / port pairs if the match
* is to be exact .
*/
typedef struct {
2013-03-21 02:29:09 +00:00
address myaddress ;
2010-01-29 14:24:18 +00:00
guint32 port ;
2009-10-09 09:01:04 +00:00
} host_key_t ;
2004-05-02 21:16:09 +00:00
2009-10-09 09:01:04 +00:00
static guint
host_hash ( gconstpointer v )
{
2010-01-29 14:24:18 +00:00
const host_key_t * key = ( const host_key_t * ) v ;
guint hash_val ;
2009-10-09 09:01:04 +00:00
2010-01-29 14:24:18 +00:00
hash_val = 0 ;
2013-03-21 02:29:09 +00:00
ADD_ADDRESS_TO_HASH ( hash_val , & key - > myaddress ) ;
2010-01-29 14:24:18 +00:00
hash_val + = key - > port ;
return hash_val ;
2009-10-09 09:01:04 +00:00
}
/*
* Compare two host keys for an exact match .
*/
static gint
host_match ( gconstpointer v , gconstpointer w )
{
2010-01-29 14:24:18 +00:00
const host_key_t * v1 = ( const host_key_t * ) v ;
const host_key_t * v2 = ( const host_key_t * ) w ;
if ( v1 - > port = = v2 - > port & &
2013-03-21 02:29:09 +00:00
ADDRESSES_EQUAL ( & v1 - > myaddress , & v2 - > myaddress ) ) {
2010-01-29 14:24:18 +00:00
return 1 ;
}
/*
* The addresses or the ports don ' t match .
*/
return 0 ;
2009-10-09 09:01:04 +00:00
}
2004-05-02 21:16:09 +00:00
2004-06-03 21:46:27 +00:00
void
2010-01-29 14:24:18 +00:00
add_hostlist_table_data ( hostlist_table * hl , const address * addr , guint32 port , gboolean sender , int num_frames , int num_bytes , SAT_E sat , int port_type_val )
2004-02-20 09:09:12 +00:00
{
2004-06-01 23:00:24 +00:00
hostlist_talker_t * talker = NULL ;
int talker_idx = 0 ;
2004-06-03 21:46:27 +00:00
2004-06-01 23:00:24 +00:00
/* XXX should be optimized to allocate n extra entries at a time
instead of just one */
/* if we dont have any entries at all yet */
if ( hl - > hosts = = NULL ) {
2009-10-09 09:01:04 +00:00
hl - > hosts = g_array_sized_new ( FALSE , FALSE , sizeof ( hostlist_talker_t ) , 10000 ) ;
hl - > hashtable = g_hash_table_new_full ( host_hash ,
2010-01-29 14:24:18 +00:00
host_match , /* key_equal_func */
g_free , /* key_destroy_func */
NULL ) ; /* value_destroy_func */
2004-06-01 23:00:24 +00:00
}
2009-10-09 09:01:04 +00:00
else {
/* try to find it among the existing known conversations */
host_key_t existing_key ;
2013-03-21 02:29:09 +00:00
existing_key . myaddress = * addr ;
2009-10-09 09:01:04 +00:00
existing_key . port = port ;
talker_idx = GPOINTER_TO_UINT ( g_hash_table_lookup ( hl - > hashtable , & existing_key ) ) ;
if ( talker_idx ) {
2010-01-29 14:24:18 +00:00
talker_idx - - ;
2009-10-09 09:01:04 +00:00
talker = & g_array_index ( hl - > hosts , hostlist_talker_t , talker_idx ) ;
2004-06-01 23:00:24 +00:00
}
}
2010-08-30 16:10:01 +00:00
2004-06-01 23:00:24 +00:00
/* if we still dont know what talker this is it has to be a new one
and we have to allocate it and append it to the end of the list */
if ( talker = = NULL ) {
2009-10-09 09:01:04 +00:00
host_key_t * new_key ;
hostlist_talker_t host ;
2013-03-21 02:29:09 +00:00
COPY_ADDRESS ( & host . myaddress , addr ) ;
2009-10-09 09:01:04 +00:00
host . sat = sat ;
2010-01-29 14:24:18 +00:00
host . port_type = port_type_val ;
2009-10-09 09:01:04 +00:00
host . port = port ;
host . rx_frames = 0 ;
host . tx_frames = 0 ;
host . rx_bytes = 0 ;
host . tx_bytes = 0 ;
host . iter_valid = FALSE ;
host . modified = TRUE ;
g_array_append_val ( hl - > hosts , host ) ;
talker_idx = hl - > num_hosts ;
talker = & g_array_index ( hl - > hosts , hostlist_talker_t , talker_idx ) ;
/* hl->hosts address is not a constant but address.data is */
2013-03-11 06:47:34 +00:00
new_key = g_new ( host_key_t , 1 ) ;
2013-03-21 02:29:09 +00:00
SET_ADDRESS ( & new_key - > myaddress , talker - > myaddress . type , talker - > myaddress . len , talker - > myaddress . data ) ;
2010-01-29 14:24:18 +00:00
new_key - > port = port ;
2009-10-09 09:01:04 +00:00
g_hash_table_insert ( hl - > hashtable , new_key , GUINT_TO_POINTER ( talker_idx + 1 ) ) ;
2004-06-01 23:00:24 +00:00
hl - > num_hosts + + ;
}
2004-02-20 09:09:12 +00:00
2004-06-01 23:00:24 +00:00
/* if this is a new talker we need to initialize the struct */
2009-10-09 09:01:04 +00:00
talker - > modified = TRUE ;
2004-02-20 09:09:12 +00:00
2004-06-01 23:00:24 +00:00
/* update the talker struct */
if ( sender ) {
talker - > tx_frames + = num_frames ;
talker - > tx_bytes + = num_bytes ;
} else {
talker - > rx_frames + = num_frames ;
talker - > rx_bytes + = num_bytes ;
}
2004-02-20 09:09:12 +00:00
}
2008-02-17 00:35:55 +00:00
/*
* Editor modelines
*
* Local Variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
2011-09-21 17:49:11 +00:00
* ex : set shiftwidth = 4 tabstop = 8 expandtab :
2008-02-17 00:35:55 +00:00
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/