#include "lib/format_text/archiver.h"
#include "lib/lvmpolld/lvmpolld-client.h"
-#ifdef HAVE_LIBDL
-#include "lib/misc/sharedlib.h"
-#endif
-
#include <locale.h>
#include <sys/stat.h>
#include <sys/syscall.h>
return 1;
}
-static int _init_single_segtype(struct cmd_context *cmd,
- struct segtype_library *seglib)
-{
- struct segment_type *(*init_segtype_fn) (struct cmd_context *);
- struct segment_type *segtype;
-
- if (!(init_segtype_fn = dlsym(seglib->lib, "init_segtype"))) {
- log_error("Shared library %s does not contain segment type "
- "functions", seglib->libname);
- return 0;
- }
-
- if (!(segtype = init_segtype_fn(seglib->cmd)))
- return_0;
-
- return lvm_register_segtype(seglib, segtype);
-}
-
static int _init_segtypes(struct cmd_context *cmd)
{
int i;
NULL
};
-#ifdef HAVE_LIBDL
- const struct dm_config_node *cn;
-#endif
-
for (i = 0; init_segtype_array[i]; i++) {
if (!(segtype = init_segtype_array[i](cmd)))
return 0;
return 0;
#endif
-#ifdef HAVE_LIBDL
- /* Load any formats in shared libs unless static */
- if (!is_static() &&
- (cn = find_config_tree_array(cmd, global_segment_libraries_CFG, NULL))) {
-
- const struct dm_config_value *cv;
- int (*init_multiple_segtypes_fn) (struct cmd_context *,
- struct segtype_library *);
-
- for (cv = cn->v; cv; cv = cv->next) {
- if (cv->type != DM_CFG_STRING) {
- log_error("Invalid string in config file: "
- "global/segment_libraries");
- return 0;
- }
- seglib.libname = cv->v.str;
- if (!(seglib.lib = load_shared_library(cmd,
- seglib.libname,
- "segment type", 0)))
- return_0;
-
- if ((init_multiple_segtypes_fn =
- dlsym(seglib.lib, "init_multiple_segtypes"))) {
- if (dlsym(seglib.lib, "init_segtype"))
- log_warn("WARNING: Shared lib %s has "
- "conflicting init fns. Using"
- " init_multiple_segtypes().",
- seglib.libname);
- } else
- init_multiple_segtypes_fn =
- _init_single_segtype;
-
- if (!init_multiple_segtypes_fn(cmd, &seglib)) {
- struct dm_list *sgtl, *tmp;
- log_error("init_multiple_segtypes() failed: "
- "Unloading shared library %s",
- seglib.libname);
- dm_list_iterate_safe(sgtl, tmp, &cmd->segtypes) {
- segtype = dm_list_item(sgtl, struct segment_type);
- if (segtype->library == seglib.lib) {
- dm_list_del(&segtype->list);
- segtype->ops->destroy(segtype);
- }
- }
- dlclose(seglib.lib);
- return_0;
- }
- }
- }
-#endif
-
return 1;
}
{
struct dm_list *sgtl, *tmp;
struct segment_type *segtype;
- void *lib;
dm_list_iterate_safe(sgtl, tmp, segtypes) {
segtype = dm_list_item(sgtl, struct segment_type);
dm_list_del(&segtype->list);
- lib = segtype->library;
segtype->ops->destroy(segtype);
-#ifdef HAVE_LIBDL
- /*
- * If no segtypes remain from this library, close it.
- */
- if (lib) {
- struct segment_type *segtype2;
- dm_list_iterate_items(segtype2, segtypes)
- if (segtype2->library == lib)
- goto skip_dlclose;
- dlclose(lib);
-skip_dlclose:
- ;
- }
-#endif
}
}
*/
#include "lib/misc/lib.h"
+#include "sharedlib.h"
#include "lib/config/config.h"
-#include "lib/misc/sharedlib.h"
#include "lib/commands/toolcontext.h"
#include <limits.h>
(void) dm_strncpy(path, libname, path_len);
}
}
-
-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)
- 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;
-}