2002-11-18 17:01:16 +03:00
/*
2008-01-30 17:00:02 +03: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 ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2002-11-18 17:01:16 +03:00
*/
# include "lib.h"
# include "config.h"
2002-12-20 02:25:55 +03:00
# include "sharedlib.h"
2013-12-06 19:35:54 +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 ;
2016-02-23 21:54:19 +03:00
if ( ! path_len )
return ;
2002-11-18 17:01:16 +03:00
/* If libname doesn't begin with '/' then use lib_dir/libname,
* if present */
if ( libname [ 0 ] = = ' / ' | |
2016-02-23 21:54:19 +03:00
( ! cmd - > lib_dir & &
2013-12-06 19:35:54 +04:00
! ( cmd - > lib_dir = find_config_tree_str ( cmd , global_library_dir_CFG , NULL ) ) ) | |
( dm_snprintf ( path , path_len , " %s/%s " , cmd - > lib_dir ,
2012-02-08 15:05:04 +04:00
libname ) = = - 1 ) | | stat ( path , & info ) = = - 1 ) {
strncpy ( path , libname , path_len - 1 ) ;
path [ path_len - 1 ] = ' \0 ' ;
}
2005-08-09 21:24:21 +04:00
}
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 ;
2008-12-18 08:27:17 +03:00
if ( is_static ( ) ) {
2006-09-01 02:21:00 +04:00
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 ;
}