summaryrefslogtreecommitdiff
path: root/source4/lib/ldb/common
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/ldb/common')
-rw-r--r--source4/lib/ldb/common/ldb.c15
-rw-r--r--source4/lib/ldb/common/ldb_modules.c39
2 files changed, 52 insertions, 2 deletions
diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c
index 9acf74535b..0d424ad601 100644
--- a/source4/lib/ldb/common/ldb.c
+++ b/source4/lib/ldb/common/ldb.c
@@ -102,15 +102,26 @@ static ldb_connect_fn ldb_find_backend(const char *url)
int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[])
{
int ret;
+ char *backend;
ldb_connect_fn fn;
if (strchr(url, ':') != NULL) {
- fn = ldb_find_backend(url);
+ backend = talloc_strndup(ldb, url, strchr(url, ':')-url);
} else {
/* Default to tdb */
- fn = ldb_find_backend("tdb:");
+ backend = talloc_strdup(ldb, "tdb");
}
+ fn = ldb_find_backend(backend);
+
+ if (fn == NULL) {
+ if (ldb_try_load_dso(ldb, backend) == 0) {
+ fn = ldb_find_backend(backend);
+ }
+ }
+
+ talloc_free(backend);
+
if (fn == NULL) {
ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to find backend for '%s'\n", url);
return LDB_ERR_OTHER;
diff --git a/source4/lib/ldb/common/ldb_modules.c b/source4/lib/ldb/common/ldb_modules.c
index 0cb0041d84..6ba5fbbc20 100644
--- a/source4/lib/ldb/common/ldb_modules.c
+++ b/source4/lib/ldb/common/ldb_modules.c
@@ -195,6 +195,39 @@ int ldb_register_module(const struct ldb_module_ops *ops)
return 0;
}
+int ldb_try_load_dso(struct ldb_context *ldb, const char *name)
+{
+ char *path;
+ void *handle;
+ int (*init_fn) (void);
+
+#ifdef HAVE_DLOPEN
+ path = talloc_asprintf(ldb, "%s/%s.%s", MODULESDIR, name, SHLIBEXT);
+
+ ldb_debug(ldb, LDB_DEBUG_TRACE, "trying to load %s from %s\n", name, path);
+
+ handle = dlopen(path, 0);
+ if (handle == NULL) {
+ ldb_debug(ldb, LDB_DEBUG_WARNING, "unable to load %s from %s: %s\n", name, path, dlerror());
+ return -1;
+ }
+
+ init_fn = dlsym(handle, "init_module");
+
+ if (init_fn == NULL) {
+ ldb_debug(ldb, LDB_DEBUG_ERROR, "no symbol `init_module' found in %s: %s\n", path, dlerror());
+ return -1;
+ }
+
+ talloc_free(path);
+
+ return init_fn();
+#else
+ ldb_debug(ldb, LDB_DEBUG_TRACE, "no dlopen() - not trying to load %s module\n", name);
+ return -1;
+#endif
+}
+
int ldb_load_modules(struct ldb_context *ldb, const char *options[])
{
char **modules = NULL;
@@ -253,6 +286,12 @@ int ldb_load_modules(struct ldb_context *ldb, const char *options[])
ops = ldb_find_module_ops(modules[i]);
if (ops == NULL) {
+ if (ldb_try_load_dso(ldb, modules[i]) == 0) {
+ ops = ldb_find_module_ops(modules[i]);
+ }
+ }
+
+ if (ops == NULL) {
ldb_debug(ldb, LDB_DEBUG_WARNING, "WARNING: Module [%s] not found\n",
modules[i]);
continue;