" --keyfile <path> file containing secret key for use with cephx\n";
}
-void usage_exit()
-{
- assert(1);
- usage();
- exit(1);
-}
-
static string feature_str(uint64_t features)
{
string s = "";
*var1 = param;
else if (var2 && !*var2)
*var2 = param;
- else
- usage_exit();
}
int main(int argc, const char **argv)
assert(r == 0);
} else if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) {
usage();
- exit(0);
+ return 0;
} else if (ceph_argparse_flag(args, i, "--new-format", (char*)NULL)) {
old_format = false;
} else if (ceph_argparse_witharg(args, i, &val, "-p", "--pool", (char*)NULL)) {
} else if (ceph_argparse_withlonglong(args, i, &sizell, &err, "-s", "--size", (char*)NULL)) {
if (!err.str().empty()) {
cerr << err.str() << std::endl;
- exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
size = sizell << 20; // bytes to MB
} else if (ceph_argparse_withint(args, i, &order, &err, "--order", (char*)NULL)) {
if (!err.str().empty()) {
cerr << err.str() << std::endl;
- exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
} else if (ceph_argparse_witharg(args, i, &val, "--path", (char*)NULL)) {
path = strdup(val.c_str());
i = args.begin();
if (i == args.end()) {
cerr << "you must specify a command." << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
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();
+ return EXIT_FAILURE;
}
opt_cmd = get_cmd(*i, true);
}
}
if (opt_cmd == OPT_NO_CMD) {
cerr << "error parsing command '" << *i << "'" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
for (i = args.erase(i); i != args.end(); ++i) {
}
break;
case OPT_SHOWMAPPED:
- usage_exit();
- break;
+ usage();
+ return EXIT_FAILURE;
default:
assert(0);
break;
if (opt_cmd == OPT_EXPORT && !imgname) {
cerr << "error: image name was not specified" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
if (opt_cmd == OPT_IMPORT && !path) {
cerr << "error: path was not specified" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
if (opt_cmd == OPT_IMPORT && !destname)
if (opt_cmd != OPT_LIST && opt_cmd != OPT_IMPORT && opt_cmd != OPT_UNMAP && opt_cmd != OPT_SHOWMAPPED &&
!imgname) {
cerr << "error: image name was not specified" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
// do this unconditionally so we can parse pool/image@snapshot into
opt_cmd != OPT_MAP && opt_cmd != OPT_CLONE &&
opt_cmd != OPT_SNAP_PROTECT && opt_cmd != OPT_SNAP_UNPROTECT) {
cerr << "error: snapname specified for a command that doesn't use it" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
if ((opt_cmd == OPT_SNAP_CREATE || opt_cmd == OPT_SNAP_ROLLBACK ||
opt_cmd == OPT_SNAP_REMOVE || opt_cmd == OPT_CLONE ||
opt_cmd == OPT_SNAP_PROTECT || opt_cmd == OPT_SNAP_UNPROTECT) &&
!snapname) {
cerr << "error: snap name was not specified" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
set_pool_image_name(dest_poolname, destname, (char **)&dest_poolname, (char **)&destname, (char **)&dest_snapname);
if ((opt_cmd == OPT_COPY || opt_cmd == OPT_CLONE) && !destname ) {
cerr << "error: destination image name was not specified" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
if ((opt_cmd == OPT_CLONE) && dest_snapname) {
cerr << "error: cannot clone to a snapshot" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
if ((opt_cmd == OPT_CLONE) && size) {
cerr << "error: clone must begin at size of parent" << std::endl;
- usage_exit();
+ usage();
+ return EXIT_FAILURE;
}
if ((opt_cmd == OPT_RENAME) && (strcmp(poolname, dest_poolname) != 0)) {
cerr << "error: mv/rename across pools not supported" << std::endl;
cerr << "source pool: " << poolname << " dest pool: " << dest_poolname
<< std::endl;
- exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
bool talk_to_cluster = (opt_cmd != OPT_MAP &&
opt_cmd != OPT_SHOWMAPPED);
if (talk_to_cluster && rados.init_with_context(g_ceph_context) < 0) {
cerr << "error: couldn't initialize rados!" << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
if (talk_to_cluster && rados.connect() < 0) {
cerr << "error: couldn't connect to the cluster!" << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
int r;
r = rados.ioctx_create(poolname, io_ctx);
if (r < 0) {
cerr << "error opening pool " << poolname << ": " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
}
r = rbd.open(io_ctx, image, imgname);
if (r < 0) {
cerr << "error opening image " << imgname << ": " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
}
r = image.snap_set(snapname);
if (r < 0) {
cerr << "error setting snapshot context: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
}
r = rados.ioctx_create(dest_poolname, dest_io_ctx);
if (r < 0) {
cerr << "error opening pool " << dest_poolname << ": " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
}
default:
cerr << "error: " << cpp_strerror(-r) << std::endl;
}
- exit(1);
+ return EXIT_FAILURE;
}
break;
if (!size) {
cerr << "must specify size in MB to create an rbd image" << std::endl;
usage();
- exit(1);
+ return EXIT_FAILURE;
}
if (order && (order < 12 || order > 25)) {
cerr << "order must be between 12 (4 KB) and 25 (32 MB)" << std::endl;
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_create(rbd, io_ctx, imgname, size, &order, old_format, features);
if (r < 0) {
cerr << "create error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
if (order && (order < 12 || order > 25)) {
cerr << "order must be between 12 (4 KB) and 25 (32 MB)" << std::endl;
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_clone(rbd, io_ctx, imgname, snapname, dest_io_ctx, destname,
features, &order);
if (r < 0) {
cerr << "clone error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_flatten(image);
if (r < 0) {
cerr << "flatten error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_rename(rbd, io_ctx, imgname, destname);
if (r < 0) {
cerr << "rename error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_show_info(imgname, image, snapname);
if (r < 0) {
cerr << "error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
} else {
cerr << "delete error: " << cpp_strerror(-r) << std::endl;
}
- exit(-r);
+ return -r ;
}
break;
r = do_resize(image, size);
if (r < 0) {
cerr << "resize error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_LIST:
if (!imgname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_list_snaps(image);
if (r < 0) {
cerr << "failed to list snapshots: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_CREATE:
if (!imgname || !snapname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_add_snap(image, snapname);
if (r < 0) {
cerr << "failed to create snapshot: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_ROLLBACK:
if (!imgname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_rollback_snap(image, snapname);
if (r < 0) {
cerr << "rollback failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_REMOVE:
if (!imgname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_remove_snap(image, snapname);
if (r == -EBUSY) {
cerr << "Snapshot '" << snapname << "' is protected from removal." << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
if (r < 0) {
cerr << "failed to remove snapshot: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_PURGE:
if (!imgname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_purge_snaps(image);
if (r < 0) {
cerr << "removing snaps failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_PROTECT:
if (!imgname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_protect_snap(image, snapname);
if (r < 0) {
cerr << "protecting snap failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_SNAP_UNPROTECT:
if (!imgname) {
usage();
- exit(1);
+ return EXIT_FAILURE;
}
r = do_unprotect_snap(image, snapname);
if (r < 0) {
cerr << "unprotecting snap failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_EXPORT:
if (!path) {
cerr << "pathname should be specified" << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
r = do_export(image, path);
if (r < 0) {
cerr << "export error: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
case OPT_IMPORT:
if (!path) {
cerr << "pathname should be specified" << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
r = do_import(rbd, dest_io_ctx, destname, &order, path,
old_format, features, size);
if (r < 0) {
cerr << "import failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_copy(image, dest_io_ctx, destname);
if (r < 0) {
cerr << "copy failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_watch(io_ctx, imgname);
if (r < 0) {
cerr << "watch failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_kernel_add(poolname, imgname, snapname);
if (r < 0) {
cerr << "add failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_kernel_rm(devpath);
if (r < 0) {
cerr << "remove failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
r = do_kernel_showmapped();
if (r < 0) {
cerr << "showmapped failed: " << cpp_strerror(-r) << std::endl;
- exit(1);
+ return EXIT_FAILURE;
}
break;
}