2002-11-18 17:01:16 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2002 - 2004 Sistina Software , Inc . All rights reserved .
* Copyright ( C ) 2004 Red Hat , Inc . All rights reserved .
2002-11-18 17:01:16 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2002-11-18 17:01:16 +03:00
*
2004-03-30 23:35:44 +04:00
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU General Public License v .2 .
*
* 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 . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2002-11-18 17:01:16 +03:00
*/
# include "lib.h"
# include "config.h"
# include "lvm-string.h"
2002-12-20 02:25:55 +03:00
# include "sharedlib.h"
2002-11-18 17:01:16 +03:00
# include <limits.h>
# include <sys/stat.h>
# include <dlfcn.h>
2005-08-09 21:24:21 +04:00
static void _get_library_path ( struct config_tree * cft , const char * libname ,
char * path , int path_len )
2002-11-18 17:01:16 +03:00
{
struct stat info ;
const char * lib_dir ;
/* If libname doesn't begin with '/' then use lib_dir/libname,
* if present */
if ( libname [ 0 ] = = ' / ' | |
2004-03-08 21:28:45 +03:00
! ( lib_dir = find_config_str ( cft - > root , " global/library_dir " , 0 ) ) | |
2005-08-09 21:24:21 +04:00
( lvm_snprintf ( path , path_len , " %s/%s " , lib_dir ,
2002-11-18 17:01:16 +03:00
libname ) = = - 1 ) | | stat ( path , & info ) = = - 1 )
2005-08-09 21:24:21 +04:00
strncpy ( path , libname , path_len ) ;
}
void * load_shared_library ( struct config_tree * cft , const char * libname ,
const char * desc )
{
char path [ PATH_MAX ] ;
void * library ;
_get_library_path ( cft , libname , path , sizeof ( path ) ) ;
2002-11-18 17:01:16 +03:00
log_very_verbose ( " Opening shared %s library %s " , desc , path ) ;
if ( ! ( library = dlopen ( path , RTLD_LAZY ) ) )
log_error ( " Unable to open external %s library %s " , desc , path ) ;
return library ;
}