summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>2011-09-06 18:01:20 -0700
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>2011-09-06 18:01:34 -0700
commit22867fedcca3a7f35c6fced3d363306309b40673 (patch)
tree720e9706aa9ae150a348eedc877cb54ea207276a
parent4fa647b1f4e0c991d5c4de881ccdb5e260c04548 (diff)
downloadceph-22867fedcca3a7f35c6fced3d363306309b40673.tar.gz
rbd: fix command option parsing, honor --
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
-rw-r--r--src/rbd.cc117
1 files changed, 63 insertions, 54 deletions
diff --git a/src/rbd.cc b/src/rbd.cc
index bc745551df1..431af552d7d 100644
--- a/src/rbd.cc
+++ b/src/rbd.cc
@@ -748,16 +748,9 @@ enum {
OPT_SHOWMAPPED,
};
-static int get_cmd(const char *cmd, bool *snapcmd)
+static int get_cmd(const char *cmd, bool snapcmd)
{
- if (strcmp(cmd, "snap") == 0) {
- if (*snapcmd)
- return -EINVAL;
- *snapcmd = true;
- return 0;
- }
-
- if (!*snapcmd) {
+ if (!snapcmd) {
if (strcmp(cmd, "ls") == 0 ||
strcmp(cmd, "list") == 0)
return OPT_LIST;
@@ -802,7 +795,7 @@ static int get_cmd(const char *cmd, bool *snapcmd)
return OPT_SNAP_LIST;
}
- return -EINVAL;
+ return OPT_NO_CMD;
}
static void set_conf_param(const char *param, const char **var1, const char **var2)
@@ -815,7 +808,7 @@ static void set_conf_param(const char *param, const char **var1, const char **va
usage_exit();
}
-int main(int argc, const char **argv)
+int main(int argc, const char **argv)
{
librados::Rados rados;
librbd::RBD rbd;
@@ -835,12 +828,12 @@ int main(int argc, const char **argv)
uint64_t size = 0;
int order = 0;
const char *imgname = NULL, *snapname = NULL, *destname = NULL, *dest_poolname = NULL, *path = NULL, *secretfile = NULL, *user = NULL, *devpath = NULL;
- bool is_snap_cmd = false;
std::string val;
std::ostringstream err;
long long sizell = 0;
- for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ) {
+ std::vector<const char*>::iterator i;
+ for (i = args.begin(); i != args.end(); ) {
if (ceph_argparse_double_dash(args, i)) {
break;
} else if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) {
@@ -874,51 +867,67 @@ int main(int argc, const char **argv)
} else if (ceph_argparse_witharg(args, i, &val, "--user", (char*)NULL)) {
user = strdup(val.c_str());
} else {
- const char *v = *i;
- if (!opt_cmd) {
- opt_cmd = get_cmd(v, &is_snap_cmd);
- if (opt_cmd < 0) {
- cerr << "invalid command: " << v << std::endl;
- usage_exit();
- }
- } else {
- switch (opt_cmd) {
- case OPT_LIST:
- set_conf_param(v, &poolname, NULL);
- break;
- case OPT_INFO:
- case OPT_CREATE:
- case OPT_RESIZE:
- case OPT_RM:
- case OPT_SNAP_CREATE:
- case OPT_SNAP_ROLLBACK:
- case OPT_SNAP_REMOVE:
- case OPT_SNAP_LIST:
- case OPT_WATCH:
- case OPT_MAP:
- set_conf_param(v, &imgname, NULL);
- break;
- case OPT_UNMAP:
- set_conf_param(v, &devpath, NULL);
- break;
- case OPT_EXPORT:
- set_conf_param(v, &imgname, &path);
- break;
- case OPT_IMPORT:
- set_conf_param(v, &path, &destname);
- break;
- case OPT_COPY:
- case OPT_RENAME:
- set_conf_param(v, &imgname, &destname);
- break;
- }
- }
+ ++i;
+ }
+ }
+
+ i = args.begin();
+ if (i == args.end()) {
+ cerr << "you must specify a command." << std::endl;
+ usage_exit();
+ }
+ else if (strcmp(*i, "snap") == 0) {
+ i = args.erase(i);
+ if (i == args.end()) {
+ cerr << "which snap command do you want?" << std::endl;
+ usage_exit();
}
- // usage_exit();
+ opt_cmd = get_cmd(*i, true);
+ }
+ else {
+ opt_cmd = get_cmd(*i, false);
}
- if (!opt_cmd)
+ if (opt_cmd == OPT_NO_CMD) {
+ cerr << "error parsing command '" << *i << "'" << std::endl;
usage_exit();
+ }
+ for (i = args.erase(i); i != args.end(); ++i) {
+ const char *v = *i;
+ switch (opt_cmd) {
+ case OPT_LIST:
+ set_conf_param(v, &poolname, NULL);
+ break;
+ case OPT_INFO:
+ case OPT_CREATE:
+ case OPT_RESIZE:
+ case OPT_RM:
+ case OPT_SNAP_CREATE:
+ case OPT_SNAP_ROLLBACK:
+ case OPT_SNAP_REMOVE:
+ case OPT_SNAP_LIST:
+ case OPT_WATCH:
+ case OPT_MAP:
+ set_conf_param(v, &imgname, NULL);
+ break;
+ case OPT_UNMAP:
+ set_conf_param(v, &devpath, NULL);
+ break;
+ case OPT_EXPORT:
+ set_conf_param(v, &imgname, &path);
+ break;
+ case OPT_IMPORT:
+ set_conf_param(v, &path, &destname);
+ break;
+ case OPT_COPY:
+ case OPT_RENAME:
+ set_conf_param(v, &imgname, &destname);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ }
if (!user)
user = "admin";