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 .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2006 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
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* 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"
2006-09-01 02:21:00 +04:00
# include "toolcontext.h"
2002-11-18 17:01:16 +03:00
# include <limits.h>
# include <sys/stat.h>
# include <dlfcn.h>
2006-05-16 20:48:31 +04:00
void get_shared_library_path ( struct cmd_context * cmd , const char * libname ,
2006-05-10 01:23:51 +04:00
char * path , size_t 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 ] = = ' / ' | |
2006-05-16 20:48:31 +04:00
! ( lib_dir = find_config_tree_str ( cmd , " global/library_dir " , 0 ) ) | |
2006-08-21 16:54:53 +04:00
( dm_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 ) ;
}
2006-05-16 20:48:31 +04:00
void * load_shared_library ( struct cmd_context * cmd , const char * libname ,
2006-04-03 22:43:55 +04:00
const char * desc , int silent )
2005-08-09 21:24:21 +04:00
{
char path [ PATH_MAX ] ;
void * library ;
2006-09-01 02:21:00 +04:00
if ( cmd - > is_static ) {
log_error ( " Not loading shared %s library %s in static mode. " ,
desc , libname ) ;
return NULL ;
}
2006-05-16 20:48:31 +04:00
get_shared_library_path ( cmd , libname , path , sizeof ( path ) ) ;
2002-11-18 17:01:16 +03:00
log_very_verbose ( " Opening shared %s library %s " , desc , path ) ;
2006-07-04 23:40:27 +04:00
if ( ! ( library = dlopen ( path , RTLD_LAZY | RTLD_GLOBAL ) ) ) {
2006-04-03 22:43:55 +04:00
if ( silent & & ignorelockingfailure ( ) )
2006-07-05 21:26:36 +04:00
log_verbose ( " Unable to open external %s library %s: %s " ,
desc , path , dlerror ( ) ) ;
2006-04-03 22:43:55 +04:00
else
2006-07-04 23:40:27 +04:00
log_error ( " Unable to open external %s library %s: %s " ,
desc , path , dlerror ( ) ) ;
2006-04-03 22:43:55 +04:00
}
2002-11-18 17:01:16 +03:00
return library ;
}