diff options
author | Gilbert Ramirez <gram@alumni.rice.edu> | 2000-01-15 00:23:13 +0000 |
---|---|---|
committer | Gilbert Ramirez <gram@alumni.rice.edu> | 2000-01-15 00:23:13 +0000 |
commit | 339d67b043a1f1ac860b84ed48ec6ba77d96f487 (patch) | |
tree | 0ab0f799055b6e6bb48ddc02d21fa608874b4ee4 /plugins.c | |
parent | dbf3bf6177946f2e21efdb7a64ec32c8ee02eb74 (diff) |
Merge in the final code to make Ethereal run on Win32, compiled
with MSVC 6.0 and 'nmake', the make tool that comes with MSVC.
It compiles, links, and runs. It doesn't run correctly. There's a problem
when reading files. I'm getting short reads. I'm not linking in zlib or
libsnmp because it first needs to be debugged.
I changed the plugin code to use gmodule instead of libltdl, but the
Unix build still links ethereal against libltdl. I'll fix that tonight; sorry
about leaving it in such a sad state, but I wanted to check in this code
before I left work on a Friday night. Ethereal still works, but the
building is less than optimal.
svn path=/trunk/; revision=1479
Diffstat (limited to 'plugins.c')
-rw-r--r-- | plugins.c | 63 |
1 files changed, 42 insertions, 21 deletions
@@ -1,7 +1,7 @@ /* plugins.c * plugin routines * - * $Id: plugins.c,v 1.4 2000/01/04 21:29:43 oabad Exp $ + * $Id: plugins.c,v 1.5 2000/01/15 00:22:34 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -27,19 +27,35 @@ # include "config.h" #endif -#ifdef HAVE_DLFCN_H +#include "plugins.h" + +#ifdef HAVE_PLUGINS #include <time.h> + +#ifdef HAVE_DIRENT_H #include <dirent.h> +#endif + +#ifdef HAVE_DIRECT_H +#include <direct.h> +#endif + #include <string.h> +#include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> + +#ifdef HAVE_FCNTL_H #include <fcntl.h> +#endif + +#ifdef HAVE_UNISTD_H #include <unistd.h> +#endif #include "globals.h" -#include "plugins.h" /* linked list of all plugins */ plugin *plugin_list; @@ -240,7 +256,11 @@ save_plugin_status() if (!statusfile) { pf_path = g_malloc(strlen(getenv("HOME")) + strlen(PF_DIR) + 2); sprintf(pf_path, "%s/%s", getenv("HOME"), PF_DIR); + #ifdef WIN32 + mkdir(pf_path); + #else mkdir(pf_path, 0755); + #endif g_free(pf_path); statusfile=fopen(plugin_status_file, "w"); if (!statusfile) return -1; @@ -262,7 +282,7 @@ save_plugin_status() * If necessary, enable the plugin, and change the filter. */ static void -check_plugin_status(gchar *name, gchar *version, lt_dlhandle handle, +check_plugin_status(gchar *name, gchar *version, GModule *handle, gchar *filter_string, FILE *statusfile) { gchar *ref_string; @@ -285,9 +305,9 @@ check_plugin_status(gchar *name, gchar *version, lt_dlhandle handle, else { /* found the plugin */ if (line[ref_string_len+1] == '1') { enable_plugin(name, version); - proto_init = (void (*)())lt_dlsym(handle, "proto_init"); - if (proto_init) + if (g_module_symbol(handle, "proto_init", (gpointer*)&proto_init) == TRUE) { proto_init(); + } } if (fgets(line, 512, statusfile) == NULL) return; @@ -307,7 +327,7 @@ plugins_scan_dir(const char *dirname) DIR *dir; /* scanned directory */ struct dirent *file; /* current file */ gchar filename[512]; /* current file name */ - lt_dlhandle handle; /* handle returned by dlopen */ + GModule *handle; /* handle returned by dlopen */ gchar *name; gchar *version; gchar *protocol; @@ -318,7 +338,11 @@ plugins_scan_dir(const char *dirname) int cr; FILE *statusfile; +#ifdef WIN32 +#define LT_LIB_EXT ".dll" +#else #define LT_LIB_EXT ".la" +#endif if (!plugin_status_file) { @@ -341,34 +365,31 @@ plugins_scan_dir(const char *dirname) sprintf(filename, "%s/%s", dirname, file->d_name); - if ((handle = lt_dlopen(filename)) == NULL) continue; + if ((handle = g_module_open(filename, 0)) == NULL) continue; name = (gchar *)file->d_name; - if ((version = (gchar *)lt_dlsym(handle, "version")) == NULL) + if (g_module_symbol(handle, "version", (gpointer*)&version) == FALSE) { - lt_dlclose(handle); + g_module_close(handle); continue; } - if ((protocol = (gchar *)lt_dlsym(handle, "protocol")) == NULL) + if (g_module_symbol(handle, "protocol", (gpointer*)&protocol) == FALSE) { - lt_dlclose(handle); + g_module_close(handle); continue; } - if ((filter_string = (gchar *)lt_dlsym(handle, "filter_string")) == NULL) + if (g_module_symbol(handle, "filter_string", (gpointer*)&filter_string) == FALSE) { - lt_dlclose(handle); + g_module_close(handle); continue; } if (dfilter_compile(filter_string, &filter) != 0) { - lt_dlclose(handle); + g_module_close(handle); continue; } - if ((dissector = (void (*)(const u_char *, int, - frame_data *, - proto_tree *)) lt_dlsym(handle, "dissector")) == NULL) - { + if (g_module_symbol(handle, "dissector", (gpointer*)&dissector) == FALSE) { if (filter != NULL) dfilter_destroy(filter); - lt_dlclose(handle); + g_module_close(handle); continue; } @@ -384,7 +405,7 @@ plugins_scan_dir(const char *dirname) name, version); if (filter != NULL) dfilter_destroy(filter); - lt_dlclose(handle); + g_module_close(handle); continue; } if (statusfile) { |