From 7fcbdf00f6bba44d44e560176468605311e81d67 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 14 Apr 2003 22:23:02 +0000 Subject: Add some more functions for the modules (backport from HEAD): - init_modules() - smb_probe_module() (This used to be commit b3328dab2fa069af300b4076695bf6c359501111) --- source3/include/smb.h | 2 +- source3/lib/module.c | 97 +++++++++++++++++++++++++++++++++++++++++++----- source3/param/loadparm.c | 4 ++ source3/utils/testparm.c | 6 +++ 4 files changed, 99 insertions(+), 10 deletions(-) diff --git a/source3/include/smb.h b/source3/include/smb.h index bc107073ab..d8ca9bde05 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1718,6 +1718,6 @@ typedef struct { #include "popt_common.h" /* Module support */ -typedef NTSTATUS (init_module_function) (void); +typedef int (init_module_function) (void); #endif /* _SMB_H */ diff --git a/source3/lib/module.c b/source3/lib/module.c index 2498f6de2c..763a5c2b2d 100644 --- a/source3/lib/module.c +++ b/source3/lib/module.c @@ -22,11 +22,11 @@ #include "includes.h" #ifdef HAVE_DLOPEN -NTSTATUS smb_load_module(const char *module_name) +int smb_load_module(const char *module_name) { void *handle; init_module_function *init; - NTSTATUS nt_status; + int status; const char *error; /* Always try to use LAZY symbol resolving; if the plugin has @@ -37,7 +37,7 @@ NTSTATUS smb_load_module(const char *module_name) if(!handle) { DEBUG(0, ("Error loading module '%s': %s\n", module_name, sys_dlerror())); - return NT_STATUS_UNSUCCESSFUL; + return False; } init = sys_dlsym(handle, "init_module"); @@ -47,22 +47,101 @@ NTSTATUS smb_load_module(const char *module_name) error = sys_dlerror(); if (error) { DEBUG(0, ("Error trying to resolve symbol 'init_module' in %s: %s\n", module_name, error)); - return NT_STATUS_UNSUCCESSFUL; + return False; } - nt_status = init(); + status = init(); DEBUG(2, ("Module '%s' loaded\n", module_name)); - return nt_status; + return status; +} + +/* Load all modules in list and return number of + * modules that has been successfully loaded */ +int smb_load_modules(const char **modules) +{ + int i; + int success = 0; + + for(i = 0; modules[i]; i++){ + if(smb_load_module(modules[i])) { + success++; + } + } + + DEBUG(2, ("%d modules successfully loaded\n", success)); + + return success; +} + +int smb_probe_module(const char *subsystem, const char *module) +{ + pstring full_path; + + /* Check for absolute path */ + if(strchr_m(module, '/'))return smb_load_module(module); + + pstrcpy(full_path, lib_path(subsystem)); + pstrcat(full_path, "/"); + pstrcat(full_path, module); + pstrcat(full_path, "."); + pstrcat(full_path, shlib_ext()); + + DEBUG(5, ("Probing module %s: Trying to load from %s\n", module, full_path)); + + return smb_load_module(full_path); } #else /* HAVE_DLOPEN */ -NTSTATUS smb_load_module(const char *module_name) +int smb_load_module(const char *module_name) +{ + DEBUG(0,("This samba executable has not been built with plugin support")); + return False; +} + +int smb_load_modules(const char **modules) +{ + DEBUG(0,("This samba executable has not been built with plugin support")); + return False; +} + +int smb_probe_module(const char *subsystem, const char *module) { - DEBUG(0,("This samba executable has not been build with plugin support")); - return NT_STATUS_NOT_SUPPORTED; + DEBUG(0,("This samba executable has not been built with plugin support, not probing")); + return False; } #endif /* HAVE_DLOPEN */ + +void init_modules(void) +{ + /* FIXME: This can cause undefined symbol errors : + * smb_register_vfs() isn't available in nmbd, for example */ + if(lp_preload_modules()) + smb_load_modules(lp_preload_modules()); +} + + +/************************************************************************* + * This functions /path/to/foobar.so -> foobar + ************************************************************************/ +void module_path_get_name(const char *path, pstring name) +{ + char *s; + + /* First, make the path relative */ + s = strrchr(path, '/'); + if(s) pstrcpy(name, s+1); + else pstrcpy(name, path); + + if (dyn_SHLIBEXT && *dyn_SHLIBEXT && strlen(dyn_SHLIBEXT) < strlen(name)) { + int n = strlen(name) - strlen(dyn_SHLIBEXT); + + /* Remove extension if necessary */ + if (name[n-1] == '.' && !strcmp(name+n, dyn_SHLIBEXT)) { + name[n-1] = '\0'; + } + } +} diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 8624b30af8..821216837e 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -111,6 +111,8 @@ typedef struct char *szSMBPasswdFile; char *szPrivateDir; char **szPassdbBackend; + char **szPreloadModules; + char **szSamBackend; char *szPasswordServer; char *szSocketOptions; char *szRealm; @@ -813,6 +815,7 @@ static struct parm_struct parm_table[] = { {"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_HIDE}, {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER}, {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE}, + {"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_BASIC | FLAG_GLOBAL}, {"Logging Options", P_SEP, P_SEPARATOR}, @@ -1603,6 +1606,7 @@ FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName) static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion) FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases) FN_GLOBAL_LIST(lp_passdb_backend, &Globals.szPassdbBackend) +FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules) FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction) FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript) FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript) diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index 5f3a7de1c7..56d13a5fd9 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -177,6 +177,12 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_ printf("'algorithmic rid base' must be even.\n"); } +#ifndef HAVE_DLOPEN + if (lp_preload_modules()) { + printf("WARNING: 'preload modules = ' set while loading plugins not supported.\n"); + } +#endif + return ret; } -- cgit