template<class T>
bool ceph_argparse_witharg(std::vector<const char*> &args,
std::vector<const char*>::iterator &i, T *ret,
- std::ostream *oss, ...)
+ std::ostream &oss, ...)
{
- bool r;
+ int r;
va_list ap;
+ bool is_option = false;
+ bool is_numeric = true;
std::string str;
va_start(ap, oss);
- r = va_ceph_argparse_witharg(args, i, &str, ap);
+ r = va_ceph_argparse_witharg(args, i, &str, oss, ap);
va_end(ap);
- if (!r) {
+ if (r == 0) {
return false;
++ } else if (r < 0) {
++ return true;
}
- if (r == 1) {
- std::string err;
- T myret = strict_str_convert(str.c_str(), &err);
- *ret = myret;
- if (!err.empty()) {
- oss << err;
+ ceph_arg_value_type(str.c_str(), &is_option, &is_numeric);
+ if ((is_option == true) || (is_numeric == false)) {
+ *ret = EXIT_FAILURE;
+ if (is_option == true) {
- *oss << "Missing option value";
++ oss << "Missing option value";
+ } else {
- *oss << "The option value '" << str << "' is invalid";
++ oss << "The option value '" << str << "' is invalid";
}
- *oss << err;
+ return true;
+ }
+
+ std::string err;
+ T myret = strict_str_convert(str.c_str(), &err);
+ *ret = myret;
+ if (!err.empty()) {
++ oss << err;
}
return true;
}
cerr << "rbd: " << err.str() << std::endl;
return EXIT_FAILURE;
}
- } else if (ceph_argparse_witharg(args, i, &bench_io_size, &err, "--io-size", (char*)NULL)) {
+ if ((order <= 0) || (order < 12) || (order > 25)) {
+ cerr << "rbd: order must be between 12 (4 KB) and 25 (32 MB)" << std::endl;
+ return EXIT_FAILURE;
+ }
+ } else if (ceph_argparse_witharg(args, i, &bench_io_size, err, "--io-size", (char*)NULL)) {
if (!err.str().empty()) {
cerr << "rbd: " << err.str() << std::endl;
return EXIT_FAILURE;