1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

lib/util: Add smb_load_module that returns DEBUG(0) errors on failure

These errors are very important when trying to work out why a module
does not load, and this rework allows them to be shown when loading
vfs modules.

Andrew Bartlett
This commit is contained in:
Andrew Bartlett 2012-04-03 13:22:41 +10:00
parent c7a3b8ae21
commit 4d53e7c2ba
2 changed files with 40 additions and 39 deletions

View File

@ -159,13 +159,42 @@ init_module_fn *load_samba_modules(TALLOC_CTX *mem_ctx, const char *subsystem)
/* Load a dynamic module. Only log a level 0 error if we are not checking
for the existence of a module (probling). */
static NTSTATUS do_smb_load_module(const char *module_name, bool is_probe)
static NTSTATUS do_smb_load_module(const char *subsystem,
const char *module_name, bool is_probe)
{
void *handle;
init_module_fn init;
NTSTATUS status;
init = load_module(module_name, is_probe, &handle);
char *full_path = NULL;
TALLOC_CTX *ctx = talloc_stackframe();
/* Check for absolute path */
/* if we make any 'samba multibyte string'
calls here, we break
for loading string modules */
DEBUG(5, ("%s module '%s'\n", is_probe ? "Probing" : "Loading", module_name));
if (subsystem && module_name[0] != '/') {
full_path = talloc_asprintf(ctx,
"%s/%s.%s",
modules_path(ctx, subsystem),
module_name,
shlib_ext());
if (!full_path) {
TALLOC_FREE(ctx);
return NT_STATUS_NO_MEMORY;
}
DEBUG(5, ("%s module '%s': Trying to load from %s\n",
is_probe ? "Probing": "Loading", module_name, full_path));
init = load_module(full_path, is_probe, &handle);
} else {
init = load_module(module_name, is_probe, &handle);
}
if (!init) {
return NT_STATUS_UNSUCCESSFUL;
}
@ -175,7 +204,7 @@ static NTSTATUS do_smb_load_module(const char *module_name, bool is_probe)
status = init();
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("Module '%s' initialization failed: %s\n",
module_name, get_friendly_nt_error_msg(status)));
module_name, get_friendly_nt_error_msg(status)));
dlclose(handle);
}
@ -190,7 +219,7 @@ int smb_load_modules(const char **modules)
int success = 0;
for(i = 0; modules[i]; i++){
if(NT_STATUS_IS_OK(do_smb_load_module(modules[i], false))) {
if(NT_STATUS_IS_OK(do_smb_load_module(NULL, modules[i], false))) {
success++;
}
}
@ -202,39 +231,10 @@ int smb_load_modules(const char **modules)
NTSTATUS smb_probe_module(const char *subsystem, const char *module)
{
char *full_path = NULL;
TALLOC_CTX *ctx = talloc_stackframe();
NTSTATUS status;
/* Check for absolute path */
/* if we make any 'samba multibyte string'
calls here, we break
for loading string modules */
DEBUG(5, ("Probing module '%s'\n", module));
if (module[0] == '/') {
status = do_smb_load_module(module, true);
TALLOC_FREE(ctx);
return status;
}
full_path = talloc_asprintf(ctx,
"%s/%s.%s",
modules_path(ctx, subsystem),
module,
shlib_ext());
if (!full_path) {
TALLOC_FREE(ctx);
return NT_STATUS_NO_MEMORY;
}
DEBUG(5, ("Probing module '%s': Trying to load from %s\n",
module, full_path));
status = do_smb_load_module(full_path, true);
TALLOC_FREE(ctx);
return status;
return do_smb_load_module(subsystem, module, true);
}
NTSTATUS smb_load_module(const char *subsystem, const char *module)
{
return do_smb_load_module(subsystem, module, false);
}

View File

@ -55,5 +55,6 @@ init_module_fn *load_samba_modules(TALLOC_CTX *mem_ctx, const char *subsystem);
int smb_load_modules(const char **modules);
NTSTATUS smb_probe_module(const char *subsystem, const char *module);
NTSTATUS smb_load_module(const char *subsystem, const char *module);
#endif /* _SAMBA_MODULES_H */