diff options
Diffstat (limited to 'cli/src/cli-cmd-parser.c')
-rw-r--r-- | cli/src/cli-cmd-parser.c | 90 |
1 files changed, 68 insertions, 22 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index acbd960ba43..afd668ea2d2 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -1795,6 +1795,42 @@ out: return ret; } +gf_boolean_t +cli_cmd_validate_statusop (const char *arg) +{ + char *opwords[] = {"misc-details", "mem", "clients", "fd", "inode", + "callpool", NULL}; + char *w = NULL; + + w = str_getunamb (arg, opwords); + if (!w) { + gf_log ("cli", GF_LOG_ERROR, "Unknown status op %s", + arg); + return _gf_false; + } + return _gf_true; +} + +int +cli_cmd_get_statusop (const char *arg) +{ + int ret = GF_CLI_STATUS_INVAL; + if (!strcmp (arg, "misc-details")) + ret = GF_CLI_STATUS_DETAIL; + else if (!strcmp (arg, "mem")) + ret = GF_CLI_STATUS_MEM; + else if (!strcmp (arg, "clients")) + ret = GF_CLI_STATUS_CLIENTS; + else if (!strcmp (arg, "inode")) + ret = GF_CLI_STATUS_INODE; + else if (!strcmp (arg, "fd")) + ret = GF_CLI_STATUS_FD; + else if (!strcmp (arg, "callpool")) + ret = GF_CLI_STATUS_CALLPOOL; + + return ret; +} + int cli_cmd_volume_status_parse (const char **words, int wordcount, dict_t **options) @@ -1821,12 +1857,6 @@ cli_cmd_volume_status_parse (const char **words, int wordcount, cmd = GF_CLI_STATUS_ALL; ret = 0; - - } else if (!strcmp (words[2], "detail")) { - - cmd = GF_CLI_STATUS_ALL_DETAIL; - ret = 0; - } else { cmd = GF_CLI_STATUS_VOL; ret = dict_set_str (dict, "volname", (char *)words[2]); @@ -1834,34 +1864,50 @@ cli_cmd_volume_status_parse (const char **words, int wordcount, break; case 4: - if (!strcmp (words[2], "all") && - !strcmp (words[3], "detail")) { - - cmd = GF_CLI_STATUS_ALL_DETAIL; - ret = 0; - - } else if (!strcmp (words[3], "detail")) { - cmd = GF_CLI_STATUS_VOL_DETAIL; - ret = dict_set_str (dict, "volname", (char *)words[2]); - + if (!strcmp (words[2], "all")) { + cli_out ("Cannot specify brick/status-type for \"all\""); + ret = -1; + goto out; } else { - - cmd = GF_CLI_STATUS_BRICK; + cmd = GF_CLI_STATUS_VOL; ret = dict_set_str (dict, "volname", (char *)words[2]); if (ret) goto out; + } + + if (cli_cmd_validate_statusop (words[3])) { + ret = cli_cmd_get_statusop (words[3]); + if (GF_CLI_STATUS_INVAL == ret) + goto out; + cmd |= ret; + ret = 0; + } else { + cmd = GF_CLI_STATUS_BRICK; ret = dict_set_str (dict, "brick", (char *)words[3]); } break; case 5: - if (strcmp (words[4], "detail")) + if (!cli_cmd_validate_statusop (words[4])) { + ret = -1; goto out; + } - cmd = GF_CLI_STATUS_BRICK_DETAIL; - ret = dict_set_str (dict, "volname", (char *)words[2]); - if (ret) + cmd = GF_CLI_STATUS_BRICK; + ret = cli_cmd_get_statusop (words[4]); + if (GF_CLI_STATUS_INVAL == ret) + goto out; + cmd |= ret; + + if (!strcmp (words[2], "all")) { + cli_out ("Cannot specify brick/status-type for \"all\""); + ret = -1; goto out; + } else { + ret = dict_set_str (dict, "volname", (char *)words[2]); + if (ret) + goto out; + } ret = dict_set_str (dict, "brick", (char *)words[3]); break; |