1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/lib/misc/sharedlib.c

71 lines
2.0 KiB
C
Raw Normal View History

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.
* 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
* of the GNU Lesser General Public License v.2.1.
2004-03-30 23:35:44 +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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2002-11-18 17:01:16 +03:00
*/
#include "lib/misc/lib.h"
#include "lib/config/config.h"
#include "lib/misc/sharedlib.h"
#include "lib/commands/toolcontext.h"
2002-11-18 17:01:16 +03:00
#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)
2002-11-18 17:01:16 +03:00
{
struct stat info;
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] == '/' ||
(!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) {
(void) dm_strncpy(path, libname, path_len);
}
2005-08-09 21:24:21 +04:00
}
void *load_shared_library(struct cmd_context *cmd, const char *libname,
const char *desc, int silent)
2005-08-09 21:24:21 +04:00
{
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));
2002-11-18 17:01:16 +03:00
log_very_verbose("Opening shared %s library %s", desc, path);
if (!(library = dlopen(path, RTLD_LAZY | RTLD_GLOBAL))) {
Rework lock-override options and locking_type settings The last commit related to this was incomplete: "Implement lock-override options without locking type" This is further reworking and reduction of the locking.[ch] layer which handled all clustering, but is now only used for file locking. The "locking types" that this layer implemented were removed previously, leaving only the standard file locking. (Some cluster-related artifacts remain to be cleared out later.) Command options to override or modify locking behavior are reimplemented here without using the locking types. Also, deprecated locking_type values are recognized, and implemented as if one of the equivalent override options was set. Options that override file locking are: . --nolocking disables all file locking. . --readonly grants read lock requests without actually taking a file lock, and refuses write lock requests. . --ignorelockingfailure tries to set up file locks and uses them normally if possible. When not possible, it behaves like --readonly, but allows activation. . --sysinit is the same as ignorelockingfailure. . global/metadata_read_only acquires actual read file locks, and refuses write lock requests. (Some of these options could probably be deprecated because they were added as workarounds to various locking_type behaviors that are now deprecated.) The locking_type setting now has one valid value: 1 which refers to standard file locking. Configs that contain deprecated values are recognized and still work in largely the same way: . 0 disabled all locking, now implemented like --nolocking is set. Allow the nolocking option in all commands. . 1 is the normal file locking setting and is unchanged. . 2 was for external locking which was not used, and reverts to normal file locking. . 3 was for cluster/clvm. This reverts to normal file locking, and prints messages about lvmlockd. . 4 was equivalent to readonly, now implemented like --readonly is set. . 5 disabled all locking, now implemented like --nolocking is set.
2018-06-07 23:33:02 +03:00
if (silent)
2006-07-05 21:26:36 +04:00
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());
}
2002-11-18 17:01:16 +03:00
return library;
}