summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/modules.c76
-rw-r--r--lib/util/samba_modules.h1
2 files changed, 39 insertions, 38 deletions
diff --git a/lib/util/modules.c b/lib/util/modules.c
index 52a04be457..05d1dac50f 100644
--- a/lib/util/modules.c
+++ b/lib/util/modules.c
@@ -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);
+ return do_smb_load_module(subsystem, module, true);
+}
- TALLOC_FREE(ctx);
- return status;
+NTSTATUS smb_load_module(const char *subsystem, const char *module)
+{
+ return do_smb_load_module(subsystem, module, false);
}
diff --git a/lib/util/samba_modules.h b/lib/util/samba_modules.h
index 5eb2a0dd1c..2f40811929 100644
--- a/lib/util/samba_modules.h
+++ b/lib/util/samba_modules.h
@@ -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 */