summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaushik BV <kaushikbv@gluster.com>2011-04-21 06:55:44 +0000
committerAnand Avati <avati@gluster.com>2011-04-22 03:52:24 -0700
commit49603aec03e98a2a38fad66627593b69b6269cbf (patch)
treec779d7f8be2e4477d057f17d49713fdb007639f6
parentb5848ed21b9e718011a8f3f3870c4ed978ff17a5 (diff)
cli: changes in struct cli_cmd to disable gluster command at run-time
Signed-off-by: Kaushik BV <kaushikbv@gluster.com> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2744 (make geo-replication package friendly) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2744
-rw-r--r--cli/src/cli-cmd-misc.c30
-rw-r--r--cli/src/cli-cmd-peer.c4
-rw-r--r--cli/src/cli-cmd-system.c4
-rw-r--r--cli/src/cli-cmd-volume.c7
-rw-r--r--cli/src/cli-cmd.h9
-rw-r--r--cli/src/cli.h6
-rw-r--r--cli/src/registry.c37
7 files changed, 54 insertions, 43 deletions
diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c
index 1e356c63bea..55825f6993b 100644
--- a/cli/src/cli-cmd-misc.c
+++ b/cli/src/cli-cmd-misc.c
@@ -54,23 +54,19 @@ int
cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word,
const char **words, int wordcount)
{
- struct cli_cmd *cmd = NULL;
+ struct cli_cmd *cmd[] = {volume_cmds, cli_probe_cmds,
+ cli_misc_cmds, NULL};
+ struct cli_cmd *cmd_ind = NULL;
+ int i = 0;
- for (cmd = volume_cmds; cmd->pattern; cmd++)
- cli_out ("%s - %s", cmd->pattern, cmd->desc);
-
- for (cmd = cli_probe_cmds; cmd->pattern; cmd++)
- cli_out ("%s - %s", cmd->pattern, cmd->desc);
-
- /*
- * commands for internal usage, don't expose
-
- for (cmd = cli_system_cmds; cmd->pattern; cmd++)
- cli_out ("%s - %s", cmd->pattern, cmd->desc);
+ /* cli_systerm_cmds commands for internal usage
+ they are not exposed
*/
-
- for (cmd = cli_misc_cmds; cmd->pattern; cmd++)
- cli_out ("%s - %s", cmd->pattern, cmd->desc);
+ for (i=0; cmd[i]!=NULL; i++)
+ for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++)
+ if (_gf_false == cmd_ind->disable)
+ cli_out ("%s - %s", cmd_ind->pattern,
+ cmd_ind->desc);
return 0;
}
@@ -95,8 +91,8 @@ cli_cmd_misc_register (struct cli_state *state)
struct cli_cmd *cmd = NULL;
for (cmd = cli_misc_cmds; cmd->pattern; cmd++) {
- ret = cli_cmd_register (&state->tree, cmd->pattern, cmd->cbk,
- cmd->desc);
+
+ ret = cli_cmd_register (&state->tree, cmd);
if (ret)
goto out;
}
diff --git a/cli/src/cli-cmd-peer.c b/cli/src/cli-cmd-peer.c
index c931341c38b..11d029bf1c6 100644
--- a/cli/src/cli-cmd-peer.c
+++ b/cli/src/cli-cmd-peer.c
@@ -224,8 +224,8 @@ cli_cmd_probe_register (struct cli_state *state)
struct cli_cmd *cmd = NULL;
for (cmd = cli_probe_cmds; cmd->pattern; cmd++) {
- ret = cli_cmd_register (&state->tree, cmd->pattern, cmd->cbk,
- cmd->desc);
+
+ ret = cli_cmd_register (&state->tree, cmd);
if (ret)
goto out;
}
diff --git a/cli/src/cli-cmd-system.c b/cli/src/cli-cmd-system.c
index 36300248909..2dff572fda7 100644
--- a/cli/src/cli-cmd-system.c
+++ b/cli/src/cli-cmd-system.c
@@ -221,8 +221,8 @@ cli_cmd_system_register (struct cli_state *state)
struct cli_cmd *cmd = NULL;
for (cmd = cli_system_cmds; cmd->pattern; cmd++) {
- ret = cli_cmd_register (&state->tree, cmd->pattern, cmd->cbk,
- cmd->desc);
+
+ ret = cli_cmd_register (&state->tree, cmd);
if (ret)
goto out;
}
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index 55044b33aa5..e49b8f23011 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -1194,7 +1194,8 @@ cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
struct cli_cmd *cmd = NULL;
for (cmd = volume_cmds; cmd->pattern; cmd++)
- cli_out ("%s - %s", cmd->pattern, cmd->desc);
+ if (_gf_false == cmd->disable)
+ cli_out ("%s - %s", cmd->pattern, cmd->desc);
return 0;
}
@@ -1206,8 +1207,8 @@ cli_cmd_volume_register (struct cli_state *state)
struct cli_cmd *cmd = NULL;
for (cmd = volume_cmds; cmd->pattern; cmd++) {
- ret = cli_cmd_register (&state->tree, cmd->pattern, cmd->cbk,
- cmd->desc);
+
+ ret = cli_cmd_register (&state->tree, cmd);
if (ret)
goto out;
}
diff --git a/cli/src/cli-cmd.h b/cli/src/cli-cmd.h
index ee784f0e95b..acb40017a5b 100644
--- a/cli/src/cli-cmd.h
+++ b/cli/src/cli-cmd.h
@@ -33,9 +33,12 @@ typedef enum {
} gf_answer_t;
struct cli_cmd {
- const char *pattern;
- cli_cmd_cbk_t *cbk;
- const char *desc;
+ const char *pattern;
+ cli_cmd_cbk_t *cbk;
+ const char *desc;
+ cli_cmd_reg_cbk_t *reg_cbk; /* callback to check in runtime if the *
+ * command should be enabled or disabled */
+ gf_boolean_t disable;
};
struct cli_cmd_volume_get_ctx_ {
diff --git a/cli/src/cli.h b/cli/src/cli.h
index f365da70f81..70d6cfb271a 100644
--- a/cli/src/cli.h
+++ b/cli/src/cli.h
@@ -46,11 +46,14 @@ enum argp_option_keys {
struct cli_state;
struct cli_cmd_word;
struct cli_cmd_tree;
+struct cli_cmd;
typedef int (cli_cmd_cbk_t)(struct cli_state *state,
struct cli_cmd_word *word,
const char **words,
int wordcount);
+typedef void (cli_cmd_reg_cbk_t)( struct cli_cmd *this);
+
typedef int (cli_cmd_match_t)(struct cli_cmd_word *word);
typedef int (cli_cmd_filler_t)(struct cli_cmd_word *word);
@@ -147,8 +150,7 @@ typedef ssize_t (*cli_serialize_t) (struct iovec outmsg, void *args);
extern struct cli_state *global_state; /* use only in readline callback */
-int cli_cmd_register (struct cli_cmd_tree *tree, const char *template,
- cli_cmd_cbk_t cbk, const char *desc);
+int cli_cmd_register (struct cli_cmd_tree *tree, struct cli_cmd *cmd);
int cli_cmds_register (struct cli_state *state);
int cli_input_init (struct cli_state *state);
diff --git a/cli/src/registry.c b/cli/src/registry.c
index a65e26ecaee..8fa116a48c7 100644
--- a/cli/src/registry.c
+++ b/cli/src/registry.c
@@ -362,31 +362,40 @@ cli_cmd_ingest (struct cli_cmd_tree *tree, char **tokens, cli_cmd_cbk_t *cbkfn,
int
-cli_cmd_register (struct cli_cmd_tree *tree, const char *template,
- cli_cmd_cbk_t cbk, const char *desc)
+cli_cmd_register (struct cli_cmd_tree *tree, struct cli_cmd *cmd)
{
char **tokens = NULL;
int ret = 0;
- if (!template)
- return -1;
+ GF_ASSERT (cmd)
- tokens = cli_cmd_tokenize (template);
- if (!tokens)
- return -1;
+ if (cmd->reg_cbk)
+ cmd->reg_cbk (cmd);
- ret = cli_cmd_ingest (tree, tokens, cbk, desc, template);
- if (ret)
- goto err;
+ if (cmd->disable) {
+ ret = 0;
+ goto out;
+ }
- if (tokens)
- cli_cmd_tokens_destroy (tokens);
+ tokens = cli_cmd_tokenize (cmd->pattern);
+ if (!tokens) {
+ ret = -1;
+ goto out;
+ }
- return 0;
-err:
+ ret = cli_cmd_ingest (tree, tokens, cmd->cbk, cmd->desc, cmd->pattern);
+ if (ret) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = 0;
+
+out:
if (tokens)
cli_cmd_tokens_destroy (tokens);
+ gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
return ret;
}