#undef generic_dout
#undef dendl
+static bool cmd_is_char(const char *cmd)
+{
+ return ((cmd[0] == '-') &&
+ cmd[1] && !cmd[2]);
+}
+
+bool ceph_argparse_cmd_equals(const char *cmd, const char *opt, char char_opt,
+ unsigned int *val_pos)
+{
+ unsigned int i;
+ unsigned int len = strlen(opt);
+
+ *val_pos = 0;
+
+ if (!*cmd)
+ return false;
+
+ if (char_opt && cmd_is_char(cmd))
+ return (char_opt == cmd[1]);
+
+ if ((cmd[0] != '-') || (cmd[1] != '-'))
+ return false;
+
+ for (i=0; i<len; i++) {
+ if ((opt[i] == '_') || (opt[i] == '-')) {
+ switch (cmd[i+2]) {
+ case '-':
+ case '_':
+ continue;
+ default:
+ break;
+ }
+ }
+
+ if (cmd[i+2] != opt[i])
+ return false;
+ }
+
+ if (cmd[i+2] == '=')
+ *val_pos = i+3;
+ else if (cmd[i+2])
+ return false;
+
+ return true;
+}
+
+bool ceph_argparse_cmdline_val(void *field, int type, const char *val)
+{
+ switch (type) {
+ case OPT_BOOL:
+ if (strcasecmp(val, "false") == 0)
+ *(bool *)field = false;
+ else if (strcasecmp(val, "true") == 0)
+ *(bool *)field = true;
+ else
+ *(bool *)field = (bool)atoi(val);
+ break;
+ case OPT_INT:
+ *(int *)field = atoi(val);
+ break;
+ case OPT_LONGLONG:
+ *(long long *)field = atoll(val);
+ break;
+ case OPT_STR:
+ if (val)
+ *(char **)field = strdup(val);
+ else
+ *(char **)field = NULL;
+ break;
+ case OPT_FLOAT:
+ *(float *)field = atof(val);
+ break;
+ case OPT_DOUBLE:
+ *(double *)field = strtod(val, NULL);
+ break;
+ case OPT_ADDR:
+ ((entity_addr_t *)field)->parse(val);
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
void env_override(char **ceph_var, const char * const env_var)
{
char *e = getenv(env_var);
void (*args_usage)() __attribute__((unused)) = usage_func; \
bool __isarg __attribute__((unused))
+#define CONF_NEXT_VAL (val_pos ? &args[i][val_pos] : args[++i])
+
+#define CONF_SET_ARG_VAL(dest, type) \
+ ceph_argparse_cmdline_val(dest, type, CONF_NEXT_VAL)
+
+#define CONF_VAL args[i]
+
+#define CONF_SAFE_SET_ARG_VAL(dest, type) \
+ do { \
+ __isarg = i+1 < args.size(); \
+ if (__isarg && !val_pos && \
+ args[i+1][0] == '-' && args[i+1][1] != '\0') \
+ __isarg = false; \
+ if (type == OPT_BOOL) { \
+ if (val_pos) { \
+ CONF_SET_ARG_VAL(dest, type); \
+ } else \
+ ceph_argparse_cmdline_val(dest, type, "true"); \
+ } else if (__isarg || val_pos) { \
+ CONF_SET_ARG_VAL(dest, type); \
+ } else if (args_usage) \
+ args_usage(); \
+ } while (0)
+
+#define CONF_ARG_EQ(str_cmd, char_cmd) \
+ ceph_argparse_cmd_equals(args[i], str_cmd, char_cmd, &val_pos)
+
+extern bool ceph_argparse_cmdline_val(void *field, int type,
+ const char *val);
+extern bool ceph_argparse_cmd_equals(const char *cmd, const char *opt,
+ char char_opt, unsigned int *val_pos);
+
/////////////////////// Types ///////////////////////
class CephInitParameters
{
const int num_config_options = sizeof(config_optionsp) / sizeof(config_option);
-bool conf_set_conf_val(void *field, opt_type_t type, const char *val)
-{
- switch (type) {
- case OPT_BOOL:
- if (strcasecmp(val, "false") == 0)
- *(bool *)field = false;
- else if (strcasecmp(val, "true") == 0)
- *(bool *)field = true;
- else
- *(bool *)field = (bool)atoi(val);
- break;
- case OPT_INT:
- *(int *)field = atoi(val);
- break;
- case OPT_LONGLONG:
- *(long long *)field = atoll(val);
- break;
- case OPT_STR:
- if (val)
- *(char **)field = strdup(val);
- else
- *(char **)field = NULL;
- break;
- case OPT_FLOAT:
- *(float *)field = atof(val);
- break;
- case OPT_DOUBLE:
- *(double *)field = strtod(val, NULL);
- break;
- case OPT_ADDR:
- ((entity_addr_t *)field)->parse(val);
- break;
- default:
- return false;
- }
-
- return true;
-}
-
bool conf_set_conf_val(void *field, opt_type_t type, const char *val, long long intval, double doubleval)
{
switch (type) {
opt->conf_name = (const char *)newconf;
}
-static bool cmd_is_char(const char *cmd)
-{
- return ((cmd[0] == '-') &&
- cmd[1] && !cmd[2]);
-}
-
-bool conf_cmd_equals(const char *cmd, const char *opt, char char_opt, unsigned int *val_pos)
-{
- unsigned int i;
- unsigned int len = strlen(opt);
-
- *val_pos = 0;
-
- if (!*cmd)
- return false;
-
- if (char_opt && cmd_is_char(cmd))
- return (char_opt == cmd[1]);
-
- if ((cmd[0] != '-') || (cmd[1] != '-'))
- return false;
-
- for (i=0; i<len; i++) {
- if ((opt[i] == '_') || (opt[i] == '-')) {
- switch (cmd[i+2]) {
- case '-':
- case '_':
- continue;
- default:
- break;
- }
- }
-
- if (cmd[i+2] != opt[i])
- return false;
- }
-
- if (cmd[i+2] == '=')
- *val_pos = i+3;
- else if (cmd[i+2])
- return false;
-
- return true;
-}
-
static bool get_var(const char *str, int pos, char *var_name, int len, int *new_pos)
{
int bracket = (str[pos] == '{');
char *conf_post_process_val(const char *val);
int conf_read_key(const char *alt_section, const char *key, opt_type_t type, void *out, void *def, bool free_old_val = false);
-bool conf_set_conf_val(void *field, opt_type_t type, const char *val);
-bool conf_cmd_equals(const char *cmd, const char *opt, char char_opt, unsigned int *val_pos);
bool ceph_resolve_file_search(string& filename_list, string& result);
-#define CONF_NEXT_VAL (val_pos ? &args[i][val_pos] : args[++i])
-
-#define CONF_SET_ARG_VAL(dest, type) \
- conf_set_conf_val(dest, type, CONF_NEXT_VAL)
-
-#define CONF_VAL args[i]
-
-#define CONF_SAFE_SET_ARG_VAL_USAGE(dest, type, show_usage) \
- do { \
- __isarg = i+1 < args.size(); \
- if (__isarg && !val_pos && \
- args[i+1][0] == '-' && args[i+1][1] != '\0') \
- __isarg = false; \
- if (type == OPT_BOOL) { \
- if (val_pos) { \
- CONF_SET_ARG_VAL(dest, type); \
- } else \
- conf_set_conf_val(dest, type, "true"); \
- } else if (__isarg || val_pos) { \
- CONF_SET_ARG_VAL(dest, type); \
- } else if (show_usage && args_usage) \
- args_usage(); \
- } while (0)
-
-#define CONF_SAFE_SET_ARG_VAL(dest, type) CONF_SAFE_SET_ARG_VAL_USAGE(dest, type, true)
-
-#define CONF_SET_BOOL_ARG_VAL(dest) \
- conf_set_conf_val(dest, OPT_BOOL, (val_pos ? &args[i][val_pos] : "true"))
-
-#define CONF_ARG_EQ(str_cmd, char_cmd) \
- conf_cmd_equals(args[i], str_cmd, char_cmd, &val_pos)
-
struct config_option {
const char *section;
const char *conf_name;