summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/xlator.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/xlator.c')
-rw-r--r--libglusterfs/src/xlator.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 7409052023e..5c526acd545 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -1170,7 +1170,64 @@ xlator_set_type_virtual (xlator_t *xl, const char *type)
out:
return -1;
}
+int32_t
+xlator_volopt_dynload (char *xlator_type, void **dl_handle,
+ volume_opt_list_t *opt_list)
+{
+ int ret = -1;
+ char *name = NULL;
+ void *handle = NULL;
+ volume_opt_list_t *vol_opt = NULL;
+
+ GF_VALIDATE_OR_GOTO ("xlator", xlator_type, out);
+
+ GF_ASSERT (dl_handle);
+
+ if (*dl_handle)
+ if (dlclose (*dl_handle))
+ gf_log ("xlator", GF_LOG_WARNING, "Unable to close "
+ "previously opened handle( may be stale)."
+ "Ignoring the invalid handle");
+
+ ret = gf_asprintf (&name, "%s/%s.so", XLATORDIR, xlator_type);
+ if (-1 == ret) {
+ gf_log ("xlator", GF_LOG_ERROR, "asprintf failed");
+ goto out;
+ }
+
+ ret = -1;
+
+ gf_log ("xlator", GF_LOG_TRACE, "attempt to load file %s", name);
+
+ handle = dlopen (name, RTLD_NOW|RTLD_GLOBAL);
+ if (!handle) {
+ gf_log ("xlator", GF_LOG_WARNING, "%s", dlerror ());
+ goto out;
+ }
+ *dl_handle = handle;
+
+ vol_opt = GF_CALLOC (1, sizeof (volume_opt_list_t),
+ gf_common_mt_volume_opt_list_t);
+
+ if (!vol_opt) {
+ goto out;
+ }
+
+ if (!(vol_opt->given_opt = dlsym (handle, "options"))) {
+ dlerror ();
+ gf_log ("xlator", GF_LOG_DEBUG,
+ "Strict option validation not enforced -- neglecting");
+ }
+ list_add (&vol_opt->list, &opt_list->list);
+
+ ret = 0;
+ out:
+ if (name)
+ GF_FREE (name);
+ gf_log ("xlator", GF_LOG_DEBUG, "Returning %d", ret);
+ return ret;
+}
int32_t
xlator_dynload (xlator_t *xl)
@@ -1845,3 +1902,51 @@ glusterd_check_log_level (const char *value)
return log_level;
}
+
+int
+xlator_get_volopt_info (struct list_head *opt_list, char *key, char **def_val,
+ char **descr)
+{
+
+ int index = 0;
+ int ret = -1;
+ volume_opt_list_t *vol_list = NULL;
+ volume_option_t *opt = NULL;
+
+ if (!opt_list || !key || !def_val ) {
+ gf_log ("", GF_LOG_WARNING, " Parameters to the function not "
+ "valid");
+ ret = -1;
+ goto out;
+ }
+
+ if (list_empty (opt_list)) {
+ gf_log ("xlator", GF_LOG_WARNING, "No elements in Volume option"
+ " list");
+ ret = -1;
+ goto out;
+ }
+
+
+ vol_list = list_entry (opt_list->next, volume_opt_list_t, list);
+
+ opt = vol_list->given_opt;
+
+ for (index = 0; opt[index].key && opt[index].key[0] ; index++) {
+ if (strncmp (key, opt[index].key[0], strlen (key)))
+ continue;
+
+ *def_val = opt[index].default_value;
+ if (descr)
+ *descr = opt[index].description;
+ ret = 0;
+ goto out;
+ }
+
+ ret = -1;
+
+out:
+ gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);
+ return ret;
+
+}