Make a "dissect_rpc_indir_call()" routine to dissect arguments to a
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 9 Feb 2001 06:49:29 +0000 (06:49 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 9 Feb 2001 06:49:29 +0000 (06:49 +0000)
specified program/version/procedure, and a "rpc_proc_name()" routine to
return the name of a specified program/version/procedure, and make the
callit dissector use those, rather than doing the work itself.

Un-export various routines and declarations that can again be private to
the RPC dissector.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@3007 f5534014-38df-0310-8fa8-9805f1628bb7

packet-portmap.c
packet-rpc.c
packet-rpc.h

index f48311b21919d8248260b54e113a1fe0dd1c74eb..d10143eb296c49a618b641b0d351b5845a2f1140 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-portmap.c
  * Routines for portmap dissection
  *
- * $Id: packet-portmap.c,v 1.26 2001/02/06 06:56:19 guy Exp $
+ * $Id: packet-portmap.c,v 1.27 2001/02/09 06:49:29 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -206,50 +206,29 @@ int dissect_dump_reply(tvbuff_t *tvb, int offset, packet_info *pinfo,
 int dissect_callit_call(tvbuff_t *tvb, int offset, packet_info *pinfo,
        proto_tree *tree)
 {
-       rpc_proc_info_key key;
-       rpc_proc_info_value *value;
-       char *procname = NULL;
-       char procname_static[20];
-       old_dissect_function_t *old_dissect_function = NULL;
-       dissect_function_t *dissect_function = NULL;
-
-       key.prog = tvb_get_ntohl(tvb, offset+0);
+       guint32 prog, vers, proc;
+
+       prog = tvb_get_ntohl(tvb, offset+0);
        if ( tree )
        {
                proto_tree_add_uint_format(tree, hf_portmap_prog, tvb,
-                       offset, 4, key.prog, "Program: %s (%u)",
-                       rpc_prog_name(key.prog), key.prog);
+                       offset, 4, prog, "Program: %s (%u)",
+                       rpc_prog_name(prog), prog);
        }
 
-       key.vers = tvb_get_ntohl(tvb, offset+4);
+       vers = tvb_get_ntohl(tvb, offset+4);
        if ( tree )
        {
                proto_tree_add_uint(tree, hf_portmap_version, tvb,
-                       offset+4, 4, key.vers);
+                       offset+4, 4, vers);
        }
 
-       key.proc = tvb_get_ntohl(tvb, offset+8);
-       if ((value = g_hash_table_lookup(rpc_procs,&key)) != NULL) {
-               if (value->is_old_dissector)
-                       old_dissect_function = value->dissect_call.old;
-               else
-                       dissect_function = value->dissect_call.new;
-               procname = value->name;
-       }
-       else {
-               /* happens only with strange program versions or
-                  non-existing dissectors */
-#if 0
-               dissect_function = NULL;
-#endif
-               sprintf(procname_static, "proc-%u", key.proc);
-               procname = procname_static;
-       }
+       proc = tvb_get_ntohl(tvb, offset+8);
        if ( tree )
        {
                proto_tree_add_uint_format(tree, hf_portmap_proc, tvb,
-                       offset+8, 4, key.proc, "Procedure: %s (%u)",
-                       procname, key.proc);
+                       offset+8, 4, proc, "Procedure: %s (%u)",
+                       rpc_proc_name(prog, vers, proc), proc);
        }
 
        if ( tree )
@@ -261,12 +240,12 @@ int dissect_callit_call(tvbuff_t *tvb, int offset, packet_info *pinfo,
 
        offset += 16;
 
-       /* Call the call dissector to dissect the opaque arguments.
-          Make the columns non-writable, so it won't change them out
-          from under us. */
+       /* Dissect the arguments for this procedure.
+          Make the columns non-writable, so the dissector won't change
+          them out from under us. */
        col_set_writable(pinfo->fd, FALSE);
-       offset = call_dissect_function(tvb, pinfo, tree, offset,
-                       old_dissect_function, dissect_function, NULL);
+       offset = dissect_rpc_indir_call(tvb, pinfo, tree, offset, prog,
+               vers, proc);
 
        return offset;
 }
index 2b9ac66d08d35c86856922b6e340edab44c7e0b8..fddf3b676f8bb1cf08aba97e7173d987f7ffb3d3 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for rpc dissection
  * Copyright 1999, Uwe Girlich <Uwe.Girlich@philosys.de>
  * 
- * $Id: packet-rpc.c,v 1.52 2001/02/06 06:46:10 guy Exp $
+ * $Id: packet-rpc.c,v 1.53 2001/02/09 06:49:29 guy Exp $
  * 
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -178,7 +178,26 @@ static gint ett_rpc_gss_data = -1;
 static GHashTable *rpc_progs;
 
 /* Hash table with info on RPC procedure numbers */
-GHashTable *rpc_procs;
+static GHashTable *rpc_procs;
+
+typedef struct _rpc_proc_info_key {
+       guint32 prog;
+       guint32 vers;
+       guint32 proc;
+} rpc_proc_info_key;
+
+typedef struct _rpc_proc_info_value {
+       gchar           *name;
+       gboolean        is_old_dissector;
+       union {
+               old_dissect_function_t *old;
+               dissect_function_t *new;
+       } dissect_call;
+       union {
+               old_dissect_function_t *old;
+               dissect_function_t *new;
+       } dissect_reply;
+} rpc_proc_info_value;
 
 typedef struct _rpc_prog_info_key {
        guint32 prog;
@@ -190,6 +209,7 @@ typedef struct _rpc_prog_info_value {
        char* progname;
 } rpc_prog_info_value;
 
+
 /***********************************/
 /* Hash array with procedure names */
 /***********************************/
@@ -266,6 +286,29 @@ rpc_init_proc_table(guint prog, guint vers, const vsff *proc_table)
        }
 }
 
+/*     return the name associated with a previously registered procedure. */
+char *rpc_proc_name(guint32 prog, guint32 vers, guint32 proc)
+{
+       rpc_proc_info_key key;
+       rpc_proc_info_value *value;
+       char *procname;
+       static char procname_static[20];
+
+       key.prog = prog;
+       key.vers = vers;
+       key.proc = proc;
+
+       if ((value = g_hash_table_lookup(rpc_procs,&key)) != NULL)
+               procname = value->name;
+       else {
+               /* happens only with strange program versions or
+                  non-existing dissectors */
+               sprintf(procname_static, "proc-%u", key.proc);
+               procname = procname_static;
+       }
+       return procname;
+}
+
 /*----------------------------------------*/
 /* end of Hash array with procedure names */
 /*----------------------------------------*/
@@ -988,7 +1031,7 @@ dissect_rpc_authgss_initres(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree,
 }
 
 
-int
+static int
 call_dissect_function(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        int offset, old_dissect_function_t *old_dissect_function,
        dissect_function_t* dissect_function, const char *progname)
@@ -1072,6 +1115,40 @@ dissect_rpc_authgss_priv_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
        return offset;
 }
 
+/*
+ * Dissect the arguments to an indirect call; used by the portmapper/RPCBIND
+ * dissector.
+ */
+int
+dissect_rpc_indir_call(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+    int offset, guint32 prog, guint32 vers, guint32 proc)
+{
+       rpc_proc_info_key key;
+       rpc_proc_info_value *value;
+       old_dissect_function_t *old_dissect_function = NULL;
+       dissect_function_t *dissect_function = NULL;
+
+       key.prog = prog;
+       key.vers = vers;
+       key.proc = proc;
+       if ((value = g_hash_table_lookup(rpc_procs,&key)) != NULL) {
+               if (value->is_old_dissector)
+                       old_dissect_function = value->dissect_call.old;
+               else
+                       dissect_function = value->dissect_call.new;
+       }
+       else {
+               /* happens only with strange program versions or
+                  non-existing dissectors */
+#if 0
+               dissect_function = NULL;
+#endif
+       }
+
+       offset = call_dissect_function(tvb, pinfo, tree, offset,
+                       old_dissect_function, dissect_function, NULL);
+       return offset;
+}
 
 static gboolean
 dissect_rpc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
index 1f3db02932c1f006d911ef1206abf07914c34b66..d873b78a84c4a37edaae2753982feecec14e499f 100644 (file)
@@ -1,6 +1,6 @@
 /* packet-rpc.h
  *
- * $Id: packet-rpc.h,v 1.24 2001/02/06 06:46:10 guy Exp $
+ * $Id: packet-rpc.h,v 1.25 2001/02/09 06:49:29 guy Exp $
  *
  * (c) 1999 Uwe Girlich
  *
@@ -88,41 +88,13 @@ typedef struct _vsff {
        dissect_function_t *dissect_reply;
 } vsff;
 
-/*
- * These are used by the CALLIT handler for the portmapper dissector.
- */
-typedef struct _rpc_proc_info_key {
-       guint32 prog;
-       guint32 vers;
-       guint32 proc;
-} rpc_proc_info_key;
-
-typedef struct _rpc_proc_info_value {
-       gchar           *name;
-       gboolean        is_old_dissector;
-       union {
-               old_dissect_function_t *old;
-               dissect_function_t *new;
-       } dissect_call;
-       union {
-               old_dissect_function_t *old;
-               dissect_function_t *new;
-       } dissect_reply;
-} rpc_proc_info_value;
-
-/* Hash table with info on RPC procedure numbers */
-GHashTable *rpc_procs;
-
 extern const value_string rpc_auth_flavor[];
 
 extern void old_rpc_init_proc_table(guint prog, guint vers, const old_vsff *proc_table);
 extern void rpc_init_proc_table(guint prog, guint vers, const vsff *proc_table);
 extern void rpc_init_prog(int proto, guint32 prog, int ett);
 extern char *rpc_prog_name(guint32 prog);
-extern int call_dissect_function(tvbuff_t *tvb, packet_info *pinfo,
-       proto_tree *tree, int offset,
-       old_dissect_function_t *old_dissect_function,
-       dissect_function_t* dissect_function, const char *progname);
+extern char *rpc_proc_name(guint32 prog, guint32 vers, guint32 proc);
 
 extern unsigned int rpc_roundup(unsigned int a);
 extern int dissect_rpc_bool(const u_char *pd, int offset, frame_data *fd,
@@ -150,6 +122,8 @@ extern int dissect_rpc_uint64(const u_char *pd, int offset, frame_data *fd,
 extern int dissect_rpc_uint64_tvb(tvbuff_t *tvb, packet_info *pinfo,
        proto_tree *tree, int hfindex, int offset);
 
+extern int dissect_rpc_indir_call(tvbuff_t *tvb, packet_info *pinfo,
+       proto_tree *tree, int offset, guint32 prog, guint32 vers, guint32 proc);
 
 #endif /* packet-rpc.h */