First step in creating an API to register TAPs for use with ethereal instead of hardcoding them in main.c/menu.c

This adds functions to register the command line arguments to use the API in the same way as is done for tethereal.

Later it may be extended to also register the GUI/Menu entry point to ethereal using this api but that iwll be later since the changes required to menu.c are not as intrusive as the main.c command line parsing ones were.


Some of the latest changes (before this checkin) has made ethereal to produce lots of GTK errors when starting up the extension windows.
They were there before this checking but will be investigated.

svn path=/trunk/; revision=6566
This commit is contained in:
Ronnie Sahlberg 2002-11-06 10:53:36 +00:00
parent d4e632c5ea
commit b3e0a56390
10 changed files with 169 additions and 115 deletions

View File

@ -1,7 +1,7 @@
# Makefile.am
# Automake file for the GTK interface routines for Ethereal
#
# $Id: Makefile.am,v 1.44 2002/11/03 17:38:32 oabad Exp $
# $Id: Makefile.am,v 1.45 2002/11/06 10:53:36 sahlberg Exp $
#
# Ethereal - Network traffic analyzer
# By Gerald Combs <gerald@ethereal.com>
@ -27,6 +27,19 @@ CLEANFILES = \
libui.a \
*~
ETHEREAL_TAP_SRC = \
dcerpc_stat.c \
dcerpc_stat.h \
rpc_stat.c \
rpc_stat.h \
rpc_progs.c \
rpc_progs.h
ethereal-tap-register.c: $(ETHEREAL_TAP_SRC)
@echo Making tethereal-tap-register.c
../make-tapreg-dotc ethereal-tap-register.c . $(ETHEREAL_TAP_SRC)
if USE_GTK2
libui_a_SOURCES = \
capture_dlg.c \
@ -41,8 +54,6 @@ libui_a_SOURCES = \
color_utils.h \
column_prefs.c \
column_prefs.h \
dcerpc_stat.c \
dcerpc_stat.h \
decode_as_dlg.c \
decode_as_dlg.h \
dfilter_expr_dlg.c \
@ -51,6 +62,7 @@ libui_a_SOURCES = \
display_opts.h \
dlg_utils.c \
dlg_utils.h \
ethereal-tap-register.c \
file_dlg.c \
file_dlg.h \
filter_prefs.c \
@ -89,10 +101,6 @@ 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 \
@ -101,7 +109,8 @@ libui_a_SOURCES = \
tcp_graph.c \
tcp_graph.h \
ui_util.c \
ui_util.h
ui_util.h \
$(ETHEREAL_TAP_SRC)
else
libui_a_SOURCES = \
capture_dlg.c \
@ -116,8 +125,6 @@ libui_a_SOURCES = \
color_utils.h \
column_prefs.c \
column_prefs.h \
dcerpc_stat.c \
dcerpc_stat.h \
decode_as_dlg.c \
decode_as_dlg.h \
dfilter_expr_dlg.c \
@ -126,6 +133,7 @@ libui_a_SOURCES = \
display_opts.h \
dlg_utils.c \
dlg_utils.h \
ethereal-tap-register.c \
file_dlg.c \
file_dlg.h \
filter_prefs.c \
@ -166,10 +174,6 @@ 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 \
@ -178,7 +182,8 @@ libui_a_SOURCES = \
tcp_graph.c \
tcp_graph.h \
ui_util.c \
ui_util.h
ui_util.h \
$(ETHEREAL_TAP_SRC)
endif
EXTRA_DIST = \

View File

@ -1,7 +1,7 @@
## Makefile for building ethereal.exe with Microsoft C and nmake
## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake
#
# $Id: Makefile.nmake,v 1.33 2002/10/25 01:08:46 guy Exp $
# $Id: Makefile.nmake,v 1.34 2002/11/06 10:53:36 sahlberg Exp $
include ..\config.nmake
@ -21,6 +21,11 @@ CVARSDLL=-DWIN32 -DNULL=0 -D_MT -D_DLL
.c.obj::
$(CC) $(CVARSDLL) $(CFLAGS) -Fd.\ -c $<
ETHEREAL_TAP_SRC = \
dcerpc_stat.obj \
rpc_stat.obj \
rpc_progs.obj
# gtkclist.obj is not in here because it is gtk+-1.2 code,
# while the DLL for GTK+ on windows is gtk+-1.3, and there's
# some functions that have disappeared in gtk+-1.3. I might
@ -31,11 +36,11 @@ OBJECTS=capture_dlg.obj \
colors.obj \
color_utils.obj \
column_prefs.obj \
dcerpc_stat.obj \
decode_as_dlg.obj \
dfilter_expr_dlg.obj \
display_opts.obj \
dlg_utils.obj \
ethereal-tap-register.obj \
file_dlg.obj \
filter_prefs.obj \
find_dlg.obj \
@ -57,14 +62,12 @@ OBJECTS=capture_dlg.obj \
proto_dlg.obj \
proto_draw.obj \
proto_hier_stats_dlg.obj \
rpc_stat.obj \
rpc_progs.obj \
simple_dialog.obj \
stream_prefs.obj \
summary_dlg.obj \
tcp_graph.obj \
ui_util.obj
ui_util.obj \
$(ETHEREAL_TAP_SRC)
libui.lib : ..\config.h $(OBJECTS)
lib /out:libui.lib $(OBJECTS)

View File

@ -1,7 +1,7 @@
/* dcerpc_stat.c
* dcerpc_stat 2002 Ronnie Sahlberg
*
* $Id: dcerpc_stat.c,v 1.1 2002/10/25 01:08:46 guy Exp $
* $Id: dcerpc_stat.c,v 1.2 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -36,6 +36,7 @@
#include "epan/packet_info.h"
#include "simple_dialog.h"
#include "tap.h"
#include "../register.h"
#include "packet-dcerpc.h"
#include "dcerpc_stat.h"
#include "../globals.h"
@ -243,8 +244,8 @@ win_destroy_cb(GtkWindow *win _U_, gpointer data)
/* When called, this function will create a new instance of gtk-dcerpcstat.
*/
void
gtk_dcerpcstat_init(e_uuid_t *uuid, int major, int minor, char *filter)
static void
gtk_dcerpcstat_init(char *optarg)
{
rpcstat_t *rs;
guint32 i, max_procs;
@ -255,16 +256,44 @@ gtk_dcerpcstat_init(e_uuid_t *uuid, int major, int minor, char *filter)
GtkWidget *filter_label;
GtkWidget *tmp;
dcerpc_sub_dissector *procs;
e_uuid_t uuid;
int d1,d2,d3,d40,d41,d42,d43,d44,d45,d46,d47;
int major, minor;
int pos=0;
char *filter=NULL;
rs=g_malloc(sizeof(rpcstat_t));
rs->prog=dcerpc_get_proto_name(uuid, (minor<<8)|(major&0xff) );
if(!rs->prog){
g_free(rs);
fprintf(stderr,"tethereal: dcerpcstat_init() Protocol with uuid:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x v%d.%d not supported\n",uuid->Data1,uuid->Data2,uuid->Data3,uuid->Data4[0],uuid->Data4[1],uuid->Data4[2],uuid->Data4[3],uuid->Data4[4],uuid->Data4[5],uuid->Data4[6],uuid->Data4[7],major,minor);
if(sscanf(optarg,"dcerpc,rtt,%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%d.%d%n", &d1,&d2,&d3,&d40,&d41,&d42,&d43,&d44,&d45,&d46,&d47,&major,&minor,&pos)==13){
uuid.Data1=d1;
uuid.Data2=d2;
uuid.Data3=d3;
uuid.Data4[0]=d40;
uuid.Data4[1]=d41;
uuid.Data4[2]=d42;
uuid.Data4[3]=d43;
uuid.Data4[4]=d44;
uuid.Data4[5]=d45;
uuid.Data4[6]=d46;
uuid.Data4[7]=d47;
if(pos){
filter=optarg+pos;
} else {
filter=NULL;
}
} else {
fprintf(stderr, "tethereal: invalid \"-z dcerpc,rtt,<uuid>,<major version>.<minor version>[,<filter>]\" argument\n");
exit(1);
}
procs=dcerpc_get_proto_sub_dissector(uuid, (minor<<8)|(major&0xff) );
rs->uuid=*uuid;
rs=g_malloc(sizeof(rpcstat_t));
rs->prog=dcerpc_get_proto_name(&uuid, (minor<<8)|(major&0xff) );
if(!rs->prog){
g_free(rs);
fprintf(stderr,"tethereal: dcerpcstat_init() Protocol with uuid:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x v%d.%d not supported\n",uuid.Data1,uuid.Data2,uuid.Data3,uuid.Data4[0],uuid.Data4[1],uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],uuid.Data4[5],uuid.Data4[6],uuid.Data4[7],major,minor);
exit(1);
}
procs=dcerpc_get_proto_sub_dissector(&uuid, (minor<<8)|(major&0xff) );
rs->uuid=uuid;
rs->ver=(minor<<8)|(major&0xff);
rs->win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
@ -404,12 +433,17 @@ static void
dcerpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
{
char *filter;
char str[256];
filter=(char *)gtk_entry_get_text(GTK_ENTRY(filter_entry));
if(filter[0]==0){
filter=NULL;
sprintf(str, "dcerpc,rtt,%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%d.%d",dcerpc_uuid_program->Data1,dcerpc_uuid_program->Data2,dcerpc_uuid_program->Data3,dcerpc_uuid_program->Data4[0],dcerpc_uuid_program->Data4[1],dcerpc_uuid_program->Data4[2],dcerpc_uuid_program->Data4[3],dcerpc_uuid_program->Data4[4],dcerpc_uuid_program->Data4[5],dcerpc_uuid_program->Data4[6],dcerpc_uuid_program->Data4[7],dcerpc_version&0xff,dcerpc_version>>8);
} else {
sprintf(str, "dcerpc,rtt,%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%d.%d,%s",dcerpc_uuid_program->Data1,dcerpc_uuid_program->Data2,dcerpc_uuid_program->Data3,dcerpc_uuid_program->Data4[0],dcerpc_uuid_program->Data4[1],dcerpc_uuid_program->Data4[2],dcerpc_uuid_program->Data4[3],dcerpc_uuid_program->Data4[4],dcerpc_uuid_program->Data4[5],dcerpc_uuid_program->Data4[6],dcerpc_uuid_program->Data4[7],dcerpc_version&0xff,dcerpc_version>>8, filter);
}
gtk_dcerpcstat_init(dcerpc_uuid_program, dcerpc_version&0xff, dcerpc_version>>8, filter);
gtk_dcerpcstat_init(str);
}
@ -574,3 +608,8 @@ gtk_dcerpcstat_cb(GtkWidget *w _U_, gpointer d _U_)
gtk_widget_show_all(dlg);
}
void
register_tap_listener_gtkdcerpcstat(void)
{
register_ethereal_tap("dcerpc,rtt,", gtk_dcerpcstat_init, NULL, NULL);
}

View File

@ -1,7 +1,7 @@
/* dcerpc_stat.h
* dcerpc_stat 2002 Ronnie Sahlberg
*
* $Id: dcerpc_stat.h,v 1.1 2002/10/25 01:08:46 guy Exp $
* $Id: dcerpc_stat.h,v 1.2 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,7 +25,6 @@
#ifndef __DCERPCSTAT_H__
#define __DCERPCSTAT_H__
void gtk_dcerpcstat_init(e_uuid_t *uuid, int major, int minor, char *filter);
void gtk_dcerpcstat_cb(GtkWidget *w, gpointer d);
#endif

View File

@ -1,6 +1,6 @@
/* main.c
*
* $Id: main.c,v 1.272 2002/11/03 17:38:33 oabad Exp $
* $Id: main.c,v 1.273 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -129,10 +129,6 @@
#include "image/clist_ascend.xpm"
#include "image/clist_descend.xpm"
#include "../tap.h"
#include "rpc_stat.h"
#include "rpc_progs.h"
#include "../packet-dcerpc.h"
#include "dcerpc_stat.h"
#ifdef WIN32
#include "capture-wpcap.h"
@ -1339,6 +1335,28 @@ unprotect_thread_critical_region(void)
#endif
}
/* structure to keep track of what tap listeners have been registered.
*/
typedef struct _ethereal_tap_list {
struct _ethereal_tap_list *next;
char *cmd;
void (*func)(char *arg);
} ethereal_tap_list;
static ethereal_tap_list *tap_list=NULL;
void
register_ethereal_tap(char *cmd, void (*func)(char *arg), char *dummy _U_, void (*dummy2)(void) _U_)
{
ethereal_tap_list *newtl;
newtl=malloc(sizeof(ethereal_tap_list));
newtl->next=tap_list;
tap_list=newtl;
newtl->cmd=cmd;
newtl->func=func;
}
/* And now our feature presentation... [ fade to music ] */
int
main(int argc, char *argv[])
@ -1391,6 +1409,7 @@ main(int argc, char *argv[])
#endif
gint desk_x, desk_y;
gboolean prefs_write_needed = FALSE;
ethereal_tap_list *tli;
#define OPTSTRING_INIT "a:b:B:c:f:hi:klm:nN:o:pP:Qr:R:Ss:t:T:w:vz:"
@ -1441,6 +1460,7 @@ main(int argc, char *argv[])
dissectors, and we must do it before we read the preferences, in
case any dissectors register preferences. */
epan_init(PLUGIN_DIR,register_all_protocols,register_all_protocol_handoffs);
register_all_tap_listeners();
/* Now register the preferences for any non-dissector modules.
We must do that before we read the preferences as well. */
@ -1815,68 +1835,22 @@ main(int argc, char *argv[])
cfile.save_file_fd = atoi(optarg);
break;
#endif
case 'z':
if(!strncmp(optarg,"rpc,",4)){
if(!strncmp(optarg,"rpc,rtt,",8)){
int rpcprogram, rpcversion;
int pos=0;
if(sscanf(optarg,"rpc,rtt,%d,%d,%n",&rpcprogram,&rpcversion,&pos)==2){
if(pos){
gtk_rpcstat_init(rpcprogram,rpcversion,optarg+pos);
} else {
gtk_rpcstat_init(rpcprogram,rpcversion,NULL);
}
} else {
fprintf(stderr, "ethereal: invalid \"-z rpc,rtt,<program>,<version>[,<filter>]\" argument\n");
exit(1);
}
} else if(!strncmp(optarg,"rpc,programs",12)){
gtk_rpcprogs_init();
} else {
fprintf(stderr, "ethereal: invalid -z argument. Argument must be one of:\n");
fprintf(stderr, " \"-z rpc,rtt,<program>,<version>[,<filter>]\"\n");
fprintf(stderr, " \"-z rpc,programs\"\n");
exit(1);
}
} else if(!strncmp(optarg,"dcerpc,",7)){
if(!strncmp(optarg,"dcerpc,rtt,",11)){
e_uuid_t uuid;
int d1,d2,d3,d40,d41,d42,d43,d44,d45,d46,d47;
int major, minor;
int pos=0;
if(sscanf(optarg,"dcerpc,rtt,%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%d.%d%n", &d1,&d2,&d3,&d40,&d41,&d42,&d43,&d44,&d45,&d46,&d47,&major,&minor,&pos)==13){
uuid.Data1=d1;
uuid.Data2=d2;
uuid.Data3=d3;
uuid.Data4[0]=d40;
uuid.Data4[1]=d41;
uuid.Data4[2]=d42;
uuid.Data4[3]=d43;
uuid.Data4[4]=d44;
uuid.Data4[5]=d45;
uuid.Data4[6]=d46;
uuid.Data4[7]=d47;
if(pos){
gtk_dcerpcstat_init(&uuid,major,minor,optarg+pos);
} else {
gtk_dcerpcstat_init(&uuid,major,minor,NULL);
}
} else {
fprintf(stderr, "ethereal: invalid \"-z dcerpc,rtt,<uuid>,<major version>.<minor version>[,<filter>]\" argument\n");
exit(1);
}
} else {
fprintf(stderr, "tethereal: invalid -z argument. Argument must be one of:\n");
fprintf(stderr, " \"-z dcerpc,rtt,<uuid>,<major version>.<minor version>[,<filter>]\"\n");
exit(1);
}
} else {
fprintf(stderr, "ethereal: invalid -z argument. Argument must be one of:\n");
fprintf(stderr, " \"-z rpc,...\"\n");
fprintf(stderr, " \"-z dcerpc,...\"\n");
exit(1);
}
case 'z':
for(tli=tap_list;tli;tli=tli->next){
if(!strncmp(tli->cmd,optarg,strlen(tli->cmd))){
(*tli->func)(optarg);
break;
}
}
if(!tli){
fprintf(stderr,"ethereal: invalid -z argument.\n");
fprintf(stderr," -z argument must be one of :\n");
for(tli=tap_list;tli;tli=tli->next){
fprintf(stderr," %s\n",tli->cmd);
}
exit(1);
}
break;
#ifdef _WIN32
#ifdef HAVE_LIBPCAP

View File

@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
* $Id: menu.c,v 1.70 2002/11/03 17:38:33 oabad Exp $
* $Id: menu.c,v 1.71 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -178,7 +178,7 @@ static GtkItemFactoryEntry menu_items[] =
{"/Tools/Statistics", NULL, NULL, 0, "<Branch>" },
{"/Tools/Statistics/ONC-RPC", NULL, NULL, 0, "<Branch>", },
{"/Tools/Statistics/ONC-RPC/RTT", NULL, GTK_MENU_FUNC(gtk_rpcstat_cb), 0, NULL, },
{"/Tools/Statistics/ONC-RPC/Programs", NULL, GTK_MENU_FUNC(gtk_rpcprogs_init), 0, NULL, },
{"/Tools/Statistics/ONC-RPC/Programs", NULL, GTK_MENU_FUNC(gtk_rpcprogs_cb), 0, NULL, },
{"/Tools/Statistics/DCE-RPC", NULL, NULL, 0, "<Branch>", },
{"/Tools/Statistics/DCE-RPC/RTT", NULL, GTK_MENU_FUNC(gtk_dcerpcstat_cb), 0, NULL, },
{"/_Help", NULL, NULL, 0, "<LastBranch>" },

View File

@ -1,7 +1,7 @@
/* rpc_progs.c
* rpc_progs 2002 Ronnie Sahlberg
*
* $Id: rpc_progs.c,v 1.3 2002/10/23 23:17:11 guy Exp $
* $Id: rpc_progs.c,v 1.4 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -35,6 +35,7 @@
#include <gtk/gtk.h>
#include "epan/packet_info.h"
#include "tap.h"
#include "../register.h"
#include "rpc_progs.h"
#include "packet-rpc.h"
#include "../globals.h"
@ -301,8 +302,8 @@ win_destroy_cb(void *dummy _U_, gpointer data _U_)
/* When called, this function will start rpcprogs
*/
void
gtk_rpcprogs_init(void)
static void
gtk_rpcprogs_init(char *optarg _U_)
{
char title_string[60];
GtkWidget *vbox;
@ -375,3 +376,14 @@ gtk_rpcprogs_init(void)
redissect_packets(&cfile);
}
void
gtk_rpcprogs_cb(GtkWidget *w _U_, gpointer d _U_)
{
gtk_rpcprogs_init("");
}
void
register_tap_listener_gtkrpcprogs(void)
{
register_ethereal_tap("rpc,programs", gtk_rpcprogs_init, NULL, NULL);
}

View File

@ -1,7 +1,7 @@
/* rpc_progs.h
* rpc_progs 2002 Ronnie Sahlberg
*
* $Id: rpc_progs.h,v 1.1 2002/09/07 10:02:32 sahlberg Exp $
* $Id: rpc_progs.h,v 1.2 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,7 +25,6 @@
#ifndef __RPC_PROGS_H__
#define __RPC_PROGS_H__
void gtk_rpcprogs_init(void);
void gtk_rpcprogs_cb(GtkWidget *w, gpointer d);
#endif

View File

@ -1,7 +1,7 @@
/* rpc_stat.c
* rpc_stat 2002 Ronnie Sahlberg
*
* $Id: rpc_stat.c,v 1.4 2002/10/23 23:17:11 guy Exp $
* $Id: rpc_stat.c,v 1.5 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -36,6 +36,7 @@
#include "epan/packet_info.h"
#include "simple_dialog.h"
#include "tap.h"
#include "../register.h"
#include "rpc_stat.h"
#include "packet-rpc.h"
#include "../globals.h"
@ -268,8 +269,8 @@ win_destroy_cb(GtkWindow *win _U_, gpointer data)
/* When called, this function will create a new instance of gtk2-rpcstat.
*/
void
gtk_rpcstat_init(guint32 program, guint32 version, char *filter)
static void
gtk_rpcstat_init(char *optarg)
{
rpcstat_t *rs;
guint32 i;
@ -279,6 +280,20 @@ gtk_rpcstat_init(guint32 program, guint32 version, char *filter)
GtkWidget *stat_label;
GtkWidget *filter_label;
GtkWidget *tmp;
int program, version, pos;
char *filter=NULL;
pos=0;
if(sscanf(optarg,"rpc,rtt,%d,%d,%n",&program,&version,&pos)==2){
if(pos){
filter=optarg+pos;
} else {
filter=NULL;
}
} else {
fprintf(stderr, "ethereal: invalid \"-z rpc,rtt,<program>,<version>[,<filter>]\" argument\n");
exit(1);
}
rpc_program=program;
rpc_version=version;
@ -412,12 +427,16 @@ static void
rpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
{
char *filter;
char str[256];
filter=(char *)gtk_entry_get_text(GTK_ENTRY(filter_entry));
if(filter[0]==0){
filter=NULL;
sprintf(str, "rpc,rtt,%d,%d", rpc_program, rpc_version);
filter="";
} else {
sprintf(str, "rpc,rtt,%d,%d,%s", rpc_program, rpc_version, filter);
}
gtk_rpcstat_init(rpc_program, rpc_version, filter);
gtk_rpcstat_init(str);
}
@ -583,3 +602,8 @@ gtk_rpcstat_cb(GtkWidget *w _U_, gpointer d _U_)
}
void
register_tap_listener_gtkrpcstat(void)
{
register_ethereal_tap("rpc,rtt,", gtk_rpcstat_init, NULL, NULL);
}

View File

@ -1,7 +1,7 @@
/* rpc_stat.h
* rpc_stat 2002 Ronnie Sahlberg
*
* $Id: rpc_stat.h,v 1.2 2002/09/27 11:07:10 sahlberg Exp $
* $Id: rpc_stat.h,v 1.3 2002/11/06 10:53:36 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,7 +25,6 @@
#ifndef __RPCSTAT_H__
#define __RPCSTAT_H__
void gtk_rpcstat_init(guint32 program, guint32 version, char *filter);
void gtk_rpcstat_cb(GtkWidget *w, gpointer d);
#endif