@@ -54,6 +54,8 @@ map<string, int> type_id;
map<string, int> rule_id;
+void usage();
+
string string_node(node_t &node)
{
string s = string(node.value.begin(), node.value.end());
@@ -141,8 +143,8 @@ void parse_bucket(iter_t const& i, CrushWrapper &crush)
else if (a == "straw")
alg = CRUSH_BUCKET_STRAW;
else {
- cerr << "unknown bucket alg '" << a << "'" << std::endl;
- exit(1);
+ cerr << "unknown bucket alg '" << a << "'" << std::endl << std::endl;
+ usage();
}
}
else if (tag == "hash") {
@@ -936,14 +938,14 @@ int main(int argc, const char **argv)
crush.set_type_name(type, l.name);
int buckettype = -1;
- for (int i = 0; i < (int)(sizeof(bucket_types)/sizeof(bucket_types[0])); i++)
- if (strcmp(l.buckettype, bucket_types[i].name) == 0) {
+ for (int i = 0; bucket_types[i].name; i++)
+ if (l.buckettype && strcmp(l.buckettype, bucket_types[i].name) == 0) {
buckettype = bucket_types[i].type;
break;
}
if (buckettype < 0) {
- cerr << "unknown bucket type '" << l.buckettype << "'" << std::endl;
- exit(1);
+ cerr << "unknown bucket type '" << l.buckettype << "'" << std::endl << std::endl;
+ usage();
}
// build items
This patchset includes minor fixes to the crushtool utility. If an invalid bucket type is speicifed on the command line, the code was iterating through bucket_types for the length of the static array, but the last entry in that array has null (0) values, which was causing a segfault. This patch just checks that bucket_types[i].name is non-null instead. Also, if the wrong bucket type or algorithm is specified, prints the usage string on exit. Signed-off-by: Sam Lang <samlang@gmail.com> --- src/crushtool.cc | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-)