aboutsummaryrefslogtreecommitdiffstats
path: root/gtk2
diff options
context:
space:
mode:
authorsahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7>2002-09-07 09:28:05 +0000
committersahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7>2002-09-07 09:28:05 +0000
commit7db22af94525a81c4499b99230644bfbf01a58e9 (patch)
tree0126878f22cbf11c70dee08aca17e44f55ebe975 /gtk2
parent41e0ea116ae8df57be300800a41a89231f5b0dda (diff)
Change naming for rpcstat and rpcprogs
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@6212 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'gtk2')
-rw-r--r--gtk2/Makefile.am10
-rw-r--r--gtk2/gtk2-rpcprogs.c375
-rw-r--r--gtk2/gtk2-rpcprogs.h31
-rw-r--r--gtk2/gtk2-rpcstat.c549
-rw-r--r--gtk2/gtk2-rpcstat.h31
-rw-r--r--gtk2/main.c10
-rw-r--r--gtk2/menu.c10
-rw-r--r--gtk2/rpc_progs.c375
-rw-r--r--gtk2/rpc_progs.h31
-rw-r--r--gtk2/rpc_stat.c549
-rw-r--r--gtk2/rpc_stat.h31
11 files changed, 1001 insertions, 1001 deletions
diff --git a/gtk2/Makefile.am b/gtk2/Makefile.am
index f5c709f411..540a21e8c6 100644
--- a/gtk2/Makefile.am
+++ b/gtk2/Makefile.am
@@ -1,7 +1,7 @@
# Makefile.am
# Automake file for the GTK2 interface routines for Ethereal
#
-# $Id: Makefile.am,v 1.3 2002/09/06 10:13:17 sahlberg Exp $
+# $Id: Makefile.am,v 1.4 2002/09/07 09:28:05 sahlberg Exp $
#
# Ethereal - Network traffic analyzer
# By Gerald Combs <gerald@ethereal.com>
@@ -59,10 +59,6 @@ libui_a_SOURCES = \
goto_dlg.c \
goto_dlg.h \
gtkglobals.h \
- gtk2-rpcstat.c \
- gtk2-rpcstat.h \
- gtk2-rpcprogs.c \
- gtk2-rpcprogs.h \
gui_prefs.c \
gui_prefs.h \
help_dlg.c \
@@ -89,6 +85,10 @@ libui_a_SOURCES = \
proto_draw.h \
proto_hier_stats_dlg.h \
proto_hier_stats_dlg.c \
+ rpc_stat.c \
+ rpc_stat.h \
+ rpc_progs.c \
+ rpc_progs.h \
simple_dialog.c \
stream_prefs.c \
stream_prefs.h \
diff --git a/gtk2/gtk2-rpcprogs.c b/gtk2/gtk2-rpcprogs.c
index 5ffba10004..e69de29bb2 100644
--- a/gtk2/gtk2-rpcprogs.c
+++ b/gtk2/gtk2-rpcprogs.c
@@ -1,375 +0,0 @@
-/* gtk2-rpcprogs.c
- * rpcprogs 2002 Ronnie Sahlberg
- *
- * $Id: gtk2-rpcprogs.c,v 1.2 2002/09/06 13:24:45 sahlberg Exp $
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-/* This module provides rpc call/reply RTT statistics to tethereal.
- * It is only used by tethereal and not ethereal
- *
- * It serves as an example on how to use the tap api.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <gtk/gtk.h>
-#include "epan/packet_info.h"
-#include "tap.h"
-#include "gtk2-rpcprogs.h"
-#include "packet-rpc.h"
-
-static GtkWidget *win=NULL;
-static GtkWidget *table=NULL;
-static int num_progs=0;
-
-/* used to keep track of statistics for a specific program/version */
-typedef struct _rpc_program_t {
- struct _rpc_program_t *next;
- guint32 program;
- GtkWidget *wprogram;
- gchar sprogram[24];
-
- guint32 version;
- GtkWidget *wversion;
- gchar sversion[16];
-
- int num;
- GtkWidget *wnum;
- gchar snum[16];
-
- nstime_t min;
- GtkWidget *wmin;
- gchar smin[16];
-
- nstime_t max;
- GtkWidget *wmax;
- gchar smax[16];
-
- nstime_t tot;
- GtkWidget *wavg;
- gchar savg[16];
-} rpc_program_t;
-
-static rpc_program_t *prog_list=NULL;
-
-
-static void
-rpcprogs_reset(void *dummy _U_)
-{
- rpc_program_t *rp;
-
- for(rp=prog_list;rp;rp=rp->next){
- rp->num=0;
- rp->min.secs=0;
- rp->min.nsecs=0;
- rp->max.secs=0;
- rp->max.nsecs=0;
- rp->tot.secs=0;
- rp->tot.nsecs=0;
- }
-}
-
-static void
-add_new_program(rpc_program_t *rp)
-{
- num_progs++;
- gtk_table_resize(GTK_TABLE(table), num_progs+1, 6);
- rp->wprogram=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(table), rp->wprogram, 0,1,num_progs,num_progs+1);
- gtk_widget_show(rp->wprogram);
- rp->wversion=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(table), rp->wversion, 1,2,num_progs,num_progs+1);
- gtk_widget_show(rp->wversion);
- rp->wnum=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(table), rp->wnum, 2,3,num_progs,num_progs+1);
- gtk_widget_show(rp->wnum);
- rp->wmin=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(table), rp->wmin, 3,4,num_progs,num_progs+1);
- gtk_widget_show(rp->wmin);
- rp->wmax=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(table), rp->wmax, 4,5,num_progs,num_progs+1);
- gtk_widget_show(rp->wmax);
- rp->wavg=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(table), rp->wavg, 5,6,num_progs,num_progs+1);
- gtk_widget_show(rp->wavg);
-
- rp->num=0;
- rp->min.secs=0;
- rp->min.nsecs=0;
- rp->max.secs=0;
- rp->max.nsecs=0;
- rp->tot.secs=0;
- rp->tot.nsecs=0;
-}
-
-
-
-static int
-rpcprogs_packet(void *dummy _U_, packet_info *pinfo, rpc_call_info_value *ri)
-{
- nstime_t delta;
- rpc_program_t *rp;
-
- if(!prog_list){
- /* the list was empty */
- rp=g_malloc(sizeof(rpc_program_t));
- add_new_program(rp);
- rp->next=NULL;
- rp->program=ri->prog;
- rp->version=ri->vers;
- prog_list=rp;
- } else if((ri->prog==prog_list->program)
- &&(ri->vers==prog_list->version)){
- rp=prog_list;
- } else if( (ri->prog<prog_list->program)
- ||((ri->prog==prog_list->program)&&(ri->vers<prog_list->version))){
- /* we should be first entry in list */
- rp=g_malloc(sizeof(rpc_program_t));
- add_new_program(rp);
- rp->next=prog_list;
- rp->program=ri->prog;
- rp->version=ri->vers;
- prog_list=rp;
- } else {
- /* we go somewhere else in the list */
- for(rp=prog_list;rp;rp=rp->next){
- if((rp->next)
- && (rp->next->program==ri->prog)
- && (rp->next->version==ri->vers)){
- rp=rp->next;
- break;
- }
- if((!rp->next)
- || (rp->next->program>ri->prog)
- || ( (rp->next->program==ri->prog)
- &&(rp->next->version>ri->vers))){
- rpc_program_t *trp;
- trp=g_malloc(sizeof(rpc_program_t));
- add_new_program(trp);
- trp->next=rp->next;
- trp->program=ri->prog;
- trp->version=ri->vers;
- rp->next=trp;
- rp=trp;
- break;
- }
- }
- }
-
-
- /* we are only interested in reply packets */
- if(ri->request){
- return 0;
- }
-
- /* calculate time delta between request and reply */
- delta.secs=pinfo->fd->abs_secs-ri->req_time.secs;
- delta.nsecs=pinfo->fd->abs_usecs*1000-ri->req_time.nsecs;
- if(delta.nsecs<0){
- delta.nsecs+=1000000000;
- delta.secs--;
- }
-
- if((rp->max.secs==0)
- && (rp->max.nsecs==0) ){
- rp->max.secs=delta.secs;
- rp->max.nsecs=delta.nsecs;
- }
-
- if((rp->min.secs==0)
- && (rp->min.nsecs==0) ){
- rp->min.secs=delta.secs;
- rp->min.nsecs=delta.nsecs;
- }
-
- if( (delta.secs<rp->min.secs)
- ||( (delta.secs==rp->min.secs)
- &&(delta.nsecs<rp->min.nsecs) ) ){
- rp->min.secs=delta.secs;
- rp->min.nsecs=delta.nsecs;
- }
-
- if( (delta.secs>rp->max.secs)
- ||( (delta.secs==rp->max.secs)
- &&(delta.nsecs>rp->max.nsecs) ) ){
- rp->max.secs=delta.secs;
- rp->max.nsecs=delta.nsecs;
- }
-
- rp->tot.secs += delta.secs;
- rp->tot.nsecs += delta.nsecs;
- if(rp->tot.nsecs>1000000000){
- rp->tot.nsecs-=1000000000;
- rp->tot.secs++;
- }
- rp->num++;
-
- return 1;
-}
-
-
-static void
-rpcprogs_draw(void *dummy _U_)
-{
- rpc_program_t *rp;
- int i;
-#ifdef G_HAVE_UINT64
- guint64 td;
-#else
- guint32 td;
-#endif
-
- for(rp=prog_list,i=1;rp;rp=rp->next,i++){
- /* scale it to units of 10us.*/
- /* for long captures with a large tot time, this can overflow on 32bit */
- td=(int)rp->tot.secs;
- td=td*100000+(int)rp->tot.nsecs/10000;
- if(rp->num){
- td/=rp->num;
- } else {
- td=0;
- }
-
- sprintf(rp->sprogram,"%s",rpc_prog_name(rp->program));
- gtk_label_set_text(GTK_LABEL(rp->wprogram), rp->sprogram);
-
- sprintf(rp->sversion,"%d",rp->version);
- gtk_label_set_text(GTK_LABEL(rp->wversion), rp->sversion);
-
- sprintf(rp->snum,"%d",rp->num);
- gtk_label_set_text(GTK_LABEL(rp->wnum), rp->snum);
-
- sprintf(rp->smin,"%3d.%05d",(int)rp->min.secs,(int)rp->min.nsecs/10000);
- gtk_label_set_text(GTK_LABEL(rp->wmin), rp->smin);
-
- sprintf(rp->smax,"%3d.%05d",(int)rp->max.secs,(int)rp->max.nsecs/10000);
- gtk_label_set_text(GTK_LABEL(rp->wmax), rp->smax);
-
- sprintf(rp->savg,"%3d.%05d",(int)td/100000,(int)td%100000);
- gtk_label_set_text(GTK_LABEL(rp->wavg), rp->savg);
-
- }
-}
-
-/* since the gtk2 implementation of tap is multithreaded we must protect
- * remove_tap_listener() from modifying the list while draw_tap_listener()
- * is running. the other protected block is in main.c
- *
- * there should not be any other critical regions in gtk2
- */
-void protect_thread_critical_region(void);
-void unprotect_thread_critical_region(void);
-static void
-win_destroy_cb(void *dummy _U_, gpointer data _U_)
-{
- rpc_program_t *rp, *rp2;
-
- protect_thread_critical_region();
- remove_tap_listener(win);
- unprotect_thread_critical_region();
-
- win=NULL;
- for(rp=prog_list;rp;){
- rp2=rp->next;
- g_free(rp);
- rp=rp2;
- }
- prog_list=NULL;
-}
-
-
-/* When called, this function will start rpcprogs
- */
-void
-gtk2_rpcprogs_init(void)
-{
- char title_string[60];
- GtkWidget *vbox;
- GtkWidget *stat_label;
- GtkWidget *tmp;
-
- if(win){
- gdk_window_raise(win->window);
- return;
- }
-
- win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- sprintf(title_string,"ONC-RPC Program Statistics");
- gtk_window_set_title(GTK_WINDOW(win), title_string);
- gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(win_destroy_cb), win);
-
- vbox=gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
- gtk_widget_show(vbox);
-
- stat_label=gtk_label_new(title_string);
- gtk_box_pack_start(GTK_BOX(vbox), stat_label, FALSE, FALSE, 0);
- gtk_widget_show(stat_label);
-
-
- table=gtk_table_new(1, 5, TRUE);
- gtk_container_add(GTK_CONTAINER(vbox), table);
-
- tmp=gtk_label_new("Program");
- gtk_table_attach_defaults(GTK_TABLE(table), tmp, 0,1,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Version");
- gtk_table_attach_defaults(GTK_TABLE(table), tmp, 1,2,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Calls");
- gtk_table_attach_defaults(GTK_TABLE(table), tmp, 2,3,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Min RTT");
- gtk_table_attach_defaults(GTK_TABLE(table), tmp, 3,4,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Max RTT");
- gtk_table_attach_defaults(GTK_TABLE(table), tmp, 4,5,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Avg RTT");
- gtk_table_attach_defaults(GTK_TABLE(table), tmp, 5,6,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
-
- gtk_widget_show(table);
-
- if(register_tap_listener("rpc", win, NULL, (void*)rpcprogs_reset, (void*)rpcprogs_packet, (void*)rpcprogs_draw)){
- fprintf(stderr, "ethereal: gtk2_rpcprogs_init() failed to register tap\n");
- exit(1);
- }
-
-
- gtk_widget_show_all(win);
-}
-
diff --git a/gtk2/gtk2-rpcprogs.h b/gtk2/gtk2-rpcprogs.h
index 06c3ed89c7..e69de29bb2 100644
--- a/gtk2/gtk2-rpcprogs.h
+++ b/gtk2/gtk2-rpcprogs.h
@@ -1,31 +0,0 @@
-/* gtk2-rpcprogs.h
- * rpcprogs 2002 Ronnie Sahlberg
- *
- * $Id: gtk2-rpcprogs.h,v 1.1 2002/09/06 10:14:14 sahlberg Exp $
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GTK2_RPCPROGS_H__
-#define __GTK2_RPCPROGS_H__
-
-void gtk2_rpcprogs_init(void);
-void gtk2_rpcprogs_cb(GtkWidget *w, gpointer d);
-
-#endif
diff --git a/gtk2/gtk2-rpcstat.c b/gtk2/gtk2-rpcstat.c
index 837b4b903e..e69de29bb2 100644
--- a/gtk2/gtk2-rpcstat.c
+++ b/gtk2/gtk2-rpcstat.c
@@ -1,549 +0,0 @@
-/* gtk2-rpcstat.c
- * rpcstat 2002 Ronnie Sahlberg
- *
- * $Id: gtk2-rpcstat.c,v 1.5 2002/09/06 13:24:45 sahlberg Exp $
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-/* This module provides rpc call/reply RTT statistics to tethereal.
- * It is only used by tethereal and not ethereal
- *
- * It serves as an example on how to use the tap api.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <gtk/gtk.h>
-#include "epan/packet_info.h"
-#include "tap.h"
-#include "tap-rpcstat.h"
-#include "packet-rpc.h"
-
-
-/* used to keep track of statistics for a specific procedure */
-typedef struct _rpc_procedure_t {
- GtkWidget *wnum;
- GtkWidget *wmin;
- GtkWidget *wmax;
- GtkWidget *wavg;
- gchar snum[8];
- gchar smin[16];
- gchar smax[16];
- gchar savg[16];
- int num;
- nstime_t min;
- nstime_t max;
- nstime_t tot;
-} rpc_procedure_t;
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _rpcstat_t {
- GtkWidget *win;
- GtkWidget *table;
- char *prog;
- guint32 program;
- guint32 version;
- guint32 num_procedures;
- rpc_procedure_t *procedures;
-} rpcstat_t;
-
-
-
-
-static void
-rpcstat_reset(rpcstat_t *rs)
-{
- guint32 i;
-
- for(i=0;i<rs->num_procedures;i++){
- rs->procedures[i].num=0;
- rs->procedures[i].min.secs=0;
- rs->procedures[i].min.nsecs=0;
- rs->procedures[i].max.secs=0;
- rs->procedures[i].max.nsecs=0;
- rs->procedures[i].tot.secs=0;
- rs->procedures[i].tot.nsecs=0;
- }
-}
-
-
-static int
-rpcstat_packet(rpcstat_t *rs, packet_info *pinfo, rpc_call_info_value *ri)
-{
- nstime_t delta;
- rpc_procedure_t *rp;
-
- if(ri->proc>=rs->num_procedures){
- /* dont handle this since its outside of known table */
- return 0;
- }
- /* we are only interested in reply packets */
- if(ri->request){
- return 0;
- }
- /* we are only interested in certain program/versions */
- if( (ri->prog!=rs->program) || (ri->vers!=rs->version) ){
- return 0;
- }
-
- rp=&(rs->procedures[ri->proc]);
-
- /* calculate time delta between request and reply */
- delta.secs=pinfo->fd->abs_secs-ri->req_time.secs;
- delta.nsecs=pinfo->fd->abs_usecs*1000-ri->req_time.nsecs;
- if(delta.nsecs<0){
- delta.nsecs+=1000000000;
- delta.secs--;
- }
-
- if((rp->max.secs==0)
- && (rp->max.nsecs==0) ){
- rp->max.secs=delta.secs;
- rp->max.nsecs=delta.nsecs;
- }
-
- if((rp->min.secs==0)
- && (rp->min.nsecs==0) ){
- rp->min.secs=delta.secs;
- rp->min.nsecs=delta.nsecs;
- }
-
- if( (delta.secs<rp->min.secs)
- ||( (delta.secs==rp->min.secs)
- &&(delta.nsecs<rp->min.nsecs) ) ){
- rp->min.secs=delta.secs;
- rp->min.nsecs=delta.nsecs;
- }
-
- if( (delta.secs>rp->max.secs)
- ||( (delta.secs==rp->max.secs)
- &&(delta.nsecs>rp->max.nsecs) ) ){
- rp->max.secs=delta.secs;
- rp->max.nsecs=delta.nsecs;
- }
-
- rp->tot.secs += delta.secs;
- rp->tot.nsecs += delta.nsecs;
- if(rp->tot.nsecs>1000000000){
- rp->tot.nsecs-=1000000000;
- rp->tot.secs++;
- }
- rp->num++;
-
- return 1;
-}
-
-static void
-rpcstat_draw(rpcstat_t *rs)
-{
- guint32 i;
-#ifdef G_HAVE_UINT64
- guint64 td;
-#else
- guint32 td;
-#endif
-
- for(i=0;i<rs->num_procedures;i++){
- /* scale it to units of 10us.*/
- /* for long captures with a large tot time, this can overflow on 32bit */
- td=(int)rs->procedures[i].tot.secs;
- td=td*100000+(int)rs->procedures[i].tot.nsecs/10000;
- if(rs->procedures[i].num){
- td/=rs->procedures[i].num;
- } else {
- td=0;
- }
-
- sprintf(rs->procedures[i].snum,"%d", rs->procedures[i].num);
- gtk_label_set_text(GTK_LABEL(rs->procedures[i].wnum), rs->procedures[i].snum);
-
- sprintf(rs->procedures[i].smin,"%3d.%05d", (int)rs->procedures[i].min.secs,rs->procedures[i].min.nsecs/10000);
- gtk_label_set_text(GTK_LABEL(rs->procedures[i].wmin), rs->procedures[i].smin);
-
- sprintf(rs->procedures[i].smax,"%3d.%05d", (int)rs->procedures[i].max.secs,rs->procedures[i].max.nsecs/10000);
- gtk_label_set_text(GTK_LABEL(rs->procedures[i].wmax), rs->procedures[i].smax);
-
- sprintf(rs->procedures[i].savg,"%3d.%05d", td/100000, td%100000);
- gtk_label_set_text(GTK_LABEL(rs->procedures[i].wavg), rs->procedures[i].savg);
-
- }
-}
-
-
-
-static guint32 rpc_program=0;
-static guint32 rpc_version=0;
-static gint32 rpc_min_vers=-1;
-static gint32 rpc_max_vers=-1;
-static gint32 rpc_min_proc=-1;
-static gint32 rpc_max_proc=-1;
-
-static void *
-rpcstat_find_procs(gpointer *key, gpointer *value _U_, gpointer *user_data _U_)
-{
- rpc_proc_info_key *k=(rpc_proc_info_key *)key;
-
- if(k->prog!=rpc_program){
- return NULL;
- }
- if(k->vers!=rpc_version){
- return NULL;
- }
- if(rpc_min_proc==-1){
- rpc_min_proc=k->proc;
- rpc_max_proc=k->proc;
- }
- if((gint32)k->proc<rpc_min_proc){
- rpc_min_proc=k->proc;
- }
- if((gint32)k->proc>rpc_max_proc){
- rpc_max_proc=k->proc;
- }
-
- return NULL;
-}
-
-static void *
-rpcstat_find_vers(gpointer *key, gpointer *value _U_, gpointer *user_data _U_)
-{
- rpc_proc_info_key *k=(rpc_proc_info_key *)key;
-
- if(k->prog!=rpc_program){
- return NULL;
- }
- if(rpc_min_vers==-1){
- rpc_min_vers=k->vers;
- rpc_max_vers=k->vers;
- }
- if((gint32)k->vers<rpc_min_vers){
- rpc_min_vers=k->vers;
- }
- if((gint32)k->vers>rpc_max_vers){
- rpc_max_vers=k->vers;
- }
-
- return NULL;
-}
-
-/* since the gtk2 implementation of tap is multithreaded we must protect
- * remove_tap_listener() from modifying the list while draw_tap_listener()
- * is running. the other protected block is in main.c
- *
- * there should not be any other critical regions in gtk2
- */
-void protect_thread_critical_region(void);
-void unprotect_thread_critical_region(void);
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- rpcstat_t *rs=(rpcstat_t *)data;
-
- protect_thread_critical_region();
- remove_tap_listener(rs);
- unprotect_thread_critical_region();
-
- g_free(rs->procedures);
- g_free(rs);
-}
-
-/* When called, this function will create a new instance of gtk2-rpcstat.
- */
-void
-gtk2_rpcstat_init(guint32 program, guint32 version)
-{
- rpcstat_t *rs;
- guint32 i;
- char title_string[60];
- GtkWidget *vbox;
- GtkWidget *stat_label;
- GtkWidget *tmp;
-
- rpc_program=program;
- rpc_version=version;
- rs=g_malloc(sizeof(rpcstat_t));
- rs->prog=rpc_prog_name(rpc_program);
- rs->program=rpc_program;
- rs->version=rpc_version;
-
- rs->win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- sprintf(title_string,"ONC-RPC RTT Stat for %s version %d", rs->prog, rs->version);
- gtk_window_set_title(GTK_WINDOW(rs->win), title_string);
- gtk_signal_connect(GTK_OBJECT(rs->win), "destroy", GTK_SIGNAL_FUNC(win_destroy_cb), rs);
-
- vbox=gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(rs->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
- gtk_widget_show(vbox);
-
- stat_label=gtk_label_new(title_string);
- gtk_box_pack_start(GTK_BOX(vbox), stat_label, FALSE, FALSE, 0);
- gtk_widget_show(stat_label);
-
-
- rpc_min_proc=-1;
- rpc_max_proc=-1;
- g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_procs, NULL);
- rs->num_procedures=rpc_max_proc+1;
-
- rs->table=gtk_table_new(rs->num_procedures+1, 5, TRUE);
- gtk_container_add(GTK_CONTAINER(vbox), rs->table);
-
- tmp=gtk_label_new("Procedure");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 0,1,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Calls");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 1,2,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Min RTT");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 2,3,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Max RTT");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 3,4,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
- tmp=gtk_label_new("Avg RTT");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 4,5,0,1);
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(tmp);
-
-
- rs->procedures=g_malloc(sizeof(rpc_procedure_t)*(rs->num_procedures+1));
- for(i=0;i<rs->num_procedures;i++){
- GtkWidget *tmp;
-
- tmp=gtk_label_new(rpc_proc_name(rpc_program, rpc_version, i));
- gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
- gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 0,1,i+1,i+2);
- gtk_widget_show(tmp);
-
- rs->procedures[i].wnum=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wnum, 1,2,i+1,i+2);
- gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wnum), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(rs->procedures[i].wnum);
-
- rs->procedures[i].wmin=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wmin, 2,3,i+1,i+2);
- gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wmin), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(rs->procedures[i].wmin);
-
- rs->procedures[i].wmax=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wmax, 3,4,i+1,i+2);
- gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wmax), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(rs->procedures[i].wmax);
-
- rs->procedures[i].wavg=gtk_label_new("0");
- gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wavg, 4,5,i+1,i+2);
- gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wavg), GTK_JUSTIFY_RIGHT);
- gtk_widget_show(rs->procedures[i].wavg);
-
- rs->procedures[i].num=0;
- rs->procedures[i].min.secs=0;
- rs->procedures[i].min.nsecs=0;
- rs->procedures[i].max.secs=0;
- rs->procedures[i].max.nsecs=0;
- rs->procedures[i].tot.secs=0;
- rs->procedures[i].tot.nsecs=0;
- }
-
- gtk_widget_show(rs->table);
-
- if(register_tap_listener("rpc", rs, NULL, (void*)rpcstat_reset, (void*)rpcstat_packet, (void*)rpcstat_draw)){
- /* error, we failed to attach to the tap. clean up */
- g_free(rs->procedures);
- g_free(rs);
- /* XXX print some error string */
- }
-
-
- gtk_widget_show_all(rs->win);
-}
-
-static void
-rpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
-{
- gtk2_rpcstat_init(rpc_program, rpc_version);
-}
-
-
-
-
-
-static GtkWidget *dlg=NULL, *dlg_box;
-static GtkWidget *prog_box;
-static GtkWidget *prog_label, *prog_opt, *prog_menu;
-static GtkWidget *vers_label, *vers_opt, *vers_menu;
-static GtkWidget *start_button;
-
-
-static void
-rpcstat_version_select(GtkWidget *item _U_, gpointer key)
-{
- int vers=(int)key;
-
- rpc_version=vers;
-}
-
-
-
-static void
-rpcstat_program_select(GtkWidget *item _U_, gpointer key)
-{
- rpc_prog_info_key *k=(rpc_prog_info_key *)key;
- int i;
-
- rpc_program=k->prog;
-
- /* change version menu */
- rpc_version=0;
- gtk_object_destroy(GTK_OBJECT(vers_menu));
- vers_menu=gtk_menu_new();
- rpc_min_vers=-1;
- rpc_max_vers=-1;
- g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_vers, NULL);
- rpc_version=rpc_min_vers;
- for(i=rpc_min_vers;i<=rpc_max_vers;i++){
- GtkWidget *menu_item;
- char vs[5];
- sprintf(vs,"%d",i);
- menu_item=gtk_menu_item_new_with_label(vs);
- gtk_signal_connect(GTK_OBJECT(menu_item), "activate",
- GTK_SIGNAL_FUNC(rpcstat_version_select), (gpointer)i);
-
- gtk_widget_show(menu_item);
- gtk_menu_append(GTK_MENU(vers_menu), menu_item);
- }
- gtk_option_menu_set_menu(GTK_OPTION_MENU(vers_opt), vers_menu);
-}
-
-static void *
-rpcstat_list_programs(gpointer *key, gpointer *value, gpointer *user_data _U_)
-{
- rpc_prog_info_key *k=(rpc_prog_info_key *)key;
- rpc_prog_info_value *v=(rpc_prog_info_value *)value;
- GtkWidget *menu_item;
-
- menu_item=gtk_menu_item_new_with_label(v->progname);
- gtk_signal_connect(GTK_OBJECT(menu_item), "activate",
- GTK_SIGNAL_FUNC(rpcstat_program_select), (gpointer)k);
-
- gtk_widget_show(menu_item);
- gtk_menu_append(GTK_MENU(prog_menu), menu_item);
-
- if(!rpc_program){
- rpc_program=k->prog;
- }
-
- return NULL;
-}
-
-static void
-dlg_destroy_cb(void)
-{
- dlg=NULL;
-}
-
-void
-gtk2_rpcstat_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- int i;
-
- /* if the window is already open, bring it to front */
- if(dlg){
- gdk_window_raise(dlg->window);
- return;
- }
-
- dlg=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(dlg), "ONC-RPC RTT Statistics");
- gtk_signal_connect(GTK_OBJECT(dlg), "destroy", GTK_SIGNAL_FUNC(dlg_destroy_cb), NULL);
- dlg_box=gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
- gtk_widget_show(dlg_box);
-
-
- prog_box=gtk_hbox_new(FALSE, 10);
- /* Program label */
- gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
- prog_label=gtk_label_new("Program:");
- gtk_box_pack_start(GTK_BOX(prog_box), prog_label, FALSE, FALSE, 0);
- gtk_widget_show(prog_label);
-
- /* Program menu */
- prog_opt=gtk_option_menu_new();
- prog_menu=gtk_menu_new();
- g_hash_table_foreach(rpc_progs, (GHFunc)rpcstat_list_programs, NULL);
- gtk_option_menu_set_menu(GTK_OPTION_MENU(prog_opt), prog_menu);
- gtk_box_pack_start(GTK_BOX(prog_box), prog_opt, TRUE, TRUE, 0);
- gtk_widget_show(prog_opt);
-
- /* Version label */
- gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
- vers_label=gtk_label_new("Version:");
- gtk_box_pack_start(GTK_BOX(prog_box), vers_label, FALSE, FALSE, 0);
- gtk_widget_show(vers_label);
-
- /* Version menu */
- vers_opt=gtk_option_menu_new();
- vers_menu=gtk_menu_new();
- rpc_min_vers=-1;
- rpc_max_vers=-1;
- g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_vers, NULL);
- rpc_version=rpc_min_vers;
- for(i=rpc_min_vers;i<=rpc_max_vers;i++){
- GtkWidget *menu_item;
- char vs[5];
- sprintf(vs,"%d",i);
- menu_item=gtk_menu_item_new_with_label(vs);
- gtk_signal_connect(GTK_OBJECT(menu_item), "activate",
- GTK_SIGNAL_FUNC(rpcstat_version_select), (gpointer)i);
-
- gtk_widget_show(menu_item);
- gtk_menu_append(GTK_MENU(vers_menu), menu_item);
- }
-
- gtk_option_menu_set_menu(GTK_OPTION_MENU(vers_opt), vers_menu);
- gtk_box_pack_start(GTK_BOX(prog_box), vers_opt, TRUE, TRUE, 0);
- gtk_widget_show(vers_opt);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), prog_box, TRUE, TRUE, 0);
- gtk_widget_show(prog_box);
-
-
- /* the start button */
- start_button=gtk_button_new_with_label("Create Stat");
- gtk_signal_connect_object(GTK_OBJECT(start_button), "clicked",
- GTK_SIGNAL_FUNC(rpcstat_start_button_clicked),
- NULL);
- gtk_box_pack_start(GTK_BOX(dlg_box), start_button, TRUE, TRUE, 0);
- gtk_widget_show(start_button);
-
- gtk_widget_show_all(dlg);
-}
-
-
diff --git a/gtk2/gtk2-rpcstat.h b/gtk2/gtk2-rpcstat.h
index 5b8d14a047..e69de29bb2 100644
--- a/gtk2/gtk2-rpcstat.h
+++ b/gtk2/gtk2-rpcstat.h
@@ -1,31 +0,0 @@
-/* gtk2-rpcstat.h
- * rpcstat 2002 Ronnie Sahlberg
- *
- * $Id: gtk2-rpcstat.h,v 1.2 2002/09/05 18:48:51 jmayer Exp $
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GTK2_RPCSTAT_H__
-#define __GTK2_RPCSTAT_H__
-
-void gtk2_rpcstat_init(guint32 program, guint32 version);
-void gtk2_rpcstat_cb(GtkWidget *w, gpointer d);
-
-#endif
diff --git a/gtk2/main.c b/gtk2/main.c
index 65bc7de29f..9177bc2cf7 100644
--- a/gtk2/main.c
+++ b/gtk2/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * $Id: main.c,v 1.9 2002/09/06 22:53:19 sahlberg Exp $
+ * $Id: main.c,v 1.10 2002/09/07 09:28:05 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -117,8 +117,8 @@
#include "image/clist_ascend.xpm"
#include "image/clist_descend.xpm"
#include "../tap.h"
-#include "gtk2-rpcstat.h"
-#include "gtk2-rpcprogs.h"
+#include "rpc_stat.h"
+#include "rpc_progs.h"
#ifdef WIN32
#include "capture-wpcap.h"
@@ -1704,13 +1704,13 @@ main(int argc, char *argv[])
if(!strncmp(optarg,"rpc,rtt,",8)){
int rpcprogram, rpcversion;
if(sscanf(optarg,"rpc,rtt,%d,%d",&rpcprogram,&rpcversion)==2){
- gtk2_rpcstat_init(rpcprogram,rpcversion);
+ gtk_rpcstat_init(rpcprogram,rpcversion);
} else {
fprintf(stderr, "ethereal: invalid \"-z rpc,rtt,<program>,<version>\" argument\n");
exit(1);
}
} else if(!strncmp(optarg,"rpc,programs",12)){
- gtk2_rpcprogs_init();
+ gtk_rpcprogs_init();
} else {
fprintf(stderr, "ethereal: invalid -z argument. Argument must be one of:\n");
fprintf(stderr, " \"-z rpc,rtt,<program>,<version>\"\n");
diff --git a/gtk2/menu.c b/gtk2/menu.c
index 338e3970cf..3a71b3ccda 100644
--- a/gtk2/menu.c
+++ b/gtk2/menu.c
@@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
- * $Id: menu.c,v 1.4 2002/09/06 10:13:17 sahlberg Exp $
+ * $Id: menu.c,v 1.5 2002/09/07 09:28:05 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -57,8 +57,8 @@
#include <epan/plugins.h>
#include "tcp_graph.h"
#include <epan/epan_dissect.h>
-#include "gtk2-rpcstat.h"
-#include "gtk2-rpcprogs.h"
+#include "rpc_stat.h"
+#include "rpc_progs.h"
GtkWidget *popup_menu_object;
@@ -174,8 +174,8 @@ static GtkItemFactoryEntry menu_items[] =
{"/Tools/Protocol Hierarchy Statistics", NULL, GTK_MENU_FUNC(proto_hier_stats_cb), 0, NULL, NULL },
{"/Tools/Statistics", NULL, NULL, 0, "<Branch>", NULL },
{"/Tools/Statistics/ONC-RPC", NULL, NULL, 0, "<Branch>", NULL },
- {"/Tools/Statistics/ONC-RPC/RTT", NULL, GTK_MENU_FUNC(gtk2_rpcstat_cb), 0, NULL, NULL },
- {"/Tools/Statistics/ONC-RPC/Programs", NULL, GTK_MENU_FUNC(gtk2_rpcprogs_init), 0, NULL, NULL },
+ {"/Tools/Statistics/ONC-RPC/RTT", NULL, GTK_MENU_FUNC(gtk_rpcstat_cb), 0, NULL, NULL },
+ {"/Tools/Statistics/ONC-RPC/Programs", NULL, GTK_MENU_FUNC(gtk_rpcprogs_init), 0, NULL, NULL },
{"/_Help", NULL, NULL, 0, "<LastBranch>", NULL },
{"/Help/_Help", NULL, GTK_MENU_FUNC(help_cb), 0, "<StockItem>", GTK_STOCK_HELP },
{"/Help/<separator>", NULL, NULL, 0, "<Separator>", NULL },
diff --git a/gtk2/rpc_progs.c b/gtk2/rpc_progs.c
new file mode 100644
index 0000000000..72988d6610
--- /dev/null
+++ b/gtk2/rpc_progs.c
@@ -0,0 +1,375 @@
+/* rpc_progs.c
+ * rpc_progs 2002 Ronnie Sahlberg
+ *
+ * $Id: rpc_progs.c,v 1.1 2002/09/07 09:28:05 sahlberg Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* This module provides rpc call/reply RTT statistics to tethereal.
+ * It is only used by tethereal and not ethereal
+ *
+ * It serves as an example on how to use the tap api.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gtk/gtk.h>
+#include "epan/packet_info.h"
+#include "tap.h"
+#include "rpc_progs.h"
+#include "packet-rpc.h"
+
+static GtkWidget *win=NULL;
+static GtkWidget *table=NULL;
+static int num_progs=0;
+
+/* used to keep track of statistics for a specific program/version */
+typedef struct _rpc_program_t {
+ struct _rpc_program_t *next;
+ guint32 program;
+ GtkWidget *wprogram;
+ gchar sprogram[24];
+
+ guint32 version;
+ GtkWidget *wversion;
+ gchar sversion[16];
+
+ int num;
+ GtkWidget *wnum;
+ gchar snum[16];
+
+ nstime_t min;
+ GtkWidget *wmin;
+ gchar smin[16];
+
+ nstime_t max;
+ GtkWidget *wmax;
+ gchar smax[16];
+
+ nstime_t tot;
+ GtkWidget *wavg;
+ gchar savg[16];
+} rpc_program_t;
+
+static rpc_program_t *prog_list=NULL;
+
+
+static void
+rpcprogs_reset(void *dummy _U_)
+{
+ rpc_program_t *rp;
+
+ for(rp=prog_list;rp;rp=rp->next){
+ rp->num=0;
+ rp->min.secs=0;
+ rp->min.nsecs=0;
+ rp->max.secs=0;
+ rp->max.nsecs=0;
+ rp->tot.secs=0;
+ rp->tot.nsecs=0;
+ }
+}
+
+static void
+add_new_program(rpc_program_t *rp)
+{
+ num_progs++;
+ gtk_table_resize(GTK_TABLE(table), num_progs+1, 6);
+ rp->wprogram=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(table), rp->wprogram, 0,1,num_progs,num_progs+1);
+ gtk_widget_show(rp->wprogram);
+ rp->wversion=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(table), rp->wversion, 1,2,num_progs,num_progs+1);
+ gtk_widget_show(rp->wversion);
+ rp->wnum=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(table), rp->wnum, 2,3,num_progs,num_progs+1);
+ gtk_widget_show(rp->wnum);
+ rp->wmin=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(table), rp->wmin, 3,4,num_progs,num_progs+1);
+ gtk_widget_show(rp->wmin);
+ rp->wmax=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(table), rp->wmax, 4,5,num_progs,num_progs+1);
+ gtk_widget_show(rp->wmax);
+ rp->wavg=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(table), rp->wavg, 5,6,num_progs,num_progs+1);
+ gtk_widget_show(rp->wavg);
+
+ rp->num=0;
+ rp->min.secs=0;
+ rp->min.nsecs=0;
+ rp->max.secs=0;
+ rp->max.nsecs=0;
+ rp->tot.secs=0;
+ rp->tot.nsecs=0;
+}
+
+
+
+static int
+rpcprogs_packet(void *dummy _U_, packet_info *pinfo, rpc_call_info_value *ri)
+{
+ nstime_t delta;
+ rpc_program_t *rp;
+
+ if(!prog_list){
+ /* the list was empty */
+ rp=g_malloc(sizeof(rpc_program_t));
+ add_new_program(rp);
+ rp->next=NULL;
+ rp->program=ri->prog;
+ rp->version=ri->vers;
+ prog_list=rp;
+ } else if((ri->prog==prog_list->program)
+ &&(ri->vers==prog_list->version)){
+ rp=prog_list;
+ } else if( (ri->prog<prog_list->program)
+ ||((ri->prog==prog_list->program)&&(ri->vers<prog_list->version))){
+ /* we should be first entry in list */
+ rp=g_malloc(sizeof(rpc_program_t));
+ add_new_program(rp);
+ rp->next=prog_list;
+ rp->program=ri->prog;
+ rp->version=ri->vers;
+ prog_list=rp;
+ } else {
+ /* we go somewhere else in the list */
+ for(rp=prog_list;rp;rp=rp->next){
+ if((rp->next)
+ && (rp->next->program==ri->prog)
+ && (rp->next->version==ri->vers)){
+ rp=rp->next;
+ break;
+ }
+ if((!rp->next)
+ || (rp->next->program>ri->prog)
+ || ( (rp->next->program==ri->prog)
+ &&(rp->next->version>ri->vers))){
+ rpc_program_t *trp;
+ trp=g_malloc(sizeof(rpc_program_t));
+ add_new_program(trp);
+ trp->next=rp->next;
+ trp->program=ri->prog;
+ trp->version=ri->vers;
+ rp->next=trp;
+ rp=trp;
+ break;
+ }
+ }
+ }
+
+
+ /* we are only interested in reply packets */
+ if(ri->request){
+ return 0;
+ }
+
+ /* calculate time delta between request and reply */
+ delta.secs=pinfo->fd->abs_secs-ri->req_time.secs;
+ delta.nsecs=pinfo->fd->abs_usecs*1000-ri->req_time.nsecs;
+ if(delta.nsecs<0){
+ delta.nsecs+=1000000000;
+ delta.secs--;
+ }
+
+ if((rp->max.secs==0)
+ && (rp->max.nsecs==0) ){
+ rp->max.secs=delta.secs;
+ rp->max.nsecs=delta.nsecs;
+ }
+
+ if((rp->min.secs==0)
+ && (rp->min.nsecs==0) ){
+ rp->min.secs=delta.secs;
+ rp->min.nsecs=delta.nsecs;
+ }
+
+ if( (delta.secs<rp->min.secs)
+ ||( (delta.secs==rp->min.secs)
+ &&(delta.nsecs<rp->min.nsecs) ) ){
+ rp->min.secs=delta.secs;
+ rp->min.nsecs=delta.nsecs;
+ }
+
+ if( (delta.secs>rp->max.secs)
+ ||( (delta.secs==rp->max.secs)
+ &&(delta.nsecs>rp->max.nsecs) ) ){
+ rp->max.secs=delta.secs;
+ rp->max.nsecs=delta.nsecs;
+ }
+
+ rp->tot.secs += delta.secs;
+ rp->tot.nsecs += delta.nsecs;
+ if(rp->tot.nsecs>1000000000){
+ rp->tot.nsecs-=1000000000;
+ rp->tot.secs++;
+ }
+ rp->num++;
+
+ return 1;
+}
+
+
+static void
+rpcprogs_draw(void *dummy _U_)
+{
+ rpc_program_t *rp;
+ int i;
+#ifdef G_HAVE_UINT64
+ guint64 td;
+#else
+ guint32 td;
+#endif
+
+ for(rp=prog_list,i=1;rp;rp=rp->next,i++){
+ /* scale it to units of 10us.*/
+ /* for long captures with a large tot time, this can overflow on 32bit */
+ td=(int)rp->tot.secs;
+ td=td*100000+(int)rp->tot.nsecs/10000;
+ if(rp->num){
+ td/=rp->num;
+ } else {
+ td=0;
+ }
+
+ sprintf(rp->sprogram,"%s",rpc_prog_name(rp->program));
+ gtk_label_set_text(GTK_LABEL(rp->wprogram), rp->sprogram);
+
+ sprintf(rp->sversion,"%d",rp->version);
+ gtk_label_set_text(GTK_LABEL(rp->wversion), rp->sversion);
+
+ sprintf(rp->snum,"%d",rp->num);
+ gtk_label_set_text(GTK_LABEL(rp->wnum), rp->snum);
+
+ sprintf(rp->smin,"%3d.%05d",(int)rp->min.secs,(int)rp->min.nsecs/10000);
+ gtk_label_set_text(GTK_LABEL(rp->wmin), rp->smin);
+
+ sprintf(rp->smax,"%3d.%05d",(int)rp->max.secs,(int)rp->max.nsecs/10000);
+ gtk_label_set_text(GTK_LABEL(rp->wmax), rp->smax);
+
+ sprintf(rp->savg,"%3d.%05d",(int)td/100000,(int)td%100000);
+ gtk_label_set_text(GTK_LABEL(rp->wavg), rp->savg);
+
+ }
+}
+
+/* since the gtk2 implementation of tap is multithreaded we must protect
+ * remove_tap_listener() from modifying the list while draw_tap_listener()
+ * is running. the other protected block is in main.c
+ *
+ * there should not be any other critical regions in gtk2
+ */
+void protect_thread_critical_region(void);
+void unprotect_thread_critical_region(void);
+static void
+win_destroy_cb(void *dummy _U_, gpointer data _U_)
+{
+ rpc_program_t *rp, *rp2;
+
+ protect_thread_critical_region();
+ remove_tap_listener(win);
+ unprotect_thread_critical_region();
+
+ win=NULL;
+ for(rp=prog_list;rp;){
+ rp2=rp->next;
+ g_free(rp);
+ rp=rp2;
+ }
+ prog_list=NULL;
+}
+
+
+/* When called, this function will start rpcprogs
+ */
+void
+gtk_rpcprogs_init(void)
+{
+ char title_string[60];
+ GtkWidget *vbox;
+ GtkWidget *stat_label;
+ GtkWidget *tmp;
+
+ if(win){
+ gdk_window_raise(win->window);
+ return;
+ }
+
+ win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ sprintf(title_string,"ONC-RPC Program Statistics");
+ gtk_window_set_title(GTK_WINDOW(win), title_string);
+ gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(win_destroy_cb), win);
+
+ vbox=gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(win), vbox);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
+ gtk_widget_show(vbox);
+
+ stat_label=gtk_label_new(title_string);
+ gtk_box_pack_start(GTK_BOX(vbox), stat_label, FALSE, FALSE, 0);
+ gtk_widget_show(stat_label);
+
+
+ table=gtk_table_new(1, 5, TRUE);
+ gtk_container_add(GTK_CONTAINER(vbox), table);
+
+ tmp=gtk_label_new("Program");
+ gtk_table_attach_defaults(GTK_TABLE(table), tmp, 0,1,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Version");
+ gtk_table_attach_defaults(GTK_TABLE(table), tmp, 1,2,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Calls");
+ gtk_table_attach_defaults(GTK_TABLE(table), tmp, 2,3,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Min RTT");
+ gtk_table_attach_defaults(GTK_TABLE(table), tmp, 3,4,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Max RTT");
+ gtk_table_attach_defaults(GTK_TABLE(table), tmp, 4,5,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Avg RTT");
+ gtk_table_attach_defaults(GTK_TABLE(table), tmp, 5,6,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+
+ gtk_widget_show(table);
+
+ if(register_tap_listener("rpc", win, NULL, (void*)rpcprogs_reset, (void*)rpcprogs_packet, (void*)rpcprogs_draw)){
+ fprintf(stderr, "ethereal: gtk_rpcprogs_init() failed to register tap\n");
+ exit(1);
+ }
+
+
+ gtk_widget_show_all(win);
+}
+
diff --git a/gtk2/rpc_progs.h b/gtk2/rpc_progs.h
new file mode 100644
index 0000000000..a9d7a27bc5
--- /dev/null
+++ b/gtk2/rpc_progs.h
@@ -0,0 +1,31 @@
+/* rpc_progs.h
+ * rpc_progs 2002 Ronnie Sahlberg
+ *
+ * $Id: rpc_progs.h,v 1.1 2002/09/07 09:28:05 sahlberg Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RPC_PROGS_H__
+#define __RPC_PROGS_H__
+
+void gtk_rpcprogs_init(void);
+void gtk_rpcprogs_cb(GtkWidget *w, gpointer d);
+
+#endif
diff --git a/gtk2/rpc_stat.c b/gtk2/rpc_stat.c
new file mode 100644
index 0000000000..bb0218d96b
--- /dev/null
+++ b/gtk2/rpc_stat.c
@@ -0,0 +1,549 @@
+/* rpc_stat.c
+ * rpc_stat 2002 Ronnie Sahlberg
+ *
+ * $Id: rpc_stat.c,v 1.1 2002/09/07 09:28:05 sahlberg Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* This module provides rpc call/reply RTT statistics to tethereal.
+ * It is only used by tethereal and not ethereal
+ *
+ * It serves as an example on how to use the tap api.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gtk/gtk.h>
+#include "epan/packet_info.h"
+#include "tap.h"
+#include "rpc_stat.h"
+#include "packet-rpc.h"
+
+
+/* used to keep track of statistics for a specific procedure */
+typedef struct _rpc_procedure_t {
+ GtkWidget *wnum;
+ GtkWidget *wmin;
+ GtkWidget *wmax;
+ GtkWidget *wavg;
+ gchar snum[8];
+ gchar smin[16];
+ gchar smax[16];
+ gchar savg[16];
+ int num;
+ nstime_t min;
+ nstime_t max;
+ nstime_t tot;
+} rpc_procedure_t;
+
+/* used to keep track of the statistics for an entire program interface */
+typedef struct _rpcstat_t {
+ GtkWidget *win;
+ GtkWidget *table;
+ char *prog;
+ guint32 program;
+ guint32 version;
+ guint32 num_procedures;
+ rpc_procedure_t *procedures;
+} rpcstat_t;
+
+
+
+
+static void
+rpcstat_reset(rpcstat_t *rs)
+{
+ guint32 i;
+
+ for(i=0;i<rs->num_procedures;i++){
+ rs->procedures[i].num=0;
+ rs->procedures[i].min.secs=0;
+ rs->procedures[i].min.nsecs=0;
+ rs->procedures[i].max.secs=0;
+ rs->procedures[i].max.nsecs=0;
+ rs->procedures[i].tot.secs=0;
+ rs->procedures[i].tot.nsecs=0;
+ }
+}
+
+
+static int
+rpcstat_packet(rpcstat_t *rs, packet_info *pinfo, rpc_call_info_value *ri)
+{
+ nstime_t delta;
+ rpc_procedure_t *rp;
+
+ if(ri->proc>=rs->num_procedures){
+ /* dont handle this since its outside of known table */
+ return 0;
+ }
+ /* we are only interested in reply packets */
+ if(ri->request){
+ return 0;
+ }
+ /* we are only interested in certain program/versions */
+ if( (ri->prog!=rs->program) || (ri->vers!=rs->version) ){
+ return 0;
+ }
+
+ rp=&(rs->procedures[ri->proc]);
+
+ /* calculate time delta between request and reply */
+ delta.secs=pinfo->fd->abs_secs-ri->req_time.secs;
+ delta.nsecs=pinfo->fd->abs_usecs*1000-ri->req_time.nsecs;
+ if(delta.nsecs<0){
+ delta.nsecs+=1000000000;
+ delta.secs--;
+ }
+
+ if((rp->max.secs==0)
+ && (rp->max.nsecs==0) ){
+ rp->max.secs=delta.secs;
+ rp->max.nsecs=delta.nsecs;
+ }
+
+ if((rp->min.secs==0)
+ && (rp->min.nsecs==0) ){
+ rp->min.secs=delta.secs;
+ rp->min.nsecs=delta.nsecs;
+ }
+
+ if( (delta.secs<rp->min.secs)
+ ||( (delta.secs==rp->min.secs)
+ &&(delta.nsecs<rp->min.nsecs) ) ){
+ rp->min.secs=delta.secs;
+ rp->min.nsecs=delta.nsecs;
+ }
+
+ if( (delta.secs>rp->max.secs)
+ ||( (delta.secs==rp->max.secs)
+ &&(delta.nsecs>rp->max.nsecs) ) ){
+ rp->max.secs=delta.secs;
+ rp->max.nsecs=delta.nsecs;
+ }
+
+ rp->tot.secs += delta.secs;
+ rp->tot.nsecs += delta.nsecs;
+ if(rp->tot.nsecs>1000000000){
+ rp->tot.nsecs-=1000000000;
+ rp->tot.secs++;
+ }
+ rp->num++;
+
+ return 1;
+}
+
+static void
+rpcstat_draw(rpcstat_t *rs)
+{
+ guint32 i;
+#ifdef G_HAVE_UINT64
+ guint64 td;
+#else
+ guint32 td;
+#endif
+
+ for(i=0;i<rs->num_procedures;i++){
+ /* scale it to units of 10us.*/
+ /* for long captures with a large tot time, this can overflow on 32bit */
+ td=(int)rs->procedures[i].tot.secs;
+ td=td*100000+(int)rs->procedures[i].tot.nsecs/10000;
+ if(rs->procedures[i].num){
+ td/=rs->procedures[i].num;
+ } else {
+ td=0;
+ }
+
+ sprintf(rs->procedures[i].snum,"%d", rs->procedures[i].num);
+ gtk_label_set_text(GTK_LABEL(rs->procedures[i].wnum), rs->procedures[i].snum);
+
+ sprintf(rs->procedures[i].smin,"%3d.%05d", (int)rs->procedures[i].min.secs,rs->procedures[i].min.nsecs/10000);
+ gtk_label_set_text(GTK_LABEL(rs->procedures[i].wmin), rs->procedures[i].smin);
+
+ sprintf(rs->procedures[i].smax,"%3d.%05d", (int)rs->procedures[i].max.secs,rs->procedures[i].max.nsecs/10000);
+ gtk_label_set_text(GTK_LABEL(rs->procedures[i].wmax), rs->procedures[i].smax);
+
+ sprintf(rs->procedures[i].savg,"%3d.%05d", td/100000, td%100000);
+ gtk_label_set_text(GTK_LABEL(rs->procedures[i].wavg), rs->procedures[i].savg);
+
+ }
+}
+
+
+
+static guint32 rpc_program=0;
+static guint32 rpc_version=0;
+static gint32 rpc_min_vers=-1;
+static gint32 rpc_max_vers=-1;
+static gint32 rpc_min_proc=-1;
+static gint32 rpc_max_proc=-1;
+
+static void *
+rpcstat_find_procs(gpointer *key, gpointer *value _U_, gpointer *user_data _U_)
+{
+ rpc_proc_info_key *k=(rpc_proc_info_key *)key;
+
+ if(k->prog!=rpc_program){
+ return NULL;
+ }
+ if(k->vers!=rpc_version){
+ return NULL;
+ }
+ if(rpc_min_proc==-1){
+ rpc_min_proc=k->proc;
+ rpc_max_proc=k->proc;
+ }
+ if((gint32)k->proc<rpc_min_proc){
+ rpc_min_proc=k->proc;
+ }
+ if((gint32)k->proc>rpc_max_proc){
+ rpc_max_proc=k->proc;
+ }
+
+ return NULL;
+}
+
+static void *
+rpcstat_find_vers(gpointer *key, gpointer *value _U_, gpointer *user_data _U_)
+{
+ rpc_proc_info_key *k=(rpc_proc_info_key *)key;
+
+ if(k->prog!=rpc_program){
+ return NULL;
+ }
+ if(rpc_min_vers==-1){
+ rpc_min_vers=k->vers;
+ rpc_max_vers=k->vers;
+ }
+ if((gint32)k->vers<rpc_min_vers){
+ rpc_min_vers=k->vers;
+ }
+ if((gint32)k->vers>rpc_max_vers){
+ rpc_max_vers=k->vers;
+ }
+
+ return NULL;
+}
+
+/* since the gtk2 implementation of tap is multithreaded we must protect
+ * remove_tap_listener() from modifying the list while draw_tap_listener()
+ * is running. the other protected block is in main.c
+ *
+ * there should not be any other critical regions in gtk2
+ */
+void protect_thread_critical_region(void);
+void unprotect_thread_critical_region(void);
+static void
+win_destroy_cb(GtkWindow *win _U_, gpointer data)
+{
+ rpcstat_t *rs=(rpcstat_t *)data;
+
+ protect_thread_critical_region();
+ remove_tap_listener(rs);
+ unprotect_thread_critical_region();
+
+ g_free(rs->procedures);
+ g_free(rs);
+}
+
+/* When called, this function will create a new instance of gtk2-rpcstat.
+ */
+void
+gtk_rpcstat_init(guint32 program, guint32 version)
+{
+ rpcstat_t *rs;
+ guint32 i;
+ char title_string[60];
+ GtkWidget *vbox;
+ GtkWidget *stat_label;
+ GtkWidget *tmp;
+
+ rpc_program=program;
+ rpc_version=version;
+ rs=g_malloc(sizeof(rpcstat_t));
+ rs->prog=rpc_prog_name(rpc_program);
+ rs->program=rpc_program;
+ rs->version=rpc_version;
+
+ rs->win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ sprintf(title_string,"ONC-RPC RTT Stat for %s version %d", rs->prog, rs->version);
+ gtk_window_set_title(GTK_WINDOW(rs->win), title_string);
+ gtk_signal_connect(GTK_OBJECT(rs->win), "destroy", GTK_SIGNAL_FUNC(win_destroy_cb), rs);
+
+ vbox=gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(rs->win), vbox);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
+ gtk_widget_show(vbox);
+
+ stat_label=gtk_label_new(title_string);
+ gtk_box_pack_start(GTK_BOX(vbox), stat_label, FALSE, FALSE, 0);
+ gtk_widget_show(stat_label);
+
+
+ rpc_min_proc=-1;
+ rpc_max_proc=-1;
+ g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_procs, NULL);
+ rs->num_procedures=rpc_max_proc+1;
+
+ rs->table=gtk_table_new(rs->num_procedures+1, 5, TRUE);
+ gtk_container_add(GTK_CONTAINER(vbox), rs->table);
+
+ tmp=gtk_label_new("Procedure");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 0,1,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Calls");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 1,2,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Min RTT");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 2,3,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Max RTT");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 3,4,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+ tmp=gtk_label_new("Avg RTT");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 4,5,0,1);
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(tmp);
+
+
+ rs->procedures=g_malloc(sizeof(rpc_procedure_t)*(rs->num_procedures+1));
+ for(i=0;i<rs->num_procedures;i++){
+ GtkWidget *tmp;
+
+ tmp=gtk_label_new(rpc_proc_name(rpc_program, rpc_version, i));
+ gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), tmp, 0,1,i+1,i+2);
+ gtk_widget_show(tmp);
+
+ rs->procedures[i].wnum=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wnum, 1,2,i+1,i+2);
+ gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wnum), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(rs->procedures[i].wnum);
+
+ rs->procedures[i].wmin=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wmin, 2,3,i+1,i+2);
+ gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wmin), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(rs->procedures[i].wmin);
+
+ rs->procedures[i].wmax=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wmax, 3,4,i+1,i+2);
+ gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wmax), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(rs->procedures[i].wmax);
+
+ rs->procedures[i].wavg=gtk_label_new("0");
+ gtk_table_attach_defaults(GTK_TABLE(rs->table), rs->procedures[i].wavg, 4,5,i+1,i+2);
+ gtk_label_set_justify(GTK_LABEL(rs->procedures[i].wavg), GTK_JUSTIFY_RIGHT);
+ gtk_widget_show(rs->procedures[i].wavg);
+
+ rs->procedures[i].num=0;
+ rs->procedures[i].min.secs=0;
+ rs->procedures[i].min.nsecs=0;
+ rs->procedures[i].max.secs=0;
+ rs->procedures[i].max.nsecs=0;
+ rs->procedures[i].tot.secs=0;
+ rs->procedures[i].tot.nsecs=0;
+ }
+
+ gtk_widget_show(rs->table);
+
+ if(register_tap_listener("rpc", rs, NULL, (void*)rpcstat_reset, (void*)rpcstat_packet, (void*)rpcstat_draw)){
+ /* error, we failed to attach to the tap. clean up */
+ g_free(rs->procedures);
+ g_free(rs);
+ /* XXX print some error string */
+ }
+
+
+ gtk_widget_show_all(rs->win);
+}
+
+static void
+rpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
+{
+ gtk_rpcstat_init(rpc_program, rpc_version);
+}
+
+
+
+
+
+static GtkWidget *dlg=NULL, *dlg_box;
+static GtkWidget *prog_box;
+static GtkWidget *prog_label, *prog_opt, *prog_menu;
+static GtkWidget *vers_label, *vers_opt, *vers_menu;
+static GtkWidget *start_button;
+
+
+static void
+rpcstat_version_select(GtkWidget *item _U_, gpointer key)
+{
+ int vers=(int)key;
+
+ rpc_version=vers;
+}
+
+
+
+static void
+rpcstat_program_select(GtkWidget *item _U_, gpointer key)
+{
+ rpc_prog_info_key *k=(rpc_prog_info_key *)key;
+ int i;
+
+ rpc_program=k->prog;
+
+ /* change version menu */
+ rpc_version=0;
+ gtk_object_destroy(GTK_OBJECT(vers_menu));
+ vers_menu=gtk_menu_new();
+ rpc_min_vers=-1;
+ rpc_max_vers=-1;
+ g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_vers, NULL);
+ rpc_version=rpc_min_vers;
+ for(i=rpc_min_vers;i<=rpc_max_vers;i++){
+ GtkWidget *menu_item;
+ char vs[5];
+ sprintf(vs,"%d",i);
+ menu_item=gtk_menu_item_new_with_label(vs);
+ gtk_signal_connect(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(rpcstat_version_select), (gpointer)i);
+
+ gtk_widget_show(menu_item);
+ gtk_menu_append(GTK_MENU(vers_menu), menu_item);
+ }
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(vers_opt), vers_menu);
+}
+
+static void *
+rpcstat_list_programs(gpointer *key, gpointer *value, gpointer *user_data _U_)
+{
+ rpc_prog_info_key *k=(rpc_prog_info_key *)key;
+ rpc_prog_info_value *v=(rpc_prog_info_value *)value;
+ GtkWidget *menu_item;
+
+ menu_item=gtk_menu_item_new_with_label(v->progname);
+ gtk_signal_connect(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(rpcstat_program_select), (gpointer)k);
+
+ gtk_widget_show(menu_item);
+ gtk_menu_append(GTK_MENU(prog_menu), menu_item);
+
+ if(!rpc_program){
+ rpc_program=k->prog;
+ }
+
+ return NULL;
+}
+
+static void
+dlg_destroy_cb(void)
+{
+ dlg=NULL;
+}
+
+void
+gtk_rpcstat_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+ int i;
+
+ /* if the window is already open, bring it to front */
+ if(dlg){
+ gdk_window_raise(dlg->window);
+ return;
+ }
+
+ dlg=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(dlg), "ONC-RPC RTT Statistics");
+ gtk_signal_connect(GTK_OBJECT(dlg), "destroy", GTK_SIGNAL_FUNC(dlg_destroy_cb), NULL);
+ dlg_box=gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
+ gtk_widget_show(dlg_box);
+
+
+ prog_box=gtk_hbox_new(FALSE, 10);
+ /* Program label */
+ gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
+ prog_label=gtk_label_new("Program:");
+ gtk_box_pack_start(GTK_BOX(prog_box), prog_label, FALSE, FALSE, 0);
+ gtk_widget_show(prog_label);
+
+ /* Program menu */
+ prog_opt=gtk_option_menu_new();
+ prog_menu=gtk_menu_new();
+ g_hash_table_foreach(rpc_progs, (GHFunc)rpcstat_list_programs, NULL);
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(prog_opt), prog_menu);
+ gtk_box_pack_start(GTK_BOX(prog_box), prog_opt, TRUE, TRUE, 0);
+ gtk_widget_show(prog_opt);
+
+ /* Version label */
+ gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
+ vers_label=gtk_label_new("Version:");
+ gtk_box_pack_start(GTK_BOX(prog_box), vers_label, FALSE, FALSE, 0);
+ gtk_widget_show(vers_label);
+
+ /* Version menu */
+ vers_opt=gtk_option_menu_new();
+ vers_menu=gtk_menu_new();
+ rpc_min_vers=-1;
+ rpc_max_vers=-1;
+ g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_vers, NULL);
+ rpc_version=rpc_min_vers;
+ for(i=rpc_min_vers;i<=rpc_max_vers;i++){
+ GtkWidget *menu_item;
+ char vs[5];
+ sprintf(vs,"%d",i);
+ menu_item=gtk_menu_item_new_with_label(vs);
+ gtk_signal_connect(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(rpcstat_version_select), (gpointer)i);
+
+ gtk_widget_show(menu_item);
+ gtk_menu_append(GTK_MENU(vers_menu), menu_item);
+ }
+
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(vers_opt), vers_menu);
+ gtk_box_pack_start(GTK_BOX(prog_box), vers_opt, TRUE, TRUE, 0);
+ gtk_widget_show(vers_opt);
+
+ gtk_box_pack_start(GTK_BOX(dlg_box), prog_box, TRUE, TRUE, 0);
+ gtk_widget_show(prog_box);
+
+
+ /* the start button */
+ start_button=gtk_button_new_with_label("Create Stat");
+ gtk_signal_connect_object(GTK_OBJECT(start_button), "clicked",
+ GTK_SIGNAL_FUNC(rpcstat_start_button_clicked),
+ NULL);
+ gtk_box_pack_start(GTK_BOX(dlg_box), start_button, TRUE, TRUE, 0);
+ gtk_widget_show(start_button);
+
+ gtk_widget_show_all(dlg);
+}
+
+
diff --git a/gtk2/rpc_stat.h b/gtk2/rpc_stat.h
new file mode 100644
index 0000000000..cc69bb4543
--- /dev/null
+++ b/gtk2/rpc_stat.h
@@ -0,0 +1,31 @@
+/* rpc_stat.h
+ * rpc_stat 2002 Ronnie Sahlberg
+ *
+ * $Id: rpc_stat.h,v 1.1 2002/09/07 09:28:05 sahlberg Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RPCSTAT_H__
+#define __RPCSTAT_H__
+
+void gtk_rpcstat_init(guint32 program, guint32 version);
+void gtk_rpcstat_cb(GtkWidget *w, gpointer d);
+
+#endif