diff options
| author | Kaushik BV <kaushikbv@gluster.com> | 2011-08-16 13:10:41 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-08-18 22:42:48 -0700 | 
| commit | ce0aaba383b97dca52d11c18846a8154d529bf8a (patch) | |
| tree | 494673947140ddded481e4532ce6c340eac09446 /libglusterfs/src | |
| parent | b7596882b3ceba77bd812d2e5757d9fa3aa0fa17 (diff) | |
mgmt/Glusterd: Implementation volume set help/help-xml
Change-Id: I0c54fd1c15550e5e5551e95ed32adb14d8029fab
Reviewed-on: http://review.gluster.com/238
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@gluster.com>
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/xlator.c | 105 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.h | 8 | 
2 files changed, 110 insertions, 3 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; + +} diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 044bfff95b6..1ecde5d5f79 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -786,6 +786,7 @@ typedef struct volume_options {          char                *value[ZR_OPTION_MAX_ARRAY_SIZE];          /* If specified, will check for one of             the value from this array */ +        char                *default_value;          char                *description; /* about the key */  } volume_option_t; @@ -881,7 +882,8 @@ int _volume_option_value_validate_attacherr (xlator_t *xl,                                 data_pair_t *pair,                                  volume_option_t *opt,                                  char **op_errstr); - - - +int32_t xlator_volopt_dynload (char *xlator_type, void **dl_handle, +                    volume_opt_list_t *vol_opt_handle); +int xlator_get_volopt_info (struct list_head *opt_list, char *key, +                            char **def_val, char **descr);  #endif /* _XLATOR_H */  | 
