Add smb_register_passdb()
authorJelmer Vernooij <jelmer@samba.org>
Fri, 15 Nov 2002 16:48:00 +0000 (16:48 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Fri, 15 Nov 2002 16:48:00 +0000 (16:48 +0000)
(This used to be commit b5b3b2e6bef431c9c30dc8f2899dc22328801c0e)

source3/include/passdb.h
source3/passdb/pdb_interface.c
source3/passdb/pdb_plugin.c [deleted file]

index f63fd52e84cc6413604816dc62d4bf866ee80e90..9436f255d4b800ba3664493d3c32b028117f0b04 100644 (file)
@@ -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 */
index 88070d8694ce6f7ed52d7e8c37f2f473b7945cb9..2f79d305d365e5d5812eaa53fa4b67068e16c586 100644 (file)
 #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 (file)
index ea67da2..0000000
+++ /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);
-}