}
}
-bool split_dashdash(const std::vector<const char*>& args,
- std::vector<const char*>& options,
- std::vector<const char*>& arguments) {
- bool dashdash = false;
- for (std::vector<const char*>::const_iterator i = args.begin();
- i != args.end();
- ++i) {
- if (dashdash) {
- arguments.push_back(*i);
- } else {
- if (strcmp(*i, "--") == 0)
- dashdash = true;
- else
- options.push_back(*i);
- }
+std::pair<std::vector<const char*>, std::vector<const char*>>
+split_dashdash(const std::vector<const char*>& args) {
+ auto dashdash = std::find_if(args.begin(), args.end(),
+ [](const char* arg) {
+ return strcmp(arg, "--") == 0;
+ });
+ std::vector<const char*> options{args.begin(), dashdash};
+ if (dashdash != args.end()) {
+ ++dashdash;
}
- return dashdash;
+ std::vector<const char*> arguments{dashdash, args.end()};
+ return {std::move(options), std::move(arguments)};
}
static std::mutex g_str_vec_lock;
if (!name)
name = "CEPH_ARGS";
- bool dashdash = false;
- std::vector<const char*> options;
- std::vector<const char*> arguments;
- if (split_dashdash(args, options, arguments))
- dashdash = true;
-
- std::vector<const char*> env_options;
- std::vector<const char*> env_arguments;
- std::vector<const char*> env;
+ auto [options, arguments] = split_dashdash(args);
/*
* We can only populate str_vec once. Other threads could hold pointers into
}
g_str_vec_lock.unlock();
- vector<string>::iterator i;
- for (i = g_str_vec.begin(); i != g_str_vec.end(); ++i)
- env.push_back(i->c_str());
- if (split_dashdash(env, env_options, env_arguments))
- dashdash = true;
+ std::vector<const char*> env;
+ for (const auto& s : g_str_vec) {
+ env.push_back(s.c_str());
+ }
+ auto [env_options, env_arguments] = split_dashdash(env);
args.clear();
- args.insert(args.end(), options.begin(), options.end());
args.insert(args.end(), env_options.begin(), env_options.end());
- if (dashdash)
- args.push_back("--");
- args.insert(args.end(), arguments.begin(), arguments.end());
+ args.insert(args.end(), options.begin(), options.end());
+ if (arguments.empty() && env_arguments.empty()) {
+ return;
+ }
+ args.push_back("--");
args.insert(args.end(), env_arguments.begin(), env_arguments.end());
+ args.insert(args.end(), arguments.begin(), arguments.end());
}
void argv_to_vec(int argc, const char **argv,
}
}
+static bool check_bool_str(const char *val, int *ret)
+{
+ if ((strcmp(val, "true") == 0) || (strcmp(val, "1") == 0)) {
+ *ret = 1;
+ return true;
+ } else if ((strcmp(val, "false") == 0) || (strcmp(val, "0") == 0)) {
+ *ret = 0;
+ return true;
+ }
+ return false;
+}
+
static bool va_ceph_argparse_binary_flag(std::vector<const char*> &args,
std::vector<const char*>::iterator &i, int *ret,
std::ostream *oss, va_list ap)
if (first[strlen_a] == '=') {
i = args.erase(i);
const char *val = first + strlen_a + 1;
- if ((strcmp(val, "true") == 0) || (strcmp(val, "1") == 0)) {
- *ret = 1;
- return true;
- }
- else if ((strcmp(val, "false") == 0) || (strcmp(val, "0") == 0)) {
- *ret = 0;
+ if (check_bool_str(val, ret)) {
return true;
}
if (oss) {
return true;
}
else if (first[strlen_a] == '\0') {
- i = args.erase(i);
- *ret = 1;
+ auto next = i+1;
+ if (next != args.end() &&
+ *next &&
+ (*next)[0] != '-') {
+ if (check_bool_str(*next, ret)) {
+ i = args.erase(i);
+ i = args.erase(i);
+ return true;
+ }
+ }
+ i = args.erase(i);
+ *ret = 1;
return true;
}
}
else if (ceph_argparse_witharg(args, i, &val, "--conf", "-c", (char*)NULL)) {
*conf_file_list = val;
}
+ else if (ceph_argparse_flag(args, i, "--no-config-file", (char*)NULL)) {
+ iparams.no_config_file = true;
+ }
else if (ceph_argparse_witharg(args, i, &val, "--cluster", (char*)NULL)) {
*cluster = val;
}