summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2002-11-15 16:48:00 +0000
committerJelmer Vernooij <jelmer@samba.org>2002-11-15 16:48:00 +0000
commite1fa4b1d484e7856ad3aee26197d32d63dca90d5 (patch)
treec7248097b4bac95ef62e68b8bed45876f0fe11cd
parent1892b55a47a4f890955a05d5c6ef3258d448feec (diff)
downloadsamba-e1fa4b1d484e7856ad3aee26197d32d63dca90d5.tar.gz
samba-e1fa4b1d484e7856ad3aee26197d32d63dca90d5.tar.bz2
samba-e1fa4b1d484e7856ad3aee26197d32d63dca90d5.zip
Add smb_register_passdb()
(This used to be commit b5b3b2e6bef431c9c30dc8f2899dc22328801c0e)
-rw-r--r--source3/include/passdb.h1
-rw-r--r--source3/passdb/pdb_interface.c67
-rw-r--r--source3/passdb/pdb_plugin.c78
3 files changed, 60 insertions, 86 deletions
diff --git a/source3/include/passdb.h b/source3/include/passdb.h
index f63fd52e84..9436f255d4 100644
--- a/source3/include/passdb.h
+++ b/source3/include/passdb.h
@@ -156,6 +156,7 @@ struct pdb_init_function_entry {
char *name;
/* Function to create a member of the pdb_methods list */
pdb_init_function init;
+ struct pdb_init_function_entry *prev, *next;
};
#endif /* _PASSDB_H */
diff --git a/source3/passdb/pdb_interface.c b/source3/passdb/pdb_interface.c
index 88070d8694..2f79d305d3 100644
--- a/source3/passdb/pdb_interface.c
+++ b/source3/passdb/pdb_interface.c
@@ -25,8 +25,11 @@
#define DBGC_CLASS DBGC_PASSDB
/** List of various built-in passdb modules */
-
-const struct pdb_init_function_entry builtin_pdb_init_functions[] = {
+const struct {
+ char *name;
+ /* Function to create a member of the pdb_methods list */
+ pdb_init_function init;
+} builtin_pdb_init_functions[] = {
{ "smbpasswd", pdb_init_smbpasswd },
{ "smbpasswd_nua", pdb_init_smbpasswd_nua },
{ "tdbsam", pdb_init_tdbsam },
@@ -39,6 +42,50 @@ const struct pdb_init_function_entry builtin_pdb_init_functions[] = {
{ NULL, NULL}
};
+static struct pdb_init_function_entry *backends;
+static void lazy_initialize_passdb(void);
+
+static void lazy_initialize_passdb()
+{
+ int i;
+ static BOOL initialised = False;
+
+ if(!initialised) {
+ initialised = True;
+
+ for(i = 0; builtin_pdb_init_functions[i].name; i++) {
+ smb_register_passdb(builtin_pdb_init_functions[i].name, builtin_pdb_init_functions[i].init, PASSDB_INTERFACE_VERSION);
+ }
+ }
+}
+
+BOOL smb_register_passdb(char *name, pdb_init_function init, int version)
+{
+ struct pdb_init_function_entry *entry = backends;
+
+ if(version != PASSDB_INTERFACE_VERSION)
+ return False;
+
+ DEBUG(5,("Attempting to register passdb backend %s\n", name));
+
+ /* Check for duplicates */
+ while(entry) {
+ if(strcasecmp(name, entry->name) == 0) {
+ DEBUG(0,("There already is a passdb backend registered with the name %s!\n", name));
+ return False;
+ }
+ entry = entry->next;
+ }
+
+ entry = smb_xmalloc(sizeof(struct pdb_init_function_entry));
+ entry->name = name;
+ entry->init = init;
+
+ DLIST_ADD(backends, entry);
+ DEBUG(5,("Successfully added passdb backend '%s'\n", name));
+ return True;
+}
+
static NTSTATUS context_setsampwent(struct pdb_context *context, BOOL update)
{
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
@@ -371,8 +418,12 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c
{
char *module_name = smb_xstrdup(selected);
char *module_location = NULL, *p;
+ struct pdb_init_function_entry *entry;
NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
- int i;
+
+ lazy_initialize_passdb();
+
+ entry = backends;
p = strchr(module_name, ':');
@@ -385,12 +436,11 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c
trim_string(module_name, " ", " ");
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))
+ while(entry) {
+ if (strequal(entry->name, module_name))
{
- DEBUG(5,("Found pdb backend %s (at pos %d)\n", module_name, i));
- nt_status = builtin_pdb_init_functions[i].init(context, methods, module_location);
+ DEBUG(5,("Found pdb backend %s\n", module_name));
+ nt_status = entry->init(context, methods, module_location);
if (NT_STATUS_IS_OK(nt_status)) {
DEBUG(5,("pdb backend %s has a valid init\n", selected));
} else {
@@ -400,6 +450,7 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c
return nt_status;
break; /* unreached */
}
+ entry = entry->next;
}
/* No such backend found */
diff --git a/source3/passdb/pdb_plugin.c b/source3/passdb/pdb_plugin.c
deleted file mode 100644
index ea67da23a5..0000000000
--- a/source3/passdb/pdb_plugin.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- Loadable passdb module interface.
- Copyright (C) Jelmer Vernooij 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"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_PASSDB
-
-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;
- int (*plugin_version)(void);
-
- 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 );
- 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_version = sys_dlsym(dl_handle, "pdb_version");
- if (!plugin_version) {
- sys_dlclose(dl_handle);
- DEBUG(0, ("Failed to find function 'pdb_version' using sys_dlsym in sam plugin %s (%s)\n", plugin_name, sys_dlerror()));
- return NT_STATUS_UNSUCCESSFUL;
- }
-
- if (plugin_version() != PASSDB_INTERFACE_VERSION) {
- sys_dlclose(dl_handle);
- DEBUG(0, ("Wrong PASSDB_INTERFACE_VERSION! sam plugin has version %d and version %d is needed! Please update!\n",
- plugin_version(),PASSDB_INTERFACE_VERSION));
- return NT_STATUS_UNSUCCESSFUL;
- }
-
- plugin_init = sys_dlsym(dl_handle, "pdb_init");
- if (!plugin_init) {
- sys_dlclose(dl_handle);
- 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);
-}