X-Git-Url: http://git.samba.org/samba.git/?p=obnox%2Fwireshark%2Fwip.git;a=blobdiff_plain;f=epan%2Fepan.c;h=236ea20b925356e9e376de3440409e120a2a0277;hp=dd0b1b0104a902a961b652b33da8174bf1283e26;hb=70867327f68440104aafa9e167ef9ce01f04069d;hpb=33270db64f47281ca4f16e5515b8cd64cf7d86df diff --git a/epan/epan.c b/epan/epan.c index dd0b1b0104..236ea20b92 100644 --- a/epan/epan.c +++ b/epan/epan.c @@ -1,14 +1,39 @@ -/* epan.h +/* epan.c * * $Id$ * * Wireshark Protocol Analyzer Library + * + * Copyright (c) 2001 by 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif +#ifdef HAVE_LIBGCRYPT +#include +#endif /* HAVE_LIBGCRYPT */ + +#ifdef HAVE_LIBGNUTLS +#include +#endif /* HAVE_LIBGNUTLS */ + + #include #include "epan.h" #include "epan_dissect.h" @@ -18,69 +43,93 @@ #include "circuit.h" #include "except.h" #include "packet.h" +#include "prefs.h" #include "column-utils.h" #include "tap.h" #include "addr_resolv.h" -#include "oid_resolv.h" +#include "oids.h" #include "emem.h" #include "expert.h" -static void (*report_failure_func)(const char *, va_list); -static void (*report_open_failure_func)(const char *, int, gboolean); -static void (*report_read_failure_func)(const char *, int); +#ifdef HAVE_LUA_5_1 +#include +#include +#endif + +#ifdef HAVE_LIBSMI +#include +#endif + +#ifdef HAVE_C_ARES +#include +#endif + +#ifdef HAVE_GEOIP +#include "geoip_db.h" +#endif + +gchar* +epan_get_version(void) { + return VERSION; +} -/* - * XXX - this takes the plugin directory as an argument, because - * libethereal now has its own configure script and "config.h" file, - * which is what code in the "epan" directory includes, but we need - * to define PLUGIN_DIR in the top-level directory, as it's used by, - * for example, the Makefile for the Gryphon plugin, so it knows - * where to install the plugin. - * - * Eventually, we should probably have an "epan-configure" script - * (or "libethereal-configure", or whatever), along the lines of what - * GTK+ and GLib have, that can print, among other things, the directory - * into which plugins should be installed. That way, only libethereal - * need know what directory that is; programs using it won't, *and* - * Makefiles for plugins can just use "epan-configure" to figure out - * where to install the plugins. - * - * (Would that *more* libraries had configure scripts like that, so - * that configure scripts didn't have to go through various contortions - * to figure out where the header files and libraries for various - * libraries are located.) - */ void -epan_init(const char *plugin_dir, void (*register_all_protocols)(void), - void (*register_all_handoffs)(void), - void (*report_failure)(const char *, va_list), - void (*report_open_failure)(const char *, int, gboolean), - void (*report_read_failure)(const char *, int)) -{ - report_failure_func = report_failure; - report_open_failure_func = report_open_failure; - report_read_failure_func = report_read_failure; +epan_init(void (*register_all_protocols_func)(register_cb cb, gpointer client_data), + void (*register_all_handoffs_func)(register_cb cb, gpointer client_data), + register_cb cb, + gpointer client_data, + void (*report_failure_fcn_p)(const char *, va_list), + void (*report_open_failure_fcn_p)(const char *, int, gboolean), + void (*report_read_failure_fcn_p)(const char *, int), + void (*report_write_failure_fcn_p)(const char *, int)) +{ + init_report_err(report_failure_fcn_p, report_open_failure_fcn_p, + report_read_failure_fcn_p, report_write_failure_fcn_p); + + /* initialize memory allocation subsystem */ + emem_init(); + + /* initialize the GUID to name mapping table */ + guids_init(); + except_init(); +#ifdef HAVE_LIBGNUTLS + gnutls_global_init(); +#elif defined(HAVE_LIBGCRYPT) + gcry_check_version(NULL); +#endif tvbuff_init(); - oid_resolv_init(); tap_init(); - proto_init(plugin_dir,register_all_protocols,register_all_handoffs); + prefs_init(); + proto_init(register_all_protocols_func, register_all_handoffs_func, + cb, client_data); packet_init(); dfilter_init(); final_registration_all_protocols(); host_name_lookup_init(); expert_init(); +#ifdef HAVE_LUA_5_1 + wslua_init(NULL); +#endif +#ifdef HAVE_GEOIP + geoip_db_init(); +#endif + } void epan_cleanup(void) { - expert_cleanup(); + cleanup_dissection(); dfilter_cleanup(); proto_cleanup(); + prefs_cleanup(); packet_cleanup(); oid_resolv_cleanup(); tvbuff_cleanup(); +#ifdef HAVE_LIBGNUTLS + gnutls_global_deinit(); +#endif except_deinit(); host_name_lookup_cleanup(); } @@ -92,53 +141,27 @@ epan_conversation_init(void) } void -epan_circuit_init(void) +epan_conversation_cleanup(void) { - circuit_init(); + conversation_cleanup(); } -/* - * Report a general error. - */ void -report_failure(const char *msg_format, ...) -{ - va_list ap; - - va_start(ap, msg_format); - (*report_failure_func)(msg_format, ap); - va_end(ap); -} - -/* - * Report an error when trying to open or create a file. - * "err" is assumed to be an error code from Wiretap; positive values are - * UNIX-style errnos, so this can be used for open failures not from - * Wiretap as long as the failue code is just an errno. - */ -void -report_open_failure(const char *filename, int err, - gboolean for_writing) +epan_circuit_init(void) { - (*report_open_failure_func)(filename, err, for_writing); + circuit_init(); } -/* - * Report an error when trying to read a file. - * "err" is assumed to be a UNIX-style errno. - */ void -report_read_failure(const char *filename, int err) +epan_circuit_cleanup(void) { - (*report_read_failure_func)(filename, err); + circuit_cleanup(); } epan_dissect_t* -epan_dissect_new(gboolean create_proto_tree, gboolean proto_tree_visible) +epan_dissect_init(epan_dissect_t *edt, const gboolean create_proto_tree, const gboolean proto_tree_visible) { - epan_dissect_t *edt; - - edt = g_new(epan_dissect_t, 1); + g_assert(edt); if (create_proto_tree) { edt->tree = proto_tree_create_root(); @@ -151,6 +174,23 @@ epan_dissect_new(gboolean create_proto_tree, gboolean proto_tree_visible) return edt; } +epan_dissect_t* +epan_dissect_new(const gboolean create_proto_tree, const gboolean proto_tree_visible) +{ + epan_dissect_t *edt; + + edt = g_new0(epan_dissect_t, 1); + + return epan_dissect_init(edt, create_proto_tree, proto_tree_visible); +} + +void +epan_dissect_fake_protocols(epan_dissect_t *edt, const gboolean fake_protocols) +{ + if (edt) + proto_tree_set_fake_protocols(edt->tree, fake_protocols); +} + void epan_dissect_run(epan_dissect_t *edt, void* pseudo_header, const guint8* data, frame_data *fd, column_info *cinfo) @@ -161,10 +201,11 @@ epan_dissect_run(epan_dissect_t *edt, void* pseudo_header, dissect_packet(edt, pseudo_header, data, fd, cinfo); } - void -epan_dissect_free(epan_dissect_t* edt) +epan_dissect_cleanup(epan_dissect_t* edt) { + g_assert(edt); + /* Free the data sources list. */ free_data_sources(&edt->pi); @@ -176,18 +217,161 @@ epan_dissect_free(epan_dissect_t* edt) if (edt->tree) { proto_tree_free(edt->tree); } +} +void +epan_dissect_free(epan_dissect_t* edt) +{ + epan_dissect_cleanup(edt); g_free(edt); } void epan_dissect_prime_dfilter(epan_dissect_t *edt, const dfilter_t* dfcode) { - dfilter_prime_proto_tree(dfcode, edt->tree); + dfilter_prime_proto_tree(dfcode, edt->tree); +} + +/* ----------------------- */ +const gchar * +epan_custom_set(epan_dissect_t *edt, int field_id, + gint occurrence, + gchar *result, + gchar *expr, const int size ) +{ + return proto_custom_set(edt->tree, field_id, occurrence, result, expr, size); +} + +void +epan_dissect_fill_in_columns(epan_dissect_t *edt, const gboolean fill_col_exprs, const gboolean fill_fd_colums) +{ + col_custom_set_edt(edt, edt->pi.cinfo); + col_fill_in(&edt->pi, fill_col_exprs, fill_fd_colums); } +/* + * Get compile-time information for libraries used by libwireshark. + */ void -epan_dissect_fill_in_columns(epan_dissect_t *edt) +epan_get_compiled_version_info(GString *str) { - col_fill_in(&edt->pi); + /* PCRE */ + g_string_append(str, ", "); +#ifdef HAVE_LIBPCRE + g_string_append(str, "with libpcre "); +#ifdef PCRE_MAJOR +#ifdef PCRE_MINOR + g_string_append_printf(str, "%u.%u", PCRE_MAJOR, PCRE_MINOR); +#else /* PCRE_MINOR */ + g_string_append_printf(str, "%u", PCRE_MAJOR); +#endif /* PCRE_MINOR */ +#else /* PCRE_MAJOR */ + g_string_append(str, "(version unknown)"); +#endif /* PCRE_MAJOR */ +#else /* HAVE_LIBPCRE */ + g_string_append(str, "without libpcre"); +#endif /* HAVE_LIBPCRE */ + + /* SNMP */ + g_string_append(str, ", "); +#ifdef HAVE_LIBSMI + g_string_append(str, "with SMI " SMI_VERSION_STRING); +#else /* no SNMP library */ + g_string_append(str, "without SMI"); +#endif /* _SMI_H */ + + /* c-ares */ + g_string_append(str, ", "); +#ifdef HAVE_C_ARES + g_string_append(str, "with c-ares " ARES_VERSION_STR); +#else + g_string_append(str, "without c-ares"); + + /* ADNS - only add if no c-ares */ + g_string_append(str, ", "); +#ifdef HAVE_GNU_ADNS + g_string_append(str, "with ADNS"); +#else + g_string_append(str, "without ADNS"); +#endif /* HAVE_GNU_ADNS */ +#endif /* HAVE_C_ARES */ + + /* LUA */ + g_string_append(str, ", "); +#ifdef HAVE_LUA_5_1 + g_string_append(str, "with "); + g_string_append(str, LUA_VERSION); +#else + g_string_append(str, "without Lua"); +#endif /* HAVE_LUA_5_1 */ + + g_string_append(str, ", "); +#ifdef HAVE_PYTHON + g_string_append(str, "with Python"); +#ifdef PY_VERSION + g_string_append(str, " " PY_VERSION); +#endif /* PY_VERSION */ +#else + g_string_append(str, "without Python"); +#endif /* HAVE_PYTHON */ + + /* GnuTLS */ + g_string_append(str, ", "); +#ifdef HAVE_LIBGNUTLS + g_string_append(str, "with GnuTLS " LIBGNUTLS_VERSION); +#else + g_string_append(str, "without GnuTLS"); +#endif /* HAVE_LIBGNUTLS */ + + /* Gcrypt */ + g_string_append(str, ", "); +#ifdef HAVE_LIBGCRYPT + g_string_append(str, "with Gcrypt " GCRYPT_VERSION); +#else + g_string_append(str, "without Gcrypt"); +#endif /* HAVE_LIBGCRYPT */ + + /* Kerberos */ + /* XXX - I don't see how to get the version number, at least for KfW */ + g_string_append(str, ", "); +#ifdef HAVE_KERBEROS +#ifdef HAVE_MIT_KERBEROS + g_string_append(str, "with MIT Kerberos"); +#else + /* HAVE_HEIMDAL_KERBEROS */ + g_string_append(str, "with Heimdal Kerberos"); +#endif +#else + g_string_append(str, "without Kerberos"); +#endif /* HAVE_KERBEROS */ + + /* GeoIP */ + g_string_append(str, ", "); +#ifdef HAVE_GEOIP + g_string_append(str, "with GeoIP"); +#else + g_string_append(str, "without GeoIP"); +#endif /* HAVE_GEOIP */ + +} + +/* + * Get runtime information for libraries used by libwireshark. + */ +void +epan_get_runtime_version_info(GString *str +#if !defined(HAVE_LIBGNUTLS) && !defined(HAVE_LIBGCRYPT) +_U_ +#endif +) +{ + /* GnuTLS */ +#ifdef HAVE_LIBGNUTLS + g_string_append_printf(str, ", GnuTLS %s", gnutls_check_version(NULL)); +#endif /* HAVE_LIBGNUTLS */ + + /* Gcrypt */ +#ifdef HAVE_LIBGCRYPT + g_string_append_printf(str, ", Gcrypt %s", gcry_check_version(NULL)); +#endif /* HAVE_LIBGCRYPT */ }