summaryrefslogtreecommitdiff
path: root/source3/passdb
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2002-02-22 02:47:53 +0000
committerAndrew Bartlett <abartlet@samba.org>2002-02-22 02:47:53 +0000
commit527aaf6def6b53c0e01fc5d8369b06be4237fca0 (patch)
tree10319b71b7c9f7e2a2fd13b520a7f7bd03390fa5 /source3/passdb
parent34b31b529eff309d11877197b1fbc62a06f3920a (diff)
downloadsamba-527aaf6def6b53c0e01fc5d8369b06be4237fca0.tar.gz
samba-527aaf6def6b53c0e01fc5d8369b06be4237fca0.tar.bz2
samba-527aaf6def6b53c0e01fc5d8369b06be4237fca0.zip
Add the pdb_plugin module from Jelmer Vernooij <jelmer@nl.linux.org>.
This allow the user to select 'passdb backend = plugin : /path/to/plugin.so : pluging args' And load any arbitary plugin. Apparently Jelmer has a mysql plugin in the works - hence this patch. We probably need to rework the interface a bit before 3.0 (add versioning of some kind) but this is a good start. Andrew Bartlett (This used to be commit d6d18b70f0c377344b0b3d9df5a11d209793bfe0)
Diffstat (limited to 'source3/passdb')
-rw-r--r--source3/passdb/pdb_interface.c7
-rw-r--r--source3/passdb/pdb_plugin.c72
2 files changed, 76 insertions, 3 deletions
diff --git a/source3/passdb/pdb_interface.c b/source3/passdb/pdb_interface.c
index 13d483fc25..73532984b6 100644
--- a/source3/passdb/pdb_interface.c
+++ b/source3/passdb/pdb_interface.c
@@ -22,7 +22,7 @@
/** List of various built-in passdb modules */
-const struct pdb_init_function builtin_pdb_init_functions[] = {
+const struct pdb_init_function_entry builtin_pdb_init_functions[] = {
{ "smbpasswd", pdb_init_smbpasswd },
{ "smbpasswd_nua", pdb_init_smbpasswd_nua },
{ "tdbsam", pdb_init_tdbsam },
@@ -32,6 +32,7 @@ const struct pdb_init_function builtin_pdb_init_functions[] = {
{ "nisplus", pdb_init_nisplus },
{ "unix", pdb_init_unix },
#endif
+ { "plugin", pdb_init_plugin },
{ NULL, NULL}
};
@@ -198,7 +199,7 @@ NTSTATUS make_pdb_context_name(struct pdb_context **context, const char *selecte
return nt_status;
}
- DEBUG(5,("Attempting to find an passdb backend to match %s\n", selected));
+ DEBUG(5,("Attempting to find an passdb backend to match %s (%s)\n", selected, module_name));
for (i = 0; builtin_pdb_init_functions[i].name; i++)
{
if (strequal(builtin_pdb_init_functions[i].name, module_name))
@@ -214,7 +215,7 @@ NTSTATUS make_pdb_context_name(struct pdb_context **context, const char *selecte
break;
}
}
-
+
if (!(*context)->pdb_selected) {
DEBUG(0,("failed to select passdb backed!\n"));
talloc_destroy((*context)->mem_ctx);
diff --git a/source3/passdb/pdb_plugin.c b/source3/passdb/pdb_plugin.c
new file mode 100644
index 0000000000..4ea4245398
--- /dev/null
+++ b/source3/passdb/pdb_plugin.c
@@ -0,0 +1,72 @@
+/*
+ Unix SMB/CIFS implementation.
+ Loadable passdb module interface.
+ Copyright (C) Jelmer Vernooij 2002
+ Copyright (C) Andrew Bartlett 2002
+ Copyright (C) Andrew Bartlett 2002
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+#ifdef HAVE_LIBDL
+
+NTSTATUS pdb_init_plugin(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location)
+{
+ void * dl_handle;
+ char *plugin_location, *plugin_name, *p;
+ pdb_init_function plugin_init;
+
+ if (location == NULL) {
+ DEBUG(0, ("The plugin module needs an argument!\n"));
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
+ plugin_name = smb_xstrdup(location);
+ p = strchr(plugin_name, ':');
+ if (p) {
+ *p = 0;
+ plugin_location = p+1;
+ trim_string(plugin_location, " ", " ");
+ } else plugin_location = NULL;
+ trim_string(plugin_name, " ", " ");
+
+ DEBUG(5, ("Trying to load sam plugin %s\n", plugin_name));
+ dl_handle = sys_dlopen(plugin_name, RTLD_NOW | RTLD_GLOBAL );
+ if (!dl_handle) {
+ DEBUG(0, ("Failed to load sam plugin %s using sys_dlopen (%s)\n", plugin_name, sys_dlerror()));
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
+ plugin_init = sys_dlsym(dl_handle, "pdb_init");
+ if (!plugin_init){
+ DEBUG(0, ("Failed to find function 'pdb_init' using sys_dlsym in sam plugin %s (%s)\n", plugin_name, sys_dlerror()));
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
+ DEBUG(5, ("Starting sam plugin %s with location %s\n", plugin_name, plugin_location));
+ return plugin_init(pdb_context, pdb_method, plugin_location);
+}
+
+#else
+
+NTSTATUS pdb_init_plugin(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location)
+{
+ DEBUG(0, ("pdb_init_plugin: No libdl present - cannot use passdb loadable modules\n"));
+ return NT_STATUS_UNSUCCESSFUL;
+}
+
+#endif