wireshark/plugins/plugin_api.c

143 lines
6.5 KiB
C
Raw Normal View History

/* plugin_api.c
* Routines for Ethereal plugins.
*
Add a mechanism by which a dissector can be registered by name, another dissector can get a "handle" for that dissector by name and then call that dissector through the handle. This allows dissectors that can't be called through a port table or a heuristic table to be called from other dissectors without directly referring to the dissector function - dynamically-loaded modules, under Windows, cannot directly call functions in the main program, and non-plugin dissectors are in the main program and thus cannot be called from plugin dissectors unless either 1) a pointer to the dissector is put in the Big Transfer Vector or 2) some other mechanism for getting a pointer to the dissector is provided. This mechanism could also support registering old-style dissectors and calling them from new-style dissectors without the new-style dissector having to do the argument translation itself (I didn't add support for registering old-style dissectors because I'd prefer to have people tvbuffify their code if they have to register a dissector...). It could also, in the future, perhaps support disabling of protocols; setting "pinfo->current_proto"; inside "call_dissector()" - and inside "{old_}dissector_try_port()" and "{old_"dissector_try_heuristic()" - allowing a pile of stuff that currently has to be done in every dissector be done by common code. (I have some ideas about how to do this, by having "proto_register_protocol()" take an abbreviation - of the sort that would be put in, for example, "pinfo->current_proto" - as an argument; having the calls to register dissectors take an index returned by "proto_register_protocol()" as an argument. The abbreviation could be used elsewhere as well, e.g. in the "Decoding" tab of the "Edit->Protocols" dialog box, and in a GUI for constructing protocol filters. Watch this space.) Make "dissect_sdp()" the first client of this mechanism; it's now static to "packet-sdp.c", and all dissectors that call it - including the MGCP plugin - now call it through a dissector handle fetched by "find_dissector()". (Next step - see if Ethereal can now compile on Windows as a result of this.) svn path=/trunk/; revision=2647
2000-11-15 07:07:52 +00:00
* $Id: plugin_api.c,v 1.13 2000/11/15 07:07:49 guy Exp $
*
* Ethereal - Network traffic analyzer
* Copyright 2000 by Gilbert Ramirez <gram@xiexie.org>
*
*
* 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.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdarg.h>
#include <glib.h>
#include "plugin_api.h"
packet_info *p_pi = NULL;
void
plugin_address_table_init(plugin_address_table_t *pat)
{
p_pi = pat->p_pi;
p_check_col = pat->p_check_col;
p_col_add_fstr = pat->p_col_add_fstr;
p_col_append_fstr = pat->p_col_append_fstr;
p_col_add_str = pat->p_col_add_str;
p_col_append_str = pat->p_col_append_str;
p_dfilter_init = pat->p_dfilter_init;
p_dfilter_cleanup = pat->p_dfilter_cleanup;
p_proto_register_protocol = pat->p_proto_register_protocol;
p_proto_register_field_array = pat->p_proto_register_field_array;
p_proto_register_subtree_array = pat->p_proto_register_subtree_array;
p_dissector_add = pat->p_dissector_add;
p_old_dissector_add = pat->p_old_dissector_add;
p_dissector_delete = pat->p_dissector_delete;
p_heur_dissector_add = pat->p_heur_dissector_add;
Add a mechanism by which a dissector can be registered by name, another dissector can get a "handle" for that dissector by name and then call that dissector through the handle. This allows dissectors that can't be called through a port table or a heuristic table to be called from other dissectors without directly referring to the dissector function - dynamically-loaded modules, under Windows, cannot directly call functions in the main program, and non-plugin dissectors are in the main program and thus cannot be called from plugin dissectors unless either 1) a pointer to the dissector is put in the Big Transfer Vector or 2) some other mechanism for getting a pointer to the dissector is provided. This mechanism could also support registering old-style dissectors and calling them from new-style dissectors without the new-style dissector having to do the argument translation itself (I didn't add support for registering old-style dissectors because I'd prefer to have people tvbuffify their code if they have to register a dissector...). It could also, in the future, perhaps support disabling of protocols; setting "pinfo->current_proto"; inside "call_dissector()" - and inside "{old_}dissector_try_port()" and "{old_"dissector_try_heuristic()" - allowing a pile of stuff that currently has to be done in every dissector be done by common code. (I have some ideas about how to do this, by having "proto_register_protocol()" take an abbreviation - of the sort that would be put in, for example, "pinfo->current_proto" - as an argument; having the calls to register dissectors take an index returned by "proto_register_protocol()" as an argument. The abbreviation could be used elsewhere as well, e.g. in the "Decoding" tab of the "Edit->Protocols" dialog box, and in a GUI for constructing protocol filters. Watch this space.) Make "dissect_sdp()" the first client of this mechanism; it's now static to "packet-sdp.c", and all dissectors that call it - including the MGCP plugin - now call it through a dissector handle fetched by "find_dissector()". (Next step - see if Ethereal can now compile on Windows as a result of this.) svn path=/trunk/; revision=2647
2000-11-15 07:07:52 +00:00
p_register_dissector = pat->p_register_dissector;
p_find_dissector = pat->p_find_dissector;
p_old_call_dissector = pat->p_old_call_dissector;
p_call_dissector = pat->p_call_dissector;
p_dissect_data = pat->p_dissect_data;
p_old_dissect_data = pat->p_old_dissect_data;
p_proto_is_protocol_enabled = pat->p_proto_is_protocol_enabled;
p_proto_item_get_len = pat->p_proto_item_get_len;
p_proto_item_set_len = pat->p_proto_item_set_len;
p_proto_item_set_text = pat->p_proto_item_set_text;
p_proto_item_add_subtree = pat->p_proto_item_add_subtree;
p_proto_tree_add_item = pat->p_proto_tree_add_item;
p_proto_tree_add_item_hidden = pat->p_proto_tree_add_item_hidden;
p_proto_tree_add_protocol_format = pat->p_proto_tree_add_protocol_format;
p_proto_tree_add_bytes = pat->p_proto_tree_add_bytes;
p_proto_tree_add_bytes_hidden = pat->p_proto_tree_add_bytes_hidden;
p_proto_tree_add_bytes_format = pat->p_proto_tree_add_bytes_format;
p_proto_tree_add_time = pat->p_proto_tree_add_time;
p_proto_tree_add_time_hidden = pat->p_proto_tree_add_time_hidden;
p_proto_tree_add_time_format = pat->p_proto_tree_add_time_format;
p_proto_tree_add_ipxnet = pat->p_proto_tree_add_ipxnet;
p_proto_tree_add_ipxnet_hidden = pat->p_proto_tree_add_ipxnet_hidden;
p_proto_tree_add_ipxnet_format = pat->p_proto_tree_add_ipxnet_format;
p_proto_tree_add_ipv4 = pat->p_proto_tree_add_ipv4;
p_proto_tree_add_ipv4_hidden = pat->p_proto_tree_add_ipv4_hidden;
p_proto_tree_add_ipv4_format = pat->p_proto_tree_add_ipv4_format;
p_proto_tree_add_ipv6 = pat->p_proto_tree_add_ipv6;
p_proto_tree_add_ipv6_hidden = pat->p_proto_tree_add_ipv6_hidden;
p_proto_tree_add_ipv6_format = pat->p_proto_tree_add_ipv6_format;
p_proto_tree_add_ether = pat->p_proto_tree_add_ether;
p_proto_tree_add_ether_hidden = pat->p_proto_tree_add_ether_hidden;
p_proto_tree_add_ether_format = pat->p_proto_tree_add_ether_format;
p_proto_tree_add_string = pat->p_proto_tree_add_string;
p_proto_tree_add_string_hidden = pat->p_proto_tree_add_string_hidden;
p_proto_tree_add_string_format = pat->p_proto_tree_add_string_format;
p_proto_tree_add_boolean = pat->p_proto_tree_add_boolean;
p_proto_tree_add_boolean_hidden = pat->p_proto_tree_add_boolean_hidden;
p_proto_tree_add_boolean_format = pat->p_proto_tree_add_boolean_format;
p_proto_tree_add_double = pat->p_proto_tree_add_double;
p_proto_tree_add_double_hidden = pat->p_proto_tree_add_double_hidden;
p_proto_tree_add_double_format = pat->p_proto_tree_add_double_format;
p_proto_tree_add_uint = pat->p_proto_tree_add_uint;
p_proto_tree_add_uint_hidden = pat->p_proto_tree_add_uint_hidden;
p_proto_tree_add_uint_format = pat->p_proto_tree_add_uint_format;
p_proto_tree_add_int = pat->p_proto_tree_add_int;
p_proto_tree_add_int_hidden = pat->p_proto_tree_add_int_hidden;
p_proto_tree_add_int_format = pat->p_proto_tree_add_int_format;
p_proto_tree_add_text = pat->p_proto_tree_add_text;
p_proto_tree_add_notext = pat->p_proto_tree_add_notext;
p_tvb_new_subset = pat->p_tvb_new_subset;
p_tvb_length = pat->p_tvb_length;
p_tvb_length_remaining = pat->p_tvb_length_remaining;
p_tvb_bytes_exist = pat->p_tvb_bytes_exist;
p_tvb_offset_exists = pat->p_tvb_offset_exists;
p_tvb_reported_length = pat->p_tvb_reported_length;
p_tvb_get_guint8 = pat->p_tvb_get_guint8;
p_tvb_get_ntohs = pat->p_tvb_get_ntohs;
p_tvb_get_ntoh24 = pat->p_tvb_get_ntoh24;
p_tvb_get_ntohl = pat->p_tvb_get_ntohl;
#ifdef G_HAVE_GINT64
p_tvb_get_ntohll = pat->p_tvb_get_ntohll;
#endif
p_tvb_get_letohs = pat->p_tvb_get_letohs;
p_tvb_get_letoh24 = pat->p_tvb_get_letoh24;
p_tvb_get_letohl = pat->p_tvb_get_letohl;
#ifdef G_HAVE_GINT64
p_tvb_get_letohll = pat->p_tvb_get_letohll;
#endif
p_tvb_memcpy = pat->p_tvb_memcpy;
p_tvb_memdup = pat->p_tvb_memdup;
p_tvb_get_ptr = pat->p_tvb_get_ptr;
p_tvb_find_guint8 = pat->p_tvb_find_guint8;
p_tvb_pbrk_guint8 = pat->p_tvb_pbrk_guint8;
p_tvb_strnlen = pat->p_tvb_strnlen;
p_tvb_format_text = pat->p_tvb_format_text;
p_tvb_get_nstringz = pat->p_tvb_get_nstringz;
p_tvb_get_nstringz0 = pat->p_tvb_get_nstringz0;
p_tvb_find_line_end = pat->p_tvb_find_line_end;
p_tvb_find_line_end_unquoted = pat->p_tvb_find_line_end_unquoted;
p_tvb_strneql = pat->p_tvb_strneql;
p_tvb_strncaseeql = pat->p_tvb_strncaseeql;
p_tvb_bytes_to_str = pat->p_tvb_bytes_to_str;
p_prefs_register_module = pat->p_prefs_register_module;
p_prefs_register_uint_preference = pat->p_prefs_register_uint_preference;
p_prefs_register_bool_preference = pat->p_prefs_register_bool_preference;
p_prefs_register_enum_preference = pat->p_prefs_register_enum_preference;
}