]> sourceware.org Git - lvm2.git/commitdiff
liblvm: allow config settings to be read without full lvm cmd
authorDavid Teigland <teigland@redhat.com>
Tue, 17 May 2016 16:54:13 +0000 (11:54 -0500)
committerDavid Teigland <teigland@redhat.com>
Wed, 18 May 2016 14:04:25 +0000 (09:04 -0500)
A program may be using liblvm2app for simply checking a config
setting in lvm.conf.  In this case, a full lvm context is not
needed, only cmd->cft (which are the config settings read from
lvm.conf).

lvm_config_find_bool() can now be passed a NULL lvm context
in which case it will only create cmd->cft, check the config
setting asked for, and destroy the cmd.

lib/commands/toolcontext.c
lib/commands/toolcontext.h
liblvm/lvm_base.c

index 90e5d5adc29585891f81d917d084c311fabf884c..1e3f14a796753e507772a43af7fa3559ceb8f294 100644 (file)
@@ -1776,6 +1776,49 @@ bad:
        return 0;
 }
 
+void destroy_config_context(struct cmd_context *cmd)
+{
+       _destroy_config(cmd);
+
+       if (cmd->mem)
+               dm_pool_destroy(cmd->mem);
+       if (cmd->libmem)
+               dm_pool_destroy(cmd->libmem);
+
+       dm_free(cmd);
+}
+
+/*
+ * A "config context" is a very light weight toolcontext that
+ * is only used for reading config settings from lvm.conf.
+ */
+struct cmd_context *create_config_context(void)
+{
+       struct cmd_context *cmd;
+
+       if (!(cmd = dm_zalloc(sizeof(*cmd))))
+               goto_out;
+
+       strcpy(cmd->system_dir, DEFAULT_SYS_DIR);
+
+       if (!_get_env_vars(cmd))
+               goto_out;
+
+       if (!(cmd->libmem = dm_pool_create("library", 4 * 1024)))
+               goto_out;
+
+       dm_list_init(&cmd->config_files);
+
+       if (!_init_lvm_conf(cmd))
+               goto_out;
+
+       return cmd;
+out:
+       if (cmd)
+               destroy_config_context(cmd);
+       return NULL;
+}
+
 /* Entry point */
 struct cmd_context *create_toolcontext(unsigned is_long_lived,
                                       const char *system_dir,
index c3b9b2ea5c1d76890a3c2b3f4948a94b56347237..2cecf2751c31b87d8cd00980c5f3baea4c536d2b 100644 (file)
@@ -218,6 +218,14 @@ int init_lvmcache_orphans(struct cmd_context *cmd);
 int init_filters(struct cmd_context *cmd, unsigned load_persistent_cache);
 int init_connections(struct cmd_context *cmd);
 
+/*
+ * A config context is a very light weight cmd struct that
+ * is only used for reading config settings from lvm.conf,
+ * which are at cmd->cft.
+ */
+struct cmd_context *create_config_context(void);
+void destroy_config_context(struct cmd_context *cmd);
+
 struct format_type *get_format_by_name(struct cmd_context *cmd, const char *format);
 
 const char *system_id_from_string(struct cmd_context *cmd, const char *str);
index 8b4def27111b00ba90d8b9d1f0392c32f5a8bc09..fce994cfdbaa8513e14629aa24544175b258bdd0 100644 (file)
@@ -126,14 +126,31 @@ int lvm_config_override(lvm_t libh, const char *config_settings)
        return rc;
 }
 
+/*
+ * When full lvm connection is not being used, libh can be NULL
+ * and this command will internally create a single-use, light-weight
+ * cmd struct that only has cmd->cft populated from lvm.conf.
+ */
 int lvm_config_find_bool(lvm_t libh, const char *config_path, int fail)
 {
        int rc = 0;
-       struct cmd_context *cmd = (struct cmd_context *)libh;
-       struct saved_env e = store_user_env((struct cmd_context *)libh);
+       struct cmd_context *cmd;
+       struct saved_env e;
+
+       if (libh) {
+               cmd = (struct cmd_context *)libh;
+               e = store_user_env((struct cmd_context *)libh);
+       } else {
+               if (!(cmd = create_config_context()))
+                       return 0;
+       }
 
        rc = dm_config_tree_find_bool(cmd->cft, config_path, fail);
-       restore_user_env(&e);
+
+       if (libh)
+               restore_user_env(&e);
+       else
+               destroy_config_context(cmd);
        return rc;
 }
 
This page took 0.033629 seconds and 5 git commands to generate.