change all file offsets from long to gint64 so we can - theoretically - handle files...
[obnox/wireshark/wip.git] / tap-rpcstat.c
index c0981a3a31775582f2ca7cb7c176b0107f65b740..5ba75043a047db2a398e2d08a6a1cb9f638cf6d9 100644 (file)
@@ -3,8 +3,8 @@
  *
  * $Id$
  *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  * 
  * This program is free software; you can redistribute it and/or
@@ -22,8 +22,8 @@
  * 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
+/* This module provides rpc call/reply RTT statistics to tshark.
+ * It is only used by tshark and not wireshark
  *
  * It serves as an example on how to use the tap api.
  */
 #include <string.h>
 #include "epan/packet_info.h"
 #include <epan/tap.h>
+#include <epan/stat_cmd_args.h>
 #include <epan/dissectors/packet-rpc.h>
 #include "register.h"
 
 /* used to keep track of statistics for a specific procedure */
 typedef struct _rpc_procedure_t {
-       char *proc;
+       const char *proc;
        int num;
        nstime_t min;
        nstime_t max;
@@ -65,11 +66,11 @@ typedef struct _rpcstat_t {
 
 
 
-/* This callback is never used by tethereal but it is here for completeness.
+/* This callback is never used by tshark but it is here for completeness.
  * When registering below, we could just have left this function as NULL.
  *
- * When used by ethereal, this function will be called whenever we would need
- * to reset all state. Such as when ethereal opens a new file, when it
+ * When used by wireshark, this function will be called whenever we would need
+ * to reset all state. Such as when wireshark opens a new file, when it
  * starts a new capture, when it rescans the packetlist after some prefs have
  * changed etc.
  * So if your aplication has some state it needs to clean up in those
@@ -101,7 +102,7 @@ rpcstat_reset(void *prs)
  * later.
  *
  * This function should be as lightweight as possible since it executes together
- * with the normal ethereal dissectors. Try to push as much processing as
+ * with the normal wireshark dissectors. Try to push as much processing as
  * possible into (*draw) instead since that function executes asynchronously
  * and does not affect the main threads performance.
  *
@@ -147,12 +148,7 @@ rpcstat_packet(void *prs, packet_info *pinfo, epan_dissect_t *edt _U_, const voi
        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--;
-       }
+       nstime_delta(&delta, &pinfo->fd->abs_ts, &ri->req_time);
 
        if(rp->num==0){
                rp->max.secs=delta.secs;
@@ -190,12 +186,12 @@ rpcstat_packet(void *prs, packet_info *pinfo, epan_dissect_t *edt _U_, const voi
        return 1;
 }
 
-/* This callback is used when tethereal wants us to draw/update our
- * data to the output device. Since this is tethereal only output is
+/* This callback is used when tshark wants us to draw/update our
+ * data to the output device. Since this is tshark only output is
  * stdout.
- * Tethereal will only call this callback once, which is when tethereal has
+ * TShark will only call this callback once, which is when tshark has
  * finished reading all packets and exists.
- * If used with ethereal this may be called any time, perhaps once every 3 
+ * If used with wireshark this may be called any time, perhaps once every 3 
  * seconds or so.
  * This function may even be called in parallell with (*reset) or (*draw)
  * so make sure there are no races. The data in the rpcstat_t can thus change
@@ -272,18 +268,18 @@ rpcstat_find_procs(gpointer *key, gpointer *value _U_, gpointer *user_data _U_)
 /* When called, this function will create a new instance of rpcstat.
  * program and version are whick onc-rpc program/version we want to
  * collect statistics for.
- * This function is called from tethereal when it parses the -z rpc, arguments
+ * This function is called from tshark when it parses the -z rpc, arguments
  * and it creates a new instance to store statistics in and registers this
  * new instance for the rpc tap.
  */
 static void
-rpcstat_init(char *optarg)
+rpcstat_init(const char *optarg, void* userdata _U_)
 {
        rpcstat_t *rs;
        guint32 i;
        int program, version;
        int pos=0;
-       char *filter=NULL;
+       const char *filter=NULL;
        GString *error_string;
 
        if(sscanf(optarg,"rpc,rtt,%d,%d,%n",&program,&version,&pos)==2){
@@ -293,7 +289,7 @@ rpcstat_init(char *optarg)
                        filter=NULL;
                }
        } else {
-               fprintf(stderr, "tethereal: invalid \"-z rpc,rtt,<program>,<version>[,<filter>]\" argument\n");
+               fprintf(stderr, "tshark: invalid \"-z rpc,rtt,<program>,<version>[,<filter>]\" argument\n");
                exit(1);
        }
 
@@ -313,8 +309,8 @@ rpcstat_init(char *optarg)
        rpc_max_proc=-1;
        g_hash_table_foreach(rpc_procs, (GHFunc)rpcstat_find_procs, NULL);
        if(rpc_min_proc==-1){
-               fprintf(stderr,"tethereal: Invalid -z rpc,rrt,%d,%d\n",rpc_program,rpc_version);
-               fprintf(stderr,"   Program:%d version:%d isn't supported by tethereal.\n", rpc_program, rpc_version);
+               fprintf(stderr,"tshark: Invalid -z rpc,rrt,%d,%d\n",rpc_program,rpc_version);
+               fprintf(stderr,"   Program:%d version:%d isn't supported by tshark.\n", rpc_program, rpc_version);
                exit(1);
        }
 
@@ -349,7 +345,7 @@ rpcstat_init(char *optarg)
                g_free(rs->filter);
                g_free(rs);
 
-               fprintf(stderr, "tethereal: Couldn't register rpc,rtt tap: %s\n",
+               fprintf(stderr, "tshark: Couldn't register rpc,rtt tap: %s\n",
                    error_string->str);
                g_string_free(error_string, TRUE);
                exit(1);
@@ -360,6 +356,6 @@ rpcstat_init(char *optarg)
 void
 register_tap_listener_rpcstat(void)
 {
-       register_tap_listener_cmd_arg("rpc,rtt,", rpcstat_init);
+       register_stat_cmd_arg("rpc,rtt,", rpcstat_init,NULL);
 }