As suggested by Anders: back out 37112.
[obnox/wireshark/wip.git] / tap-protohierstat.c
index 1e04f028d8155928ea5f367026c878a2847f1e24..89eac20d1c3b559c5ff0ed8f287699fab6e30edf 100644 (file)
@@ -1,28 +1,28 @@
 /* tap-protohierstat.c
  * protohierstat   2002 Ronnie Sahlberg
  *
- * $Id: tap-protohierstat.c,v 1.3 2003/04/23 08:20:02 guy Exp $
+ * $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
  * 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 ProtocolHierarchyStatistics for tethereal */
+/* This module provides ProtocolHierarchyStatistics for tshark */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -38,8 +38,8 @@
 #include "epan/packet_info.h"
 #include "epan/epan_dissect.h"
 #include "epan/proto.h"
-#include "tap.h"
-#include "register.h"
+#include <epan/tap.h>
+#include <epan/stat_cmd_args.h>
 
 typedef struct _phs_t {
        struct _phs_t *sibling;
@@ -47,9 +47,9 @@ typedef struct _phs_t {
        struct _phs_t *parent;
        char *filter;
        int protocol;
-       char *proto_name;
+       const char *proto_name;
        guint32 frames;
-       guint32 bytes;
+       guint64 bytes;
 } phs_t;
 
 
@@ -71,11 +71,11 @@ new_phs_t(phs_t *parent)
 
 
 static int
-protohierstat_packet(void *prs, packet_info *pinfo, epan_dissect_t *edt, void *dummy _U_)
+protohierstat_packet(void *prs, packet_info *pinfo, epan_dissect_t *edt, const void *dummy _U_)
 {
        phs_t *rs=prs;
        phs_t *tmprs;
-       proto_tree *tree;
+       proto_node *node;
        field_info *fi;
 
        if(!edt){
@@ -84,12 +84,12 @@ protohierstat_packet(void *prs, packet_info *pinfo, epan_dissect_t *edt, void *d
        if(!edt->tree){
                return 0;
        }
-       if(!edt->tree->children){
+       if(!edt->tree->first_child){
                return 0;
        }
 
-       for(tree=edt->tree->children;tree;tree=tree->next){
-               fi=PITEM_FINFO(tree);
+       for(node=edt->tree->first_child;node;node=node->next){
+               fi=PNODE_FINFO(node);
 
                /* first time we saw a protocol at this leaf */
                if(rs->protocol==-1){
@@ -135,18 +135,24 @@ protohierstat_packet(void *prs, packet_info *pinfo, epan_dissect_t *edt, void *d
 static void
 phs_draw(phs_t *rs, int indentation)
 {
-       int i;
-       char str[80];
+       int i, stroff;
+#define MAXPHSLINE 80
+       char str[MAXPHSLINE];
        for(;rs;rs=rs->sibling){
                if(rs->protocol==-1){
                        return;
                }
                str[0]=0;
+               stroff=0;
                for(i=0;i<indentation;i++){
-                       strcat(str,"  ");
+                       if(i>15){
+                               stroff+=g_snprintf(str+stroff, MAXPHSLINE-stroff, "...");
+                               break;
+                       }
+                       stroff+=g_snprintf(str+stroff, MAXPHSLINE-stroff, "  ");
                }
-               strcat(str, rs->proto_name);
-               printf("%-40s frames:%d bytes:%d\n",str, rs->frames, rs->bytes);
+               g_snprintf(str+stroff, MAXPHSLINE-stroff, "%s", rs->proto_name);
+               printf("%-40s frames:%d bytes:%" G_GINT64_MODIFIER "d\n",str, rs->frames, rs->bytes);
                phs_draw(rs->child, indentation+1);
        }
 }
@@ -166,46 +172,39 @@ protohierstat_draw(void *prs)
 
 
 static void
-protohierstat_init(char *optarg)
+protohierstat_init(const char *optarg, void* userdata _U_)
 {
        phs_t *rs;
        int pos=0;
-       char *filter=NULL;
+       const char *filter=NULL;
        GString *error_string;
 
-       if(!strcmp("io,phs",optarg)){
-               filter="frame";
+       if(strcmp("io,phs",optarg)==0){
+               /* No arguments */
        } else if(sscanf(optarg,"io,phs,%n",&pos)==0){
                if(pos){
                        filter=optarg+pos;
-               } else {
-                       /* We must use a filter to guarantee that edt->tree
-                          will be populated. "frame" matches everything so
-                          that one is used instead of no filter.
-                       */
-                       filter="frame"; 
                }
        } else {
-               fprintf(stderr, "tethereal: invalid \"-z io,phs[,<filter>]\" argument\n");
+               fprintf(stderr, "tshark: invalid \"-z io,phs[,<filter>]\" argument\n");
                exit(1);
        }
 
        rs=new_phs_t(NULL);
 
        if(filter){
-               rs->filter=g_malloc(strlen(filter)+1);
-               strcpy(rs->filter, filter);
+               rs->filter=g_strdup(filter);
        } else {
                rs->filter=NULL;
        }
 
-       error_string=register_tap_listener("frame", rs, filter, NULL, protohierstat_packet, protohierstat_draw);
+       error_string=register_tap_listener("frame", rs, filter, TL_REQUIRES_PROTO_TREE, NULL, protohierstat_packet, protohierstat_draw);
        if(error_string){
                /* error, we failed to attach to the tap. clean up */
                g_free(rs->filter);
                g_free(rs);
 
-               fprintf(stderr, "tethereal: Couldn't register io,phs tap: %s\n",
+               fprintf(stderr, "tshark: Couldn't register io,phs tap: %s\n",
                    error_string->str);
                g_string_free(error_string, TRUE);
                exit(1);
@@ -216,6 +215,6 @@ protohierstat_init(char *optarg)
 void
 register_tap_listener_protohierstat(void)
 {
-       register_ethereal_tap("io,phs", protohierstat_init);
+       register_stat_cmd_arg("io,phs", protohierstat_init, NULL);
 }