From 11f06217ced22efb25ff4157216622ea24da7cab Mon Sep 17 00:00:00 2001 From: Luis Ontanon Date: Fri, 25 May 2007 17:22:32 +0000 Subject: [PATCH] Have editcap and capinfos loading the wiretap plugins. epan/filesystem.c have get_plugin_dir() calling init_plugin_dir() if necessary epan/epan.c and epan/report_err.c move the report_failure family into the new report_err.c file, have epan_init() calling the initializer epan/plugins.h and epan/proto.c do not have init_plugins() calling the proto_reg functions instead do it in init_proto() gtk/main.c and tshark.c init_plugin_dir() has become suprefluous capinfos.c and editcap.c load the wiretap plugins Makefiles do what's needed to build withe the above changes. svn path=/trunk/; revision=21935 --- Makefile.common | 13 ++++++- Makefile.nmake | 15 +++++---- capinfos.c | 30 ++++++++++++++++- editcap.c | 28 ++++++++++++++-- epan/Makefile.common | 1 + epan/epan.c | 44 +----------------------- epan/filesystem.c | 3 +- epan/plugins.c | 30 ++++++++++++----- epan/plugins.h | 1 + epan/proto.c | 1 + epan/report_err.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ epan/report_err.h | 8 +++++ gtk/main.c | 5 --- tshark.c | 5 --- 14 files changed, 191 insertions(+), 73 deletions(-) create mode 100644 epan/report_err.c diff --git a/Makefile.common b/Makefile.common index 5090d80538..5358531d08 100644 --- a/Makefile.common +++ b/Makefile.common @@ -207,7 +207,18 @@ mergecap_SOURCES = \ # editcap specifics editcap_SOURCES = \ editcap.c \ - epan/crypt/crypt-md5.c + epan/crypt/crypt-md5.c \ + epan/plugins.c \ + epan/report_err.c \ + epan/privileges.c \ + epan/filesystem.c + +capinfos_SOURCES = \ + capinfos.c \ + epan/plugins.c \ + epan/report_err.c \ + epan/privileges.c \ + epan/filesystem.c # dftest specifics dftest_SOURCES = \ diff --git a/Makefile.nmake b/Makefile.nmake index 74be16308e..4d27e46ad7 100644 --- a/Makefile.nmake +++ b/Makefile.nmake @@ -75,11 +75,11 @@ tshark_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \ !ENDIF capinfos_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \ - wsock32.lib user32.lib \ + wsock32.lib user32.lib shell32.lib \ $(GLIB_LIBS) editcap_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \ - wsock32.lib user32.lib \ + wsock32.lib user32.lib shell32.lib \ $(GLIB_LIBS) mergecap_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \ @@ -214,19 +214,19 @@ tshark.exe : config.h svnversion.h $(tshark_OBJECTS) getopt.obj epan image\tshar mt.exe -nologo -manifest "tshark.exe.manifest" -outputresource:tshark.exe;1 !ENDIF -capinfos.exe : config.h capinfos.obj getopt.obj wiretap\wiretap-$(WTAP_VERSION).lib image\capinfos.res +capinfos.exe : config.h capinfos.obj getopt.obj epan/unicode-utils.obj epan/plugins.obj epan/report_err.obj epan/privileges.obj epan/filesystem.obj wiretap\wiretap-$(WTAP_VERSION).lib image\capinfos.res @echo Linking $@ $(LINK) @<< - /OUT:capinfos.exe $(conflags) $(conlibsdll) $(LDFLAGS) /SUBSYSTEM:console capinfos.obj getopt.obj $(capinfos_LIBS) image\capinfos.res + /OUT:capinfos.exe $(conflags) $(conlibsdll) $(LDFLAGS) /SUBSYSTEM:console capinfos.obj getopt.obj epan/unicode-utils.obj epan/plugins.obj epan/report_err.obj epan/privileges.obj epan/filesystem.obj $(capinfos_LIBS) image\capinfos.res << !IF "$(MSVC_VARIANT)" == "MSVC2005" || "$(MSVC_VARIANT)" == "MSVC2005EE" || "$(MSVC_VARIANT)" == "DOTNET20" mt.exe -nologo -manifest "capinfos.exe.manifest" -outputresource:capinfos.exe;1 !ENDIF -editcap.exe : config.h editcap.obj getopt.obj strptime.obj epan\crypt\crypt-md5.obj wiretap\wiretap-$(WTAP_VERSION).lib image\editcap.res +editcap.exe : config.h editcap.obj getopt.obj strptime.obj epan\crypt\crypt-md5.obj epan/unicode-utils.obj epan/plugins.obj epan/report_err.obj epan/privileges.obj epan/filesystem.obj wiretap\wiretap-$(WTAP_VERSION).lib image\editcap.res @echo Linking $@ $(LINK) @<< - /OUT:editcap.exe $(conflags) $(conlibsdll) $(LDFLAGS) /SUBSYSTEM:console editcap.obj getopt.obj strptime.obj epan\crypt\crypt-md5.obj $(editcap_LIBS) image\editcap.res + /OUT:editcap.exe $(conflags) $(conlibsdll) $(LDFLAGS) /SUBSYSTEM:console editcap.obj getopt.obj strptime.obj epan/unicode-utils.obj epan\crypt\crypt-md5.obj epan/plugins.obj epan/report_err.obj epan/privileges.obj epan/filesystem.obj $(editcap_LIBS) image\editcap.res << !IF "$(MSVC_VARIANT)" == "MSVC2005" || "$(MSVC_VARIANT)" == "MSVC2005EE" || "$(MSVC_VARIANT)" == "DOTNET20" mt.exe -nologo -manifest "editcap.exe.manifest" -outputresource:editcap.exe;1 @@ -870,6 +870,8 @@ install-common-files: xcopy ".\cfilters" $(INSTALL_DIR) /d xcopy ".\colorfilters" $(INSTALL_DIR) /d xcopy ".\dfilters" $(INSTALL_DIR) /d + xcopy ".\epan\wslua\init.lua" $(INSTALL_DIR) /d + xcopy ".\epan\wslua\console.lua" $(INSTALL_DIR) /d xcopy doc\*.html $(INSTALL_DIR) /d !IFDEF ETHEREAL_EUG_DIR xcopy $(ETHEREAL_EUG_DIR) $(INSTALL_DIR) /d @@ -1026,3 +1028,4 @@ clean-deps2: clean-deps: clean-deps1 clean-deps2 + diff --git a/capinfos.c b/capinfos.c index 1b6ff6a6bb..bda6ea6faa 100644 --- a/capinfos.c +++ b/capinfos.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #ifdef HAVE_UNISTD_H @@ -44,6 +45,9 @@ #include #include +#include +#include +#include #include "wtap.h" #ifdef NEED_GETOPT_H @@ -247,6 +251,18 @@ static void usage(gboolean is_error) fprintf(output, "If no options are given, default is to display all infos\n"); } +/* + * Errors are reported with a console message. + */ +static void +failure_message(const char *msg_format, va_list ap) +{ + fprintf(stderr, "capinos: "); + vfprintf(stderr, msg_format, ap); + fprintf(stderr, "\n"); +} + + int main(int argc, char *argv[]) { wtap *wth; @@ -256,8 +272,20 @@ int main(int argc, char *argv[]) extern int optind; int opt; int status = 0; + char* init_progfile_dir_error; + + /* Register wiretap plugins */ - /* Process the options first */ + if ((init_progfile_dir_error = init_progfile_dir(argv[0]))) { + g_warning("capinfos: init_progfile_dir(): %s", init_progfile_dir_error); + g_free(init_progfile_dir_error); + } else { + init_report_err(failure_message,NULL,NULL); + init_plugins(); + register_all_wiretap_modules(); + } + + /* Process the options */ while ((opt = getopt(argc, argv, "tcsduaeyizvh")) !=-1) { diff --git a/editcap.c b/editcap.c index 2a11bf7a10..4a033d351a 100644 --- a/editcap.c +++ b/editcap.c @@ -15,6 +15,7 @@ #include #include #include +#include /* * Just make sure we include the prototype for strptime as well @@ -54,6 +55,9 @@ #endif #include "epan/crypt/crypt-md5.h" +#include "epan/plugins.h" +#include "epan/report_err.h" +#include "epan/filesystem.h" #include "svnversion.h" @@ -346,6 +350,14 @@ static void list_encap_types(void) { } } +static void +failure_message(const char *msg_format, va_list ap) +{ + fprintf(stderr, "editcap: "); + vfprintf(stderr, msg_format, ap); + fprintf(stderr, "\n"); +} + int main(int argc, char *argv[]) { @@ -368,9 +380,19 @@ int main(int argc, char *argv[]) int split_packet_count = 0; int written_count = 0; char *filename; - - /* Process the options first */ - + char* init_progfile_dir_error; + + /* Register wiretap plugins */ + if ((init_progfile_dir_error = init_progfile_dir(argv[0]))) { + g_warning("capinfos: init_progfile_dir(): %s", init_progfile_dir_error); + g_free(init_progfile_dir_error); + } else { + init_report_err(failure_message,NULL,NULL); + init_plugins(); + register_all_wiretap_modules(); + } + + /* Process the options */ while ((opt = getopt(argc, argv, "A:B:c:C:dE:F:hrs:t:T:v")) !=-1) { switch (opt) { diff --git a/epan/Makefile.common b/epan/Makefile.common index 9d226bbd4a..1cd132dd4a 100644 --- a/epan/Makefile.common +++ b/epan/Makefile.common @@ -68,6 +68,7 @@ LIBWIRESHARK_SRC = \ range.c \ reassemble.c \ reedsolomon.c \ + report_err.c \ req_resp_hdrs.c \ sigcomp_state_hdlr.c \ sigcomp-udvm.c \ diff --git a/epan/epan.c b/epan/epan.c index 765859036b..e6c8b5d414 100644 --- a/epan/epan.c +++ b/epan/epan.c @@ -58,10 +58,6 @@ int wslua_init(void*); #endif -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); - gchar* epan_get_version(void) { return VERSION; @@ -76,9 +72,7 @@ epan_init(void (*register_all_protocols)(register_cb cb, gpointer client_data), 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; + init_report_err(report_failure, report_open_failure, report_read_failure); /* initialize memory allocation subsystem */ ep_init_chunk(); @@ -136,42 +130,6 @@ epan_circuit_init(void) circuit_init(); } -/* - * 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) -{ - (*report_open_failure_func)(filename, err, for_writing); -} - -/* - * 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) -{ - (*report_read_failure_func)(filename, err); -} - epan_dissect_t* epan_dissect_new(gboolean create_proto_tree, gboolean proto_tree_visible) { diff --git a/epan/filesystem.c b/epan/filesystem.c index f0ce082653..cd9bb0396b 100644 --- a/epan/filesystem.c +++ b/epan/filesystem.c @@ -636,7 +636,7 @@ get_datafile_dir(void) * of the plugin directory, so it can just fetch the plugins built * as part of the build process. */ -static const char *plugin_dir; +static const char *plugin_dir = NULL; void init_plugin_dir(void) @@ -694,6 +694,7 @@ init_plugin_dir(void) const char * get_plugin_dir(void) { + if (!plugin_dir) init_plugin_dir(); return plugin_dir; } diff --git a/epan/plugins.c b/epan/plugins.c index 4841751311..8425945ad9 100644 --- a/epan/plugins.c +++ b/epan/plugins.c @@ -173,6 +173,7 @@ plugins_scan_dir(const char *dirname) if ((dir = eth_dir_open(dirname, 0, NULL)) != NULL) { + while ((file = eth_dir_read_name(dir)) != NULL) { name = eth_dir_get_name(file); @@ -344,14 +345,6 @@ plugins_scan_dir(const char *dirname) continue; } - /* - * Call its register routine if it has one. - * XXX - just save this and call it with the built-in - * dissector register routines? - */ - if (register_protoinfo != NULL) - register_protoinfo(); - } eth_dir_close(dir); } @@ -440,6 +433,27 @@ init_plugins(void) } } +void +register_all_plugin_registrations(void) +{ + plugin *pt_plug; + + /* + * For all plugins with register-handoff routines, call the routines. + * This is called from "proto_init()"; it must be called after + * "register_all_protocols()" and "init_plugins()" are called, + * in case one plugin registers itself either with a built-in + * dissector or with another plugin; we must first register all + * dissectors, whether built-in or plugin, so their dissector tables + * are initialized, and only then register all handoffs. + */ + for (pt_plug = plugin_list; pt_plug != NULL; pt_plug = pt_plug->next) + { + if (pt_plug->register_protoinfo) + (pt_plug->register_protoinfo)(); + } +} + void register_all_plugin_handoffs(void) { diff --git a/epan/plugins.h b/epan/plugins.h index b554a6013f..c6a43ab2c9 100644 --- a/epan/plugins.h +++ b/epan/plugins.h @@ -44,6 +44,7 @@ typedef struct _plugin { WS_VAR_IMPORT plugin *plugin_list; extern void init_plugins(void); +extern void register_all_plugin_registrations(void); extern void register_all_plugin_handoffs(void); extern void register_all_plugin_tap_listeners(void); extern void register_all_wiretap_modules(void); diff --git a/epan/proto.c b/epan/proto.c index c156b12263..5c5ee49fd3 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -354,6 +354,7 @@ proto_init(void (register_all_protocols)(register_cb cb, gpointer client_data), if(cb) (*cb)(RA_PLUGIN_REGISTER, NULL, client_data); init_plugins(); + register_all_plugin_registrations(); #endif /* Now call the "handoff registration" routines of all built-in diff --git a/epan/report_err.c b/epan/report_err.c new file mode 100644 index 0000000000..bab1aa64b6 --- /dev/null +++ b/epan/report_err.c @@ -0,0 +1,80 @@ +/* report_err.h +* Declarations of routines for dissectors to use to report errors to +* the user (e.g., problems with preference settings) +* +* $Id$ +* +* Wireshark - Network traffic analyzer +* By Gerald Combs +* 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. +*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "report_err.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); + +void init_report_err(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; +} + +/* + * 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) +{ + (*report_open_failure_func)(filename, err, for_writing); +} + +/* + * 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) +{ + (*report_read_failure_func)(filename, err); +} + diff --git a/epan/report_err.h b/epan/report_err.h index c9686413c8..159cd96cee 100644 --- a/epan/report_err.h +++ b/epan/report_err.h @@ -30,6 +30,14 @@ extern "C" { #endif /* __cplusplus */ +/* + * Initialize the report err routines + */ +extern void init_report_err( + void (*report_failure)(const char *, va_list), + void (*report_open_failure)(const char *, int, gboolean), + void (*report_read_failure)(const char *, int)); + /* * Report an error when trying to open a file. */ diff --git a/gtk/main.c b/gtk/main.c index a2adf38e74..a6f33d04c3 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -2159,11 +2159,6 @@ main(int argc, char *argv[]) */ init_progfile_dir_error = init_progfile_dir(argv[0]); - /* - * Now attempt to get the pathname of the plugins. - */ - init_plugin_dir(); - /* initialize the funnel mini-api */ initialize_funnel_ops(); diff --git a/tshark.c b/tshark.c index 6d9d48ad2c..b30ce80bd5 100644 --- a/tshark.c +++ b/tshark.c @@ -734,11 +734,6 @@ main(int argc, char *argv[]) init_progfile_dir_error); } - /* - * Now attempt to get the pathname of the plugins. - */ - init_plugin_dir(); - /* * In order to have the -X opts assigned before the wslua machine starts * we need to call getopts before epan_init() gets called.