libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 2ae590d7ef42e827f7700f02bca519b6bb5acbe5
parent e005be81997d31fdc7e18a079e97ebe3fffe370d
Author: Christian Grothoff <christian@grothoff.org>
Date:   Mon, 26 Mar 2012 16:20:57 +0000

-LRN: divide extractor.c - adding files

Diffstat:
Asrc/main/extractor_plugins.c | 350+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/extractor_plugins.h | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/extractor_plugpath.c | 520+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/extractor_plugpath.h | 47+++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 1035 insertions(+), 0 deletions(-)

diff --git a/src/main/extractor_plugins.c b/src/main/extractor_plugins.c @@ -0,0 +1,350 @@ +/* + This file is part of libextractor. + (C) 2002, 2003, 2004, 2005, 2006, 2009 Vidyut Samanta and Christian Grothoff + + libextractor 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, or (at your + option) any later version. + + libextractor 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 libextractor; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + */ + +#include "extractor_plugins.h" +#include "extractor_plugpath.h" + + +/** + * Load the default set of plugins. The default can be changed + * by setting the LIBEXTRACTOR_LIBRARIES environment variable. + * If it is set to "env", then this function will return + * EXTRACTOR_plugin_add_config (NULL, env, flags). Otherwise, + * it will load all of the installed plugins and return them. + * + * @param flags options for all of the plugins loaded + * @return the default set of plugins, NULL if no plugins were found + */ +struct EXTRACTOR_PluginList * +EXTRACTOR_plugin_add_defaults(enum EXTRACTOR_Options flags) +{ + struct DefaultLoaderContext dlc; + char *env; + + env = getenv ("LIBEXTRACTOR_LIBRARIES"); + if (env != NULL) + return EXTRACTOR_plugin_add_config (NULL, env, flags); + dlc.res = NULL; + dlc.flags = flags; + get_installation_paths (&load_plugins_from_dir, + &dlc); + return dlc.res; +} + +/** + * Try to resolve a plugin function. + * + * @param lib_handle library to search for the symbol + * @param prefix prefix to add + * @param sym_name base name for the symbol + * @param options set to special options requested by the plugin + * @return NULL on error, otherwise pointer to the symbol + */ +static void * +get_symbol_with_prefix(void *lib_handle, + const char *template, + const char *prefix, + const char **options) +{ + char *name; + void *symbol; + const char *sym_name; + char *sym; + char *dot; + const char *(*opt_fun)(void); + + if (NULL != options) *options = NULL; + sym_name = strstr (prefix, "_"); + if (sym_name == NULL) + return NULL; + sym_name++; + sym = strdup (sym_name); + if (sym == NULL) + return NULL; + dot = strstr (sym, "."); + if (dot != NULL) + *dot = '\0'; + name = malloc(strlen(sym) + strlen(template) + 1); + if (name == NULL) + { + free (sym); + return NULL; + } + sprintf(name, + template, + sym); + /* try without '_' first */ + symbol = lt_dlsym(lib_handle, name + 1); + if (symbol==NULL) + { + /* now try with the '_' */ +#if DEBUG + char *first_error = strdup (lt_dlerror()); +#endif + symbol = lt_dlsym(lib_handle, name); +#if DEBUG + if (NULL == symbol) + { + fprintf(stderr, + "Resolving symbol `%s' failed, " + "so I tried `%s', but that failed also. Errors are: " + "`%s' and `%s'.\n", + name+1, + name, + first_error == NULL ? "out of memory" : first_error, + lt_dlerror()); + } + if (first_error != NULL) + free(first_error); +#endif + } + + if ( (symbol != NULL) && + (NULL != options) ) + { + /* get special options */ + sprintf(name, + "_EXTRACTOR_%s_options", + sym); + /* try without '_' first */ + opt_fun = lt_dlsym(lib_handle, name + 1); + if (opt_fun == NULL) + opt_fun = lt_dlsym(lib_handle, name); + if (opt_fun != NULL) + *options = opt_fun (); + } + free (sym); + free(name); + + return symbol; +} + + +/** + * Load a plugin. + * + * @param plugin plugin to load + * @return 0 on success, -1 on error + */ +int +plugin_load (struct EXTRACTOR_PluginList *plugin) +{ +#if WINDOWS + wchar_t wlibname[4097]; + char llibname[4097]; +#endif + lt_dladvise advise; + + if (plugin->libname == NULL) + plugin->libname = find_plugin (plugin->short_libname); + if (plugin->libname == NULL) + { +#if DEBUG + fprintf (stderr, + "Failed to find plugin `%s'\n", + plugin->short_libname); +#endif + plugin->flags = EXTRACTOR_OPTION_DISABLED; + return -1; + } + lt_dladvise_init (&advise); + lt_dladvise_ext (&advise); + lt_dladvise_local (&advise); +#if WINDOWS + wlibname[0] = L'\0'; + llibname[0] = '\0'; + if (MultiByteToWideChar (CP_UTF8, 0, plugin->libname, -1, wlibname, 4097) <= 0 + || WideCharToMultiByte (CP_ACP, 0, wlibname, -1, llibname, 4097, NULL, NULL) < 0) + { +#if DEBUG + fprintf (stderr, + "Loading `%s' plugin failed: %s\n", + plugin->short_libname, + "can't convert plugin name to local encoding"); + free (plugin->libname); + plugin->libname = NULL; + plugin->flags = EXTRACTOR_OPTION_DISABLED; + return -1; +#endif + } + plugin->libraryHandle = lt_dlopenadvise (llibname, + advise); +#else + plugin->libraryHandle = lt_dlopenadvise (plugin->libname, + advise); +#endif + lt_dladvise_destroy(&advise); + if (plugin->libraryHandle == NULL) + { +#if DEBUG + fprintf (stderr, + "Loading `%s' plugin failed: %s\n", + plugin->short_libname, + lt_dlerror ()); +#endif + free (plugin->libname); + plugin->libname = NULL; + plugin->flags = EXTRACTOR_OPTION_DISABLED; + return -1; + } + plugin->extractMethod = get_symbol_with_prefix (plugin->libraryHandle, + "_EXTRACTOR_%s_extract", + plugin->libname, + &plugin->specials); + if (plugin->extractMethod == NULL) + { +#if DEBUG + fprintf (stderr, + "Resolving `extract' method of plugin `%s' failed: %s\n", + plugin->short_libname, + lt_dlerror ()); +#endif + lt_dlclose (plugin->libraryHandle); + free (plugin->libname); + plugin->libname = NULL; + plugin->flags = EXTRACTOR_OPTION_DISABLED; + return -1; + } + return 0; +} + + + + +/** + * Add a library for keyword extraction. + * + * @param prev the previous list of libraries, may be NULL + * @param library the name of the library + * @param flags options to use + * @return the new list of libraries, equal to prev iff an error occured + */ +struct EXTRACTOR_PluginList * +EXTRACTOR_plugin_add (struct EXTRACTOR_PluginList * prev, + const char *library, + const char *options, + enum EXTRACTOR_Options flags) +{ + struct EXTRACTOR_PluginList *result; + char *libname; + + libname = find_plugin (library); + if (libname == NULL) + { + fprintf (stderr, + "Could not load `%s'\n", + library); + return prev; + } + result = calloc (1, sizeof (struct EXTRACTOR_PluginList)); + if (result == NULL) + return prev; + result->next = prev; + result->short_libname = strdup (library); + if (result->short_libname == NULL) + { + free (result); + return NULL; + } + result->libname = libname; + result->flags = flags; + if (NULL != options) + result->plugin_options = strdup (options); + else + result->plugin_options = NULL; + return result; +} + + +/** + * Load multiple libraries as specified by the user. + * + * @param config a string given by the user that defines which + * libraries should be loaded. Has the format + * "[[-]LIBRARYNAME[(options)][:[-]LIBRARYNAME[(options)]]]*". + * For example, 'mp3:ogg.so' loads the + * mp3 and the ogg library. The '-' before the LIBRARYNAME + * indicates that the library should be removed from + * the library list. + * @param prev the previous list of libraries, may be NULL + * @param flags options to use + * @return the new list of libraries, equal to prev iff an error occured + * or if config was empty (or NULL). + */ +struct EXTRACTOR_PluginList * +EXTRACTOR_plugin_add_config (struct EXTRACTOR_PluginList * prev, + const char *config, + enum EXTRACTOR_Options flags) +{ + char *cpy; + size_t pos; + size_t last; + ssize_t lastconf; + size_t len; + + if (config == NULL) + return prev; + len = strlen(config); + cpy = strdup(config); + if (cpy == NULL) + return prev; + pos = 0; + last = 0; + lastconf = 0; + while (pos < len) + { + while ((cpy[pos] != ':') && (cpy[pos] != '\0') && + (cpy[pos] != '(')) + pos++; + if( cpy[pos] == '(' ) { + cpy[pos++] = '\0'; /* replace '(' by termination */ + lastconf = pos; /* start config from here, after (. */ + while ((cpy[pos] != '\0') && (cpy[pos] != ')')) + pos++; /* config until ) or EOS. */ + if( cpy[pos] == ')' ) { + cpy[pos++] = '\0'; /* write end of config here. */ + while ((cpy[pos] != ':') && (cpy[pos] != '\0')) + pos++; /* forward until real end of string found. */ + cpy[pos++] = '\0'; + } else { + cpy[pos++] = '\0'; /* end of string. */ + } + } else { + lastconf = -1; /* NULL config when no (). */ + cpy[pos++] = '\0'; /* replace ':' by termination */ + } + if (cpy[last] == '-') + { + last++; + prev = EXTRACTOR_plugin_remove (prev, + &cpy[last]); + } + else + { + prev = EXTRACTOR_plugin_add (prev, + &cpy[last], + (lastconf != -1) ? &cpy[lastconf] : NULL, + flags); + } + last = pos; + } + free (cpy); + return prev; +} diff --git a/src/main/extractor_plugins.h b/src/main/extractor_plugins.h @@ -0,0 +1,118 @@ +/* + This file is part of libextractor. + (C) 2002, 2003, 2004, 2005, 2006, 2009 Vidyut Samanta and Christian Grothoff + + libextractor 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, or (at your + option) any later version. + + libextractor 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 libextractor; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + */ + +#if !defined (EXTRACTOR_PLUGINS_H) +#define EXTRACTOR_PLUGINS_H + +#include "platform.h" +#include "plibc.h" +#include "extractor.h" +//#include <dirent.h> +//#include <sys/types.h> +#ifndef WINDOWS +#include <sys/wait.h> +#include <sys/shm.h> +#endif +#include <signal.h> +#include <ltdl.h> + +/** + * Linked list of extractor plugins. An application builds this list + * by telling libextractor to load various keyword-extraction + * plugins. Libraries can also be unloaded (removed from this list, + * see EXTRACTOR_plugin_remove). + */ +struct EXTRACTOR_PluginList +{ + /** + * This is a linked list. + */ + struct EXTRACTOR_PluginList *next; + + /** + * Pointer to the plugin (as returned by lt_dlopen). + */ + void * libraryHandle; + + /** + * Name of the library (i.e., 'libextractor_foo.so') + */ + char *libname; + + /** + * Name of the library (i.e., 'libextractor_foo.so') + */ + char *short_libname; + + /** + * Pointer to the function used for meta data extraction. + */ + EXTRACTOR_ExtractMethod extractMethod; + + /** + * Options for the plugin. + */ + char * plugin_options; + + /** + * Special options for the plugin + * (as returned by the plugin's "options" method; + * typically NULL). + */ + const char *specials; + + /** + * Flags to control how the plugin is executed. + */ + enum EXTRACTOR_Options flags; + + /** + * Process ID of the child process for this plugin. 0 for + * none. + */ +#ifndef WINDOWS + int cpid; +#else + HANDLE hProcess; +#endif + + /** + * Pipe used to send information about shared memory segments to + * the child process. NULL if not initialized. + */ + FILE *cpipe_in; + + /** + * Pipe used to read information about extracted meta data from + * the child process. -1 if not initialized. + */ + int cpipe_out; +}; + +/** + * Load a plugin. + * + * @param plugin plugin to load + * @return 0 on success, -1 on error + */ +int +plugin_load (struct EXTRACTOR_PluginList *plugin); + +#endif /* EXTRACTOR_PLUGINS_H */ diff --git a/src/main/extractor_plugpath.c b/src/main/extractor_plugpath.c @@ -0,0 +1,520 @@ +/* + This file is part of libextractor. + (C) 2002, 2003, 2004, 2005, 2006, 2009 Vidyut Samanta and Christian Grothoff + + libextractor 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, or (at your + option) any later version. + + libextractor 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 libextractor; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + */ + +#include "platform.h" +#include "plibc.h" +#include "extractor.h" +#include <dirent.h> +#include <sys/types.h> +#ifndef WINDOWS +#include <sys/wait.h> +#include <sys/shm.h> +#endif +#include <signal.h> +#include <ltdl.h> + +#include "extractor_plugpath.h" + +/** + * Remove a trailing '/bin' from in (if present). + */ +static char * +cut_bin(char * in) { + size_t p; + + if (in == NULL) + return NULL; + p = strlen(in); + if (p > 4) { + if ( (in[p-1] == '/') || + (in[p-1] == '\\') ) + in[--p] = '\0'; + if (0 == strcmp(&in[p-3], + "bin")) { + in[p-3] = '\0'; + p -= 3; + } + } + return in; +} + +#if LINUX +/** + * Try to determine path by reading /proc/PID/exe or + * /proc/PID/maps. + * + * Note that this may fail if LE is installed in one directory + * and the binary linking against it sits elsewhere. + */ +static char * +get_path_from_proc_exe() { + char fn[64]; + char line[1024]; + char dir[1024]; + char * lnk; + char * ret; + char * lestr; + ssize_t size; + FILE * f; + + snprintf(fn, + sizeof (fn), + "/proc/%u/maps", + getpid()); + f = FOPEN(fn, "r"); + if (f != NULL) { + while (NULL != fgets(line, 1024, f)) { + if ( (1 == sscanf(line, + "%*x-%*x %*c%*c%*c%*c %*x %*2x:%*2x %*u%*[ ]%s", + dir)) && + (NULL != (lestr = strstr(dir, + "libextractor")) ) ) { + lestr[0] = '\0'; + fclose(f); + return strdup(dir); + } + } + fclose(f); + } + snprintf(fn, + sizeof (fn), + "/proc/%u/exe", + getpid()); + lnk = malloc(1029); /* 1024 + 5 for "lib/" catenation */ + if (lnk == NULL) + return NULL; + size = readlink(fn, lnk, 1023); + if ( (size <= 0) || (size >= 1024) ) { + free(lnk); + return NULL; + } + lnk[size] = '\0'; + while ( (lnk[size] != '/') && + (size > 0) ) + size--; + if ( (size < 4) || + (lnk[size-4] != '/') ) { + /* not installed in "/bin/" -- binary path probably useless */ + free(lnk); + return NULL; + } + lnk[size] = '\0'; + lnk = cut_bin(lnk); + ret = realloc(lnk, strlen(lnk) + 5); + if (ret == NULL) + { + free (lnk); + return NULL; + } + strcat(ret, "lib/"); /* guess "lib/" as the library dir */ + return ret; +} +#endif + +#if WINDOWS +/** + * Try to determine path with win32-specific function + */ +static char * +get_path_from_module_filename() { + char * path; + char * ret; + char * idx; + + path = malloc(4103); /* 4096+nil+6 for "/lib/" catenation */ + if (path == NULL) + return NULL; + GetModuleFileName(NULL, path, 4096); + idx = path + strlen(path); + while ( (idx > path) && + (*idx != '\\') && + (*idx != '/') ) + idx--; + *idx = '\0'; + path = cut_bin(path); + ret = realloc(path, strlen(path) + 6); + if (ret == NULL) + { + free (path); + return NULL; + } + strcat(ret, "/lib/"); /* guess "lib/" as the library dir */ + return ret; +} +#endif + +#if DARWIN +static char * get_path_from_dyld_image() { + const char * path; + char * p, * s; + int i; + int c; + + p = NULL; + c = _dyld_image_count(); + for (i = 0; i < c; i++) { + if (_dyld_get_image_header(i) == &_mh_dylib_header) { + path = _dyld_get_image_name(i); + if (path != NULL && strlen(path) > 0) { + p = strdup(path); + if (p == NULL) + return NULL; + s = p + strlen(p); + while ( (s > p) && (*s != '/') ) + s--; + s++; + *s = '\0'; + } + break; + } + } + return p; +} +#endif + +/** + * This may also fail -- for example, if extract + * is not also installed. + */ +static char * +get_path_from_PATH() { + struct stat sbuf; + char * path; + char * pos; + char * end; + char * buf; + char * ret; + const char * p; + + p = getenv("PATH"); + if (p == NULL) + return NULL; + path = strdup(p); /* because we write on it */ + if (path == NULL) + return NULL; + buf = malloc(strlen(path) + 20); + if (buf == NULL) + { + free (path); + return NULL; + } + pos = path; + + while (NULL != (end = strchr(pos, ':'))) { + *end = '\0'; + sprintf(buf, "%s/%s", pos, "extract"); + if (0 == stat(buf, &sbuf)) { + pos = strdup(pos); + free(buf); + free(path); + if (pos == NULL) + return NULL; + pos = cut_bin(pos); + ret = realloc(pos, strlen(pos) + 5); + if (ret == NULL) + { + free (pos); + return NULL; + } + strcat(ret, "lib/"); + return ret; + } + pos = end + 1; + } + sprintf(buf, "%s/%s", pos, "extract"); + if (0 == stat(buf, &sbuf)) { + pos = strdup(pos); + free(buf); + free(path); + if (pos == NULL) + return NULL; + pos = cut_bin(pos); + ret = realloc(pos, strlen(pos) + 5); + if (ret == NULL) + { + free (pos); + return NULL; + } + strcat(ret, "lib/"); + return ret; + } + free(buf); + free(path); + return NULL; +} + +/** + * Create a filename by appending 'fname' to 'path'. + * + * @param path the base path + * @param fname the filename to append + * @return '$path/$fname' + */ +static char * +append_to_dir (const char *path, + const char *fname) +{ + char *ret; + size_t slen; + + slen = strlen (path); + if (slen == 0) + return NULL; + if (fname[0] == DIR_SEPARATOR) + fname++; + ret = malloc (slen + strlen(fname) + 2); + if (ret == NULL) + return NULL; +#ifdef MINGW + if (path[slen-1] == '\\') + sprintf (ret, + "%s%s", + path, + fname); + else + sprintf (ret, + "%s\\%s", + path, + fname); +#else + if (path[slen-1] == '/') + sprintf (ret, + "%s%s", + path, + fname); + else + sprintf (ret, + "%s/%s", + path, + fname); +#endif + return ret; +} + + +/** + * Iterate over all paths where we expect to find GNU libextractor + * plugins. + * + * @param pp function to call for each path + * @param pp_cls cls argument for pp. + */ +void +get_installation_paths (PathProcessor pp, + void *pp_cls) +{ + const char *p; + char * path; + char * prefix; + char * d; + + prefix = NULL; + p = getenv("LIBEXTRACTOR_PREFIX"); + if (p != NULL) + { + d = strdup (p); + if (d == NULL) + return; + prefix = strtok (d, PATH_SEPARATOR_STR); + while (NULL != prefix) + { + pp (pp_cls, prefix); + prefix = strtok (NULL, PATH_SEPARATOR_STR); + } + free (d); + return; + } +#if LINUX + if (prefix == NULL) + prefix = get_path_from_proc_exe(); +#endif +#if WINDOWS + if (prefix == NULL) + prefix = get_path_from_module_filename(); +#endif +#if DARWIN + if (prefix == NULL) + prefix = get_path_from_dyld_image(); +#endif + if (prefix == NULL) + prefix = get_path_from_PATH(); + pp (pp_cls, PLUGININSTDIR); + if (prefix == NULL) + return; + path = append_to_dir (prefix, PLUGINDIR); + if (path != NULL) + { + if (0 != strcmp (path, + PLUGININSTDIR)) + pp (pp_cls, path); + free (path); + } + free (prefix); +} + + +struct SearchContext +{ + const char *short_name; + char *path; +}; + + +/** + * Load all plugins from the given directory. + * + * @param cls pointer to the "struct EXTRACTOR_PluginList*" to extend + * @param path path to a directory with plugins + */ +static void +find_plugin_in_path (void *cls, + const char *path) +{ + struct SearchContext *sc = cls; + DIR *dir; + struct dirent *ent; + const char *la; + const char *sym_name; + char *sym; + char *dot; + + if (sc->path != NULL) + return; + dir = OPENDIR (path); + if (NULL == dir) + return; + while (NULL != (ent = READDIR (dir))) + { + if (ent->d_name[0] == '.') + continue; + if ( (NULL != (la = strstr (ent->d_name, ".la"))) && + (la[3] == '\0') ) + continue; /* only load '.so' and '.dll' */ + sym_name = strstr (ent->d_name, "_"); + if (sym_name == NULL) + continue; + sym_name++; + sym = strdup (sym_name); + if (sym == NULL) + { + CLOSEDIR (dir); + return; + } + dot = strstr (sym, "."); + if (dot != NULL) + *dot = '\0'; + if (0 == strcmp (sym, sc->short_name)) + { + sc->path = append_to_dir (path, ent->d_name); + free (sym); + break; + } + free (sym); + } +#if DEBUG + if (sc->path == NULL) + fprintf (stderr, + "Failed to find plugin `%s' in `%s'\n", + sc->short_name, + path); +#endif + CLOSEDIR (dir); +} + + + +/** + * Given a short name of a library (i.e. "mime"), find + * the full path of the respective plugin. + */ +char * +find_plugin (const char *short_name) +{ + struct SearchContext sc; + + sc.path = NULL; + sc.short_name = short_name; + get_installation_paths (&find_plugin_in_path, + &sc); + return sc.path; +} + + + + + +/** + * Load all plugins from the given directory. + * + * @param cls pointer to the "struct EXTRACTOR_PluginList*" to extend + * @param path path to a directory with plugins + */ +void +load_plugins_from_dir (void *cls, + const char *path) +{ + struct DefaultLoaderContext *dlc = cls; + DIR *dir; + struct dirent *ent; + const char *la; + const char *sym_name; + char *sym; + char *dot; + + dir = opendir (path); + if (NULL == dir) + return; + while (NULL != (ent = readdir (dir))) + { + if (ent->d_name[0] == '.') + continue; + if ( ( (NULL != (la = strstr (ent->d_name, ".la"))) && + (la[3] == '\0') ) || + ( (NULL != (la = strstr (ent->d_name, ".a"))) && + (la[2] == '\0')) ) + continue; /* only load '.so' and '.dll' */ + + sym_name = strstr (ent->d_name, "_"); + if (sym_name == NULL) + continue; + sym_name++; + sym = strdup (sym_name); + if (NULL == sym) + { + closedir (dir); + return; + } + dot = strstr (sym, "."); + if (dot != NULL) + *dot = '\0'; +#if DEBUG > 1 + fprintf (stderr, + "Adding default plugin `%s'\n", + sym); +#endif + dlc->res = EXTRACTOR_plugin_add (dlc->res, + sym, + NULL, + dlc->flags); + free (sym); + } + closedir (dir); +} + diff --git a/src/main/extractor_plugpath.h b/src/main/extractor_plugpath.h @@ -0,0 +1,47 @@ +#if !defined(EXTRACTOR_PLUGPATH_H) +#define EXTRACTOR_PLUGPATH_H + +struct DefaultLoaderContext +{ + struct EXTRACTOR_PluginList *res; + enum EXTRACTOR_Options flags; +}; + +/** + * Function to call on paths. + * + * @param cls closure + * @param path a directory path + */ +typedef void (*PathProcessor)(void *cls, + const char *path); + +/** + * Iterate over all paths where we expect to find GNU libextractor + * plugins. + * + * @param pp function to call for each path + * @param pp_cls cls argument for pp. + */ +void +get_installation_paths (PathProcessor pp, + void *pp_cls); + +/** + * Given a short name of a library (i.e. "mime"), find + * the full path of the respective plugin. + */ +char * +find_plugin (const char *short_name); + +/** + * Load all plugins from the given directory. + * + * @param cls pointer to the "struct EXTRACTOR_PluginList*" to extend + * @param path path to a directory with plugins + */ +void +load_plugins_from_dir (void *cls, + const char *path); + +#endif /* EXTRACTOR_PLUGPATH_H */