Formatter *formatter = NULL;
bool pretty_format = false;
+ Rados rados;
+ IoCtx io_ctx;
+
i = opts.find("create");
if (i != opts.end()) {
create_pool = true;
// open rados
- Rados rados;
ret = rados.init_with_context(g_ceph_context);
if (ret) {
cerr << "couldn't initialize rados! error " << ret << std::endl;
- return ret;
+ ret = -1;
+ goto out;
}
ret = rados.connect();
if (ret) {
cerr << "couldn't connect to cluster! error " << ret << std::endl;
- return ret;
+ ret = -1;
+ goto out;
}
char buf[80];
if (ret < 0) {
cerr << "error creating pool " << pool_name << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
// open io context.
- IoCtx io_ctx;
if (pool_name) {
ret = rados.ioctx_create(pool_name, io_ctx);
if (ret < 0) {
cerr << "error opening pool " << pool_name << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
ret = io_ctx.snap_lookup(snapname, &snapid);
if (ret < 0) {
cerr << "error looking up snap '" << snapname << "': " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
if (oloc.size()) {
if (ret < 0) {
cerr << "snapid " << snapid << " doesn't exist in pool "
<< io_ctx.get_pool_name() << std::endl;
- return 1;
+ goto out;
}
io_ctx.snap_set_read(snapid);
cout << "selected snap " << snapid << " '" << snapname << "'" << std::endl;
else if (strcmp(nargs[0], "ls") == 0) {
if (!pool_name) {
cerr << "pool name was not specified" << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
bool stdout = (nargs.size() < 2) || (strcmp(nargs[1], "-") == 0);
}
catch (const std::runtime_error& e) {
cerr << e.what() << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
}
if (!stdout)
ret = io_ctx.mapext(oid, 0, -1, m);
if (ret < 0) {
cerr << "mapext error on " << pool_name << "/" << oid << ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
}
std::map<uint64_t,uint64_t>::iterator iter;
for (iter = m.begin(); iter != m.end(); ++iter) {
if (ret < 0) {
cerr << " error stat-ing " << pool_name << "/" << oid << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
} else {
cout << pool_name << "/" << oid
<< " mtime " << mtime << ", size " << size << std::endl;
ret = do_get(io_ctx, nargs[1], nargs[2], op_size);
if (ret < 0) {
cerr << "error getting " << pool_name << "/" << nargs[1] << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
else if (strcmp(nargs[0], "put") == 0) {
ret = do_put(io_ctx, nargs[1], nargs[2], op_size);
if (ret < 0) {
cerr << "error putting " << pool_name << "/" << nargs[1] << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
else if (strcmp(nargs[0], "truncate") == 0) {
ret = io_ctx.setxattr(oid, attr_name.c_str(), bl);
if (ret < 0) {
cerr << "error setting xattr " << pool_name << "/" << oid << "/" << attr_name << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
else
ret = 0;
ret = io_ctx.getxattr(oid, attr_name.c_str(), bl);
if (ret < 0) {
cerr << "error getting xattr " << pool_name << "/" << oid << "/" << attr_name << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
else
ret = 0;
ret = io_ctx.rmxattr(oid, attr_name.c_str());
if (ret < 0) {
cerr << "error removing xattr " << pool_name << "/" << oid << "/" << attr_name << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
} else if (strcmp(nargs[0], "listxattr") == 0) {
if (!pool_name || nargs.size() < 2)
ret = io_ctx.getxattrs(oid, attrset);
if (ret < 0) {
cerr << "error getting xattr set " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
for (map<std::string, bufferlist>::iterator iter = attrset.begin();
if (ret < 0) {
cerr << "error getting omap header " << pool_name << "/" << oid
<< ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
} else {
cout << "header (" << header.length() << " bytes) :\n";
header.hexdump(cout);
if (ret < 0) {
cerr << "error setting omap value " << pool_name << "/" << oid
<< ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
} else {
ret = 0;
}
if (ret < 0) {
cerr << "error setting omap value " << pool_name << "/" << oid << "/"
<< key << ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
} else {
ret = 0;
}
if (ret < 0) {
cerr << "error getting omap value " << pool_name << "/" << oid << "/"
<< key << ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
} else {
ret = 0;
}
} else {
cout << "No such key: " << pool_name << "/" << oid << "/" << key
<< std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
} else if (strcmp(nargs[0], "rmomapkey") == 0) {
if (!pool_name || nargs.size() < 3)
if (ret < 0) {
cerr << "error removing omap key " << pool_name << "/" << oid << "/"
<< key << ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
} else {
ret = 0;
}
if (nargs.size() < 3) {
if (strcmp(target, pool_name) == 0) {
cerr << "cannot copy object into itself" << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
target_obj = nargs[1];
} else {
if (ret < 0) {
cerr << "error opening target pool " << target << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
if (target_oloc.size()) {
target_ctx.locator_set_key(target_oloc);
ret = do_copy(io_ctx, nargs[1], target_ctx, target_obj);
if (ret < 0) {
cerr << "error copying " << pool_name << "/" << nargs[1] << " => " << target << "/" << target_obj << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
else if (strcmp(nargs[0], "clonedata") == 0) {
if (nargs.size() < 3) {
if (strcmp(target, pool_name) == 0) {
cerr << "cannot copy object into itself" << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
target_obj = nargs[1];
} else {
if (ret < 0) {
cerr << "error opening target pool " << target << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
if (oloc.size()) {
target_ctx.locator_set_key(oloc);
} else {
cerr << "must specify locator for clone" << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
ret = do_clone_data(io_ctx, nargs[1], target_ctx, target_obj);
if (ret < 0) {
cerr << "error cloning " << pool_name << "/" << nargs[1] << " => " << target << "/" << target_obj << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
} else if (strcmp(nargs[0], "rm") == 0) {
if (!pool_name || nargs.size() < 2)
ret = io_ctx.remove(oid);
if (ret < 0) {
cerr << "error removing " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
}
}
if (ret < 0) {
cerr << "error creating " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
}
ret = io_ctx.read(oid, outdata, 0, 0);
if (ret < 0) {
cerr << "error reading " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
bufferlist::iterator p = outdata.begin();
bufferlist header;
if (ret < 0) {
cerr << "error creating pool " << nargs[1] << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
cout << "successfully created pool " << nargs[1] << std::endl;
}
if (strcmp(src_pool, target_pool) == 0) {
cerr << "cannot copy pool into itself" << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
ret = do_copy_pool(rados, src_pool, target_pool);
if (ret < 0) {
cerr << "error copying pool " << src_pool << " => " << target_pool << ": "
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
cout << "successfully copied pool " << nargs[1] << std::endl;
}
<< " This will PERMANENTLY DESTROY an entire pool of objects with no way back.\n"
<< " To confirm, pass the pool to remove twice, followed by\n"
<< " --yes-i-really-really-mean-it" << std::endl;
- return 1;
+ ret = -1;
+ goto out;
}
ret = rados.pool_delete(nargs[1]);
if (ret >= 0) {
if (ret < 0) {
cerr << "error creating pool " << pool_name << " snapshot " << nargs[1]
<< ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
cout << "created pool " << pool_name << " snap " << nargs[1] << std::endl;
}
if (ret < 0) {
cerr << "error removing pool " << pool_name << " snapshot " << nargs[1]
<< ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
cout << "removed pool " << pool_name << " snap " << nargs[1] << std::endl;
}
if (ret < 0) {
cerr << "error rolling back pool " << pool_name << " to snapshot " << nargs[1]
<< strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
cout << "rolled back pool " << pool_name
<< " to snapshot " << nargs[2] << std::endl;
if (ret < 0) {
cerr << "error getting omap key set " << pool_name << "/"
<< nargs[1] << ": " << cpp_strerror(ret) << std::endl;
- return 1;
+ goto out;
}
for (set<string>::iterator iter = out_keys.begin();
ret = io_ctx.list_watchers(oid, &lw);
if (ret < 0) {
cerr << "error listing watchers " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
else
ret = 0;
ret = io_ctx.list_snaps(oid, &ls);
if (ret < 0) {
cerr << "error listing snap shots " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
- return 1;
+ goto out;
}
else
ret = 0;
if (ret < 0)
cerr << "error " << (-ret) << ": " << cpp_strerror(ret) << std::endl;
+
+out:
+ delete formatter;
return (ret < 0) ? 1 : 0;
}