*/
int rados_conf_parse_argv(rados_t cluster, int argc, const char **argv);
+
+/**
+ * Configure the cluster handle with command line arguments, returning
+ * any remainders. Same rados_conf_parse_argv, except for extra
+ * remargv argument to hold returns unrecognized arguments.
+ *
+ * @pre rados_connect() has not been called on the cluster handle
+ *
+ * @param cluster cluster handle to configure
+ * @param argc number of arguments in argv
+ * @param argv arguments to parse
+ * @param remargv char* array for returned unrecognized arguments
+ * @returns 0 on success, negative error code on failure
+ */
+int rados_conf_parse_argv_remainder(rados_t cluster, int argc,
+ const char **argv, const char **remargv);
/**
* Configure the cluster handle based on an environment variable
*
void shutdown();
int conf_read_file(const char * const path) const;
int conf_parse_argv(int argc, const char ** argv) const;
+ int conf_parse_argv_remainder(int argc, const char ** argv,
+ const char ** remargv) const;
int conf_parse_env(const char *env) const;
int conf_set(const char *option, const char *value);
int conf_get(const char *option, std::string &val);
return rados_conf_parse_argv((rados_t)client, argc, argv);
}
+int librados::Rados::conf_parse_argv_remainder(int argc, const char ** argv,
+ const char ** remargv) const
+{
+ return rados_conf_parse_argv_remainder((rados_t)client, argc, argv, remargv);
+}
+
int librados::Rados::conf_parse_env(const char *name) const
{
return rados_conf_parse_env((rados_t)client, name);
return 0;
}
+// like above, but return the remainder of argv to contain remaining
+// unparsed args. Must be allocated to at least argc by caller.
+// remargv will contain n <= argc pointers to original argv[], the end
+// of which may be NULL
+
+extern "C" int rados_conf_parse_argv_remainder(rados_t cluster, int argc,
+ const char **argv,
+ const char **remargv)
+{
+ librados::RadosClient *client = (librados::RadosClient *)cluster;
+ md_config_t *conf = client->cct->_conf;
+ vector<const char*> args;
+ for (int i=0; i<argc; i++)
+ args.push_back(argv[i]);
+ int ret = conf->parse_argv(args);
+ if (ret)
+ return ret;
+ conf->apply_changes(NULL);
+ assert(args.size() <= (unsigned int)argc);
+ unsigned int i;
+ for (i = 0; i < argc; ++i) {
+ if (i < args.size())
+ remargv[i] = args[i];
+ else
+ remargv[i] = (const char *)NULL;
+ }
+ return 0;
+}
+
extern "C" int rados_conf_parse_env(rados_t cluster, const char *env)
{
librados::RadosClient *client = (librados::RadosClient *)cluster;
if (ret != 0):
raise make_ex(ret, "error calling conf_read_file")
+ def conf_parse_argv(self, args):
+ """
+ Parse known arguments from args, and remove; returned
+ args contain only those unknown to ceph
+ """
+ self.require_state("configuring", "connected")
+ if not args:
+ return
+ # create instances of arrays of c_char_p's, both len(args) long
+ # cretargs will always be a subset of cargs (perhaps identical)
+ cargs = (c_char_p * len(args))(*args)
+ cretargs = (c_char_p * len(args))()
+ ret = run_in_thread(self.librados.rados_conf_parse_argv_remainder,
+ (self.cluster, len(args), cargs, cretargs))
+ if ret:
+ raise make_ex("error calling conf_parse_argv_remainder")
+
+ # cretargs was allocated with fixed length; collapse return
+ # list to eliminate any missing args
+
+ retargs = [a for a in cretargs if a is not None]
+ return retargs
+
def conf_get(self, option):
"""
Get the value of a configuration option