2002-10-30 14:52:36 +03:00
/*
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 0213 9 , USA .
*/
# include "includes.h"
# ifdef HAVE_DLOPEN
2003-04-15 02:23:02 +04:00
int smb_load_module ( const char * module_name )
2002-10-30 14:52:36 +03:00
{
void * handle ;
init_module_function * init ;
2003-04-15 02:23:02 +04:00
int status ;
2003-01-18 00:23:14 +03:00
const char * error ;
2002-10-30 14:52:36 +03:00
/* 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
*/
2002-10-30 20:50:36 +03:00
handle = sys_dlopen ( module_name , RTLD_LAZY ) ;
2002-10-30 14:52:36 +03:00
if ( ! handle ) {
DEBUG ( 0 , ( " Error loading module '%s': %s \n " , module_name , sys_dlerror ( ) ) ) ;
2003-04-15 02:23:02 +04:00
return False ;
2002-10-30 14:52:36 +03:00
}
init = sys_dlsym ( handle , " init_module " ) ;
2003-01-18 00:23:14 +03:00
/* we must check sys_dlerror() to determine if it worked, because
sys_dlsym ( ) can validly return NULL */
error = sys_dlerror ( ) ;
if ( error ) {
DEBUG ( 0 , ( " Error trying to resolve symbol 'init_module' in %s: %s \n " , module_name , error ) ) ;
2003-04-15 02:23:02 +04:00
return False ;
2002-10-30 14:52:36 +03:00
}
2003-04-15 02:23:02 +04:00
status = init ( ) ;
2002-10-30 14:52:36 +03:00
DEBUG ( 2 , ( " Module '%s' loaded \n " , module_name ) ) ;
2003-04-15 02:23:02 +04:00
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 */
2003-04-24 23:47:37 +04:00
if ( module [ 0 ] = = ' / ' ) return smb_load_module ( module ) ;
2003-04-15 02:23:02 +04:00
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 ) ;
2002-10-30 14:52:36 +03:00
}
# else /* HAVE_DLOPEN */
2003-04-15 02:23:02 +04:00
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 )
2002-10-30 14:52:36 +03:00
{
2003-04-15 02:23:02 +04:00
DEBUG ( 0 , ( " This samba executable has not been built with plugin support, not probing " ) ) ;
return False ;
2002-10-30 14:52:36 +03:00
}
# endif /* HAVE_DLOPEN */
2003-04-15 02:23:02 +04:00
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 ' ;
}
}
}