| /* |
| * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved. |
| * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. |
| * |
| * This file is part of LVM2. |
| * |
| * 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 Lesser General Public License v.2.1. |
| * |
| * You should have received a copy of the GNU Lesser 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 |
| */ |
| |
| #include "lib.h" |
| #include "config.h" |
| #include "sharedlib.h" |
| #include "toolcontext.h" |
| |
| #include <limits.h> |
| #include <sys/stat.h> |
| #include <dlfcn.h> |
| |
| void get_shared_library_path(struct cmd_context *cmd, const char *libname, |
| char *path, size_t path_len) |
| { |
| struct stat info; |
| |
| /* If libname doesn't begin with '/' then use lib_dir/libname, |
| * if present */ |
| if (libname[0] == '/' || |
| (!cmd->lib_dir && |
| !(cmd->lib_dir = find_config_tree_str(cmd, global_library_dir_CFG, NULL))) || |
| (dm_snprintf(path, path_len, "%s/%s", cmd->lib_dir, |
| libname) == -1) || stat(path, &info) == -1) { |
| strncpy(path, libname, path_len - 1); |
| path[path_len - 1] = '\0'; |
| } |
| } |
| |
| void *load_shared_library(struct cmd_context *cmd, const char *libname, |
| const char *desc, int silent) |
| { |
| char path[PATH_MAX]; |
| void *library; |
| |
| if (is_static()) { |
| log_error("Not loading shared %s library %s in static mode.", |
| desc, libname); |
| return NULL; |
| } |
| |
| get_shared_library_path(cmd, libname, path, sizeof(path)); |
| |
| log_very_verbose("Opening shared %s library %s", desc, path); |
| |
| if (!(library = dlopen(path, RTLD_LAZY | RTLD_GLOBAL))) { |
| if (silent && ignorelockingfailure()) |
| log_verbose("Unable to open external %s library %s: %s", |
| desc, path, dlerror()); |
| else |
| log_error("Unable to open external %s library %s: %s", |
| desc, path, dlerror()); |
| } |
| |
| return library; |
| } |