module-dir.c revision 7782e9d99d3d6de1c9c54919811038e2a705ea08
/* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "array.h"
#include "module-dir.h"
#ifdef HAVE_MODULES
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <dlfcn.h>
#ifndef RTLD_GLOBAL
# define RTLD_GLOBAL 0
#endif
#ifndef RTLD_NOW
# define RTLD_NOW 0
#endif
{
const char *error;
void *ret;
/* clear out old errors */
(void)dlerror();
/* get our init func */
i_error("module %s: dlsym(%s) failed: %s",
}
}
return ret;
}
const char *module_file_get_name(const char *fname)
{
const char *p;
/* [lib][nn_]name(.so) */
fname += 3;
for (p = fname; *p != '\0'; p++) {
if (*p < '0' || *p > '9')
break;
}
if (*p == '_')
fname = p + 1;
if (p == NULL)
return fname;
return t_strdup_until(fname, p);
}
{
if (quiet)
}
{
}
static struct module *
const char *version)
{
void *handle;
const char *const *module_version;
return NULL;
}
if (module_version != NULL &&
i_error("Module is for different version %s: %s",
*module_version, path);
return NULL;
}
/* get our init func */
i_error("Module doesn't have %s function: %s",
return NULL;
}
return module;
}
{
s1 += 3;
s2 += 3;
}
{
return TRUE;
*names = "";
return TRUE;
}
}
return FALSE;
}
{
unsigned int i, count;
for (i = 0; i < count; i++) {
i_fatal("Multiple files for module %s: %s/%s, %s/%s",
}
}
static struct module *
bool require_init_funcs, const char *version)
{
struct dirent *d;
const char **module_names_arr;
unsigned int i, count;
if (module_names != NULL) {
/* we were given a list of modules to load.
we can't fail. */
}
return NULL;
}
if (name[0] == '.')
continue;
continue;
T_BEGIN {
} T_END;
}
if (module_names == NULL)
else {
/* allow giving the module names also in non-base form.
convert them in here. */
for (i = 0; module_names_arr[i] != NULL; i++) {
module_names_arr[i] =
}
}
module_pos = &modules;
const char *path, *stripped_name;
else {
i_fatal("Couldn't load required plugins");
}
*module_pos = module;
}
} T_END;
if (module_names_arr != NULL) {
/* make sure all modules were found */
if (**module_names_arr != '\0') {
i_fatal("Plugin %s not found from directory %s",
*module_names_arr, dir);
}
}
}
pool_unref(&pool);
return modules;
}
bool require_init_funcs, const char *version)
{
T_BEGIN {
} T_END;
return modules;
}
{
T_BEGIN {
} T_END;
}
}
}
{
unsigned int i, count = 0;
count++;
if (count == 0)
return;
/* @UNSAFE: deinitialize in reverse order */
T_BEGIN {
}
for (i = 0; i < count; i++) {
}
}
} T_END;
}
{
/* Call all modules' deinit() first, so that they may still call each
others' functions. */
}
}
#else
const char *module_names ATTR_UNUSED,
const char *version ATTR_UNUSED)
{
i_error("Dynamically loadable module support not built in");
return NULL;
}
{
}
{
}
#endif