(*argv)[(*argc)++] = args[i];
}
+void ceph_arg_value_type(const char * nextargstr, bool *bool_option, bool *bool_numeric)
+{
+ bool is_numeric = true;
+ bool is_option;
+
+ if (nextargstr == NULL) {
+ return;
+ }
+
+ if (strlen(nextargstr) < 2) {
+ is_option = false;
+ } else {
+ is_option = (nextargstr[0] == '-') && (nextargstr[1] == '-');
+ }
+
+ for (unsigned int i = 0; i < strlen(nextargstr); i++) {
+ if (!(nextargstr[i] >= '0' && nextargstr[i] <= '9')) {
+ // May be negative numeral value
+ if ((i == 0) && (strlen(nextargstr) >= 2)) {
+ if (nextargstr[0] == '-')
+ continue;
+ }
+ is_numeric = false;
+ break;
+ }
+ }
+
+ // -<option>
+ if (nextargstr[0] == '-' && is_numeric == false) {
+ is_option = true;
+ }
+
+ *bool_option = is_option;
+ *bool_numeric = is_numeric;
+
+ return;
+}
+
bool parse_ip_port_vec(const char *s, vector<entity_addr_t>& vec)
{
const char *p = s;
{
bool 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);
return false;
}
+ 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";
+ } else {
+ *oss << "The option value '" << str << "' is invalid";
+ }
+ return true;
+ }
+
std::string err;
T myret = strict_str_convert(str.c_str(), &err);
*ret = myret;
long long strict_strtoll(const char *str, int base, std::string *err)
{
char *endptr;
+ std::string errStr;
errno = 0; /* To distinguish success/failure after call (see man page) */
long long ret = strtoll(str, &endptr, base);
if ((errno == ERANGE && (ret == LLONG_MAX || ret == LLONG_MIN))
|| (errno != 0 && ret == 0)) {
- ostringstream oss;
- oss << "strict_strtoll: integer underflow or overflow parsing '" << str << "'";
- *err = oss.str();
+ errStr = "The option value '";
+ errStr.append(str);
+ errStr.append("'");
+ errStr.append(" seems to be invalid");
+ *err = errStr;
return 0;
}
if (endptr == str) {
- ostringstream oss;
- oss << "strict_strtoll: expected integer, got: '" << str << "'";
- *err = oss.str();
+ errStr = "Expected option value to be integer, got '";
+ errStr.append(str);
+ errStr.append("'");
+ *err = errStr;
return 0;
}
if (*endptr != '\0') {
- ostringstream oss;
- oss << "strict_strtoll: garbage at end of string. got: '" << str << "'";
- *err = oss.str();
+ errStr = "The option value '";
+ errStr.append(str);
+ errStr.append("'");
+ errStr.append(" seems to be invalid");
+ *err = errStr;
return 0;
}
*err = "";
int strict_strtol(const char *str, int base, std::string *err)
{
+ std::string errStr;
long long ret = strict_strtoll(str, base, err);
if (!err->empty())
return 0;
- if (ret <= INT_MIN) {
- ostringstream oss;
- oss << "strict_strtol: integer underflow parsing '" << str << "'";
- *err = oss.str();
- return 0;
- }
- if (ret >= INT_MAX) {
- ostringstream oss;
- oss << "strict_strtol: integer overflow parsing '" << str << "'";
- *err = oss.str();
+ if ((ret <= INT_MIN) || (ret >= INT_MAX)) {
+ errStr = "The option value '";
+ errStr.append(str);
+ errStr.append("'");
+ errStr.append(" seems to be invalid");
+ *err = errStr;
return 0;
}
return static_cast<int>(ret);