]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
conf: don't run over g_conf options when setting them
authorSage Weil <sage@newdream.net>
Fri, 25 Sep 2009 21:51:22 +0000 (14:51 -0700)
committerSage Weil <sage@newdream.net>
Fri, 25 Sep 2009 21:51:22 +0000 (14:51 -0700)
src/config.cc

index 901b8b92c194986e2bd65dba1fb80e25f5fc2c50..b8b8d4702d6e6f0a91af6f4e199f6e15df7d2056 100644 (file)
@@ -574,10 +574,11 @@ bool conf_set_conf_val(void *field, opt_type_t type, const char *val, long long
     *(long long *)field = intval;
     break;
   case OPT_STR:
-    if (val)
+    if (val) {
       *(char **)field = strdup(val);
-    else
+    } else {
       *(char **)field = NULL;
+    }
     break;
   case OPT_FLOAT:
     *(float *)field = doubleval;
@@ -592,6 +593,35 @@ bool conf_set_conf_val(void *field, opt_type_t type, const char *val, long long
   return true;
 }
 
+static bool conf_reset_val(void *field, opt_type_t type)
+{
+  switch (type) {
+  case OPT_BOOL:
+    *(bool *)field = 0;
+    break;
+  case OPT_INT:
+    *(int *)field = 0;
+    break;
+  case OPT_LONGLONG:
+    *(long long *)field = 0;
+    break;
+  case OPT_STR:
+      *(char **)field = NULL;
+    break;
+  case OPT_FLOAT:
+    *(float *)field = 0;
+    break;
+  case OPT_DOUBLE:
+    *(double *)field = 0;
+    break;
+  default:
+    return false;
+  }
+
+  return true;
+}
+
+
 static void set_conf_name(config_option *opt)
 {
   char *newsection = (char *)opt->section;
@@ -636,7 +666,7 @@ static bool init_g_conf()
   for (i = 0; i<len; i++) {
     opt = &config_optionsp[i];
     if (opt->val_ptr) {
-      *(char **)opt->val_ptr = NULL;
+      conf_reset_val(opt->val_ptr, opt->type);
     }
     if (!conf_set_conf_val(opt->val_ptr,
                           opt->type,