svn commit: samba r14592 - in branches/SAMBA_4_0/source: build/smb_build dsdb/samdb/ldb_modules lib/ldb lib/ldb/common lib/ldb/include lib/ldb/ldb_ildap lib/ldb/ldb_ldap lib/ldb/ldb_tdb nbt_server

jelmer at samba.org jelmer at samba.org
Mon Mar 20 21:45:00 GMT 2006


Author: jelmer
Date: 2006-03-20 21:44:59 +0000 (Mon, 20 Mar 2006)
New Revision: 14592

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=14592

Log:
Add support for loading shared modules to LDB.

Modified:
   branches/SAMBA_4_0/source/build/smb_build/TODO
   branches/SAMBA_4_0/source/build/smb_build/makefile.pm
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/config.mk
   branches/SAMBA_4_0/source/lib/ldb/common/ldb.c
   branches/SAMBA_4_0/source/lib/ldb/common/ldb_modules.c
   branches/SAMBA_4_0/source/lib/ldb/config.mk
   branches/SAMBA_4_0/source/lib/ldb/configure.in
   branches/SAMBA_4_0/source/lib/ldb/include/includes.h
   branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h
   branches/SAMBA_4_0/source/lib/ldb/ldb.pc.in
   branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c
   branches/SAMBA_4_0/source/lib/ldb/ldb_ldap/ldb_ldap.c
   branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
   branches/SAMBA_4_0/source/nbt_server/config.mk


Changeset:
Modified: branches/SAMBA_4_0/source/build/smb_build/TODO
===================================================================
--- branches/SAMBA_4_0/source/build/smb_build/TODO	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/build/smb_build/TODO	2006-03-20 21:44:59 UTC (rev 14592)
@@ -3,7 +3,6 @@
 	libcli_cldap.so.0.0.1 (rename to libcldap?)
 	libcli_nbt.so.0.0.1 (rename to libnbt?)
 	libcli_wrepl.so.0.0.1 (rename to libwrepl?)
-- plugin loading support in ldb
 - generate headermap.txt
 
 set of test scripts that check the code:

Modified: branches/SAMBA_4_0/source/build/smb_build/makefile.pm
===================================================================
--- branches/SAMBA_4_0/source/build/smb_build/makefile.pm	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/build/smb_build/makefile.pm	2006-03-20 21:44:59 UTC (rev 14592)
@@ -441,7 +441,7 @@
 		"",
 		"$ctx->{VERSION}",
 		$ctx->{DESCRIPTION},
-		1
+		defined($ctx->{INIT_FUNCTIONS})
 	); 
 }
 

Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/config.mk
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/config.mk	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/config.mk	2006-03-20 21:44:59 UTC (rev 14592)
@@ -1,65 +1,65 @@
 ################################################
-# Start MODULE libldb_objectguid
-[MODULE::libldb_objectguid]
+# Start MODULE ldb_objectguid
+[MODULE::ldb_objectguid]
 SUBSYSTEM = ldb
 INIT_FUNCTION = objectguid_module_init
 OBJ_FILES = \
 		objectguid.o
 REQUIRED_SUBSYSTEMS = \
 		LIBNDR NDR_MISC
-# End MODULE libldb_objectguid
+# End MODULE ldb_objectguid
 ################################################
 
 ################################################
-# Start MODULE libldb_samldb
-[MODULE::libldb_samldb]
+# Start MODULE ldb_samldb
+[MODULE::ldb_samldb]
 SUBSYSTEM = ldb
 INIT_FUNCTION = samldb_module_init
 OBJ_FILES = \
 		samldb.o
 REQUIRED_SUBSYSTEMS = SAMDB
 #
-# End MODULE libldb_samldb
+# End MODULE ldb_samldb
 ################################################
 
 ################################################
-# Start MODULE libldb_samba3sam
-[MODULE::libldb_samba3sam]
+# Start MODULE ldb_samba3sam
+[MODULE::ldb_samba3sam]
 SUBSYSTEM = ldb
 INIT_FUNCTION = ldb_samba3sam_module_init
 ENABLE = NO
 OBJ_FILES = \
 		samba3sam.o
 #
-# End MODULE libldb_samldb
+# End MODULE ldb_samldb
 ################################################
 
 ################################################
-# Start MODULE libldb_proxy
-[MODULE::libldb_proxy]
+# Start MODULE ldb_proxy
+[MODULE::ldb_proxy]
 SUBSYSTEM = ldb
 INIT_FUNCTION = proxy_module_init
 OBJ_FILES = \
 		proxy.o
 #
-# End MODULE libldb_proxy
+# End MODULE ldb_proxy
 ################################################
 
 
 ################################################
-# Start MODULE libldb_rootdse
-[MODULE::libldb_rootdse]
+# Start MODULE ldb_rootdse
+[MODULE::ldb_rootdse]
 SUBSYSTEM = ldb
 INIT_FUNCTION = rootdse_module_init
 OBJ_FILES = \
 		rootdse.o
 #
-# End MODULE libldb_rootdse
+# End MODULE ldb_rootdse
 ################################################
 
 ################################################
-# Start MODULE libldb_password_hash
-[MODULE::libldb_password_hash]
+# Start MODULE ldb_password_hash
+[MODULE::ldb_password_hash]
 SUBSYSTEM = ldb
 INIT_FUNCTION = password_hash_module_init
 OBJ_FILES = \
@@ -67,12 +67,12 @@
 REQUIRED_SUBSYSTEMS = \
 		HEIMDAL_HDB HEIMDAL_KRB5
 #
-# End MODULE libldb_rootdse
+# End MODULE ldb_rootdse
 ################################################
 
 ################################################
-# Start MODULE libldb_cludge_acl
-[MODULE::libldb_kludge_acl]
+# Start MODULE ldb_cludge_acl
+[MODULE::ldb_kludge_acl]
 SUBSYSTEM = ldb
 INIT_FUNCTION = ldb_kludge_acl_init
 OBJ_FILES = \
@@ -80,17 +80,17 @@
 REQUIRED_SUBSYSTEMS = \
 		LIB_SECURITY
 #
-# End MODULE libldb_rootdse
+# End MODULE ldb_rootdse
 ################################################
 
 ################################################
-# Start MODULE libldb_extended_dn
-[MODULE::libldb_extended_dn]
+# Start MODULE ldb_extended_dn
+[MODULE::ldb_extended_dn]
 SUBSYSTEM = ldb
 INIT_FUNCTION = ldb_extended_dn_init
 OBJ_FILES = \
 		extended_dn.o
 #
-# End MODULE libldb_extended_dn
+# End MODULE ldb_extended_dn
 ################################################
 

Modified: branches/SAMBA_4_0/source/lib/ldb/common/ldb.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/common/ldb.c	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/common/ldb.c	2006-03-20 21:44:59 UTC (rev 14592)
@@ -102,16 +102,27 @@
 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;
 	}

Modified: branches/SAMBA_4_0/source/lib/ldb/common/ldb_modules.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/common/ldb_modules.c	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/common/ldb_modules.c	2006-03-20 21:44:59 UTC (rev 14592)
@@ -195,6 +195,39 @@
 	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 @@
 				
 			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;

Modified: branches/SAMBA_4_0/source/lib/ldb/config.mk
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/config.mk	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/config.mk	2006-03-20 21:44:59 UTC (rev 14592)
@@ -132,6 +132,7 @@
 VERSION = 0.0.1
 SO_VERSION = 0
 DESCRIPTION = LDAP-like embedded database library
+EXTRA_CFLAGS = -DMODULESDIR="$(MODULESDIR)/ldb" -DSHLIBEXT="$(SHLIBEXT)"
 INIT_FUNCTION_TYPE = int (*) (void)
 OBJ_FILES = \
 		common/ldb.o \

Modified: branches/SAMBA_4_0/source/lib/ldb/configure.in
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/configure.in	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/configure.in	2006-03-20 21:44:59 UTC (rev 14592)
@@ -23,9 +23,17 @@
 AC_PATH_PROG(XSLTPROC,xsltproc)
 AC_PATH_PROG(DOXYGEN,doxygen)
 AC_PATH_PROG(GCOV,gcov)
-AC_CHECK_HEADERS(stdint.h)
+AC_CHECK_HEADERS(stdint.h dlfcn.h)
 AC_CONFIG_HEADER(include/config.h)
+AC_CHECK_FUNCS(dlopen dlsym dlclose)
 
+SHLIBEXT="so" # Should be set based on OS later on
+AC_SUBST(SHLIBEXT)
+
+MODULESDIR="$libdir/ldb"
+AC_DEFINE(MODULESDIR,$MODULESDIR,[Modules directory])
+AC_SUBST(MODULESDIR)
+
 AC_CHECK_LIB(popt, poptGetContext)
 
 sinclude(ldap.m4)

Modified: branches/SAMBA_4_0/source/lib/ldb/include/includes.h
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/include/includes.h	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/include/includes.h	2006-03-20 21:44:59 UTC (rev 14592)
@@ -34,6 +34,9 @@
 #ifdef HAVE_STDINT_H
 #include <stdint.h>
 #endif
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
 
 #define discard_const(ptr) ((void *)((intptr_t)(ptr)))
 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))

Modified: branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h	2006-03-20 21:44:59 UTC (rev 14592)
@@ -135,6 +135,7 @@
 
 int ldb_register_module(const struct ldb_module_ops *);
 int ldb_register_backend(const char *url_prefix, ldb_connect_fn);
+int ldb_try_load_dso(struct ldb_context *ldb, const char *name);
 
 /* The following definitions come from lib/ldb/common/ldb_debug.c  */
 void ldb_debug(struct ldb_context *ldb, enum ldb_debug_level level, const char *fmt, ...) PRINTF_ATTRIBUTE(3, 4);

Modified: branches/SAMBA_4_0/source/lib/ldb/ldb.pc.in
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb.pc.in	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb.pc.in	2006-03-20 21:44:59 UTC (rev 14592)
@@ -2,9 +2,11 @@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 includedir=@includedir@
+modulesdir=@modulesdir@
 
 Name: ldb
 Description: An LDAP-like embedded database
 Version: 4.0
 Libs: @LIBS@ -L${libdir} -lldb
 Cflags: -I${includedir} @CFLAGS@
+Modulesdir: ${modulesdir}

Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c	2006-03-20 21:44:59 UTC (rev 14592)
@@ -1069,5 +1069,7 @@
 
 int ldb_ildap_init(void)
 {
-	return ldb_register_backend("ldap", ildb_connect);
+	return ldb_register_backend("ldap", ildb_connect) + 
+		   ldb_register_backend("ldapi", ildb_connect) + 
+		   ldb_register_backend("ldaps", ildb_connect);
 }

Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_ldap/ldb_ldap.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_ldap/ldb_ldap.c	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_ldap/ldb_ldap.c	2006-03-20 21:44:59 UTC (rev 14592)
@@ -1105,5 +1105,7 @@
 
 int ldb_ldap_init(void)
 {
-	return ldb_register_backend("ldap", lldb_connect);
+	return ldb_register_backend("ldap", lldb_connect) +
+		   ldb_register_backend("ldapi", lldb_connect) + 
+		   ldb_register_backend("ldaps", lldb_connect);
 }

Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c	2006-03-20 21:44:59 UTC (rev 14592)
@@ -1102,5 +1102,5 @@
 
 int ldb_tdb_init(void)
 {
-	return ldb_register_backend("tdb:", ltdb_connect);
+	return ldb_register_backend("tdb", ltdb_connect);
 }

Modified: branches/SAMBA_4_0/source/nbt_server/config.mk
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/config.mk	2006-03-20 21:44:29 UTC (rev 14591)
+++ branches/SAMBA_4_0/source/nbt_server/config.mk	2006-03-20 21:44:59 UTC (rev 14592)
@@ -13,15 +13,15 @@
 #######################
 
 #######################
-# Start MODULE libldb_wins_ldb
-[MODULE::libldb_wins_ldb]
+# Start MODULE ldb_wins_ldb
+[MODULE::ldb_wins_ldb]
 SUBSYSTEM = ldb
 INIT_FUNCTION = wins_ldb_module_init
 OBJ_FILES = \
 		wins/wins_ldb.o
 REQUIRED_SUBSYSTEMS = \
 		LIBNETIF
-# End MODULE libldb_wins_ldb
+# End MODULE ldb_wins_ldb
 #######################
 
 #######################



More information about the samba-cvs mailing list