diff options
| author | Andrew Bartlett <abartlet@samba.org> | 2012-04-03 13:22:41 +1000 | 
|---|---|---|
| committer | Andrew Bartlett <abartlet@samba.org> | 2012-04-03 14:25:12 +1000 | 
| commit | 4d53e7c2ba59d4572a6198785e49eeaf88cd1a02 (patch) | |
| tree | b58ba928ed5c73ac5c0e408e5997d50080853092 /lib | |
| parent | c7a3b8ae21523f6af2c3e3fea1a0d3fcf9706d4c (diff) | |
| download | samba-4d53e7c2ba59d4572a6198785e49eeaf88cd1a02.tar.gz samba-4d53e7c2ba59d4572a6198785e49eeaf88cd1a02.tar.bz2 samba-4d53e7c2ba59d4572a6198785e49eeaf88cd1a02.zip  | |
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
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/util/modules.c | 76 | ||||
| -rw-r--r-- | lib/util/samba_modules.h | 1 | 
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 */  | 
