Add initial vesion of new module system
authorJelmer Vernooij <jelmer@samba.org>
Wed, 30 Oct 2002 11:52:36 +0000 (11:52 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Wed, 30 Oct 2002 11:52:36 +0000 (11:52 +0000)
(This used to be commit b5d05d3ec6808465d27e15db2a9ff48804e2e78e)

source3/Makefile.in
source3/lib/module.c [new file with mode: 0644]

index f0cf3864a8f94929ca3c1821cb6d1a91f0a57d53..589b1a602b8027bc3056c0019565c8431892ce26 100644 (file)
@@ -141,7 +141,8 @@ LIB_OBJ = lib/charcnv.o lib/debug.o lib/fault.o \
          lib/md5.o lib/hmacmd5.o lib/iconv.o lib/smbpasswd.o \
          nsswitch/wb_client.o nsswitch/wb_common.o \
          lib/pam_errors.o intl/lang_tdb.o lib/account_pol.o \
-         lib/adt_tree.o lib/popt_common.o lib/gencache.o $(TDB_OBJ) 
+         lib/adt_tree.o lib/popt_common.o lib/gencache.o $(TDB_OBJ) \
+         lib/module.o
 
 LIB_SMBD_OBJ = lib/system_smbd.o lib/util_smbd.o
 
diff --git a/source3/lib/module.c b/source3/lib/module.c
new file mode 100644 (file)
index 0000000..e4d22e0
--- /dev/null
@@ -0,0 +1,63 @@
+/* 
+   Unix SMB/CIFS implementation.
+   module loading system
+
+   Copyright (C) Jelmer Vernooij 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_DLOPEN
+NTSTATUS smb_load_module(const char *module_name)
+{
+       void *handle;
+       init_module_function *init;
+
+       /* Always try to use LAZY symbol resolving; if the plugin has 
+        * backwards compatibility, there might be symbols in the 
+        * plugin referencing to old (removed) functions
+        */
+       handle = dlopen(module_name, RTLD_LAZY | RTLD_GLOBAL);
+
+       if(!handle) {
+               DEBUG(0, ("Error loading module '%s': %s\n", module_name, sys_dlerror()));
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       init = sys_dlsym(handle, "init_module");
+
+       if(!init) {
+               DEBUG(0, ("Error trying to resolve symbol 'init_module' in %s: %s\n", module_name, sys_dlerror()));
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       init();
+
+       DEBUG(2, ("Module '%s' loaded\n", module_name));
+
+       return NT_STATUS_OK;
+}
+
+#else /* HAVE_DLOPEN */
+
+NTSTATUS smb_load_module(const char *module_name)
+{
+       DEBUG(0,("This samba executable has not been build with plugin support"));
+       return NT_STATUS_NOT_SUPPORTED;
+}
+
+#endif /* HAVE_DLOPEN */