]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
md_config_t::set_val/get_val
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Tue, 22 Feb 2011 20:27:07 +0000 (12:27 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Wed, 23 Feb 2011 18:17:30 +0000 (10:17 -0800)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/common/config.cc
src/common/config.h
src/common/signal.cc
src/common/signal.h
src/include/rados/librados.h
src/librados.cc

index 946e99f25cf587b5caf5684f71f4bcfb61281e0e..93e242d72a88dae7176160318c54898f04f6ab4c 100644 (file)
@@ -891,6 +891,111 @@ md_config_t::md_config_t()
   g_conf.id = strdup("admin");
 }
 
+int md_config_t::set_val(const char *key, const char *val)
+{
+  if (!key)
+    return -EINVAL;
+  if (!val)
+    return -EINVAL;
+  for (int i = 0; i<num_config_options; ++i) {
+    config_option *opt = &config_optionsp[i];
+    if (strcmp(opt->conf_name, key))
+      continue;
+
+    switch (opt->type) {
+      case OPT_NONE:
+       return -ENOSYS;
+      case OPT_INT:
+       *(int*)opt->val_ptr = atoi(val);
+       return 0;
+      case OPT_LONGLONG:
+       *(long long*)opt->val_ptr = atoll(val);
+       return 0;
+      case OPT_STR: {
+       char *p = (char*)opt->val_ptr;
+       free(p);
+       opt->val_ptr = strdup(val);
+       return 0;
+      }
+      case OPT_FLOAT:
+       *(float*)opt->val_ptr = atof(val);
+       return 0;
+      case OPT_DOUBLE:
+       *(double*)opt->val_ptr = atof(val);
+       return 0;
+      case OPT_BOOL:
+       *(bool*)opt->val_ptr = !!atoi(val);
+       return 0;
+      case OPT_U32:
+       *(int*)opt->val_ptr = atoi(val);
+       return 0;
+      case OPT_ADDR: {
+       entity_addr_t *addr = (entity_addr_t*)opt->val_ptr;
+       if (!addr->parse(val)) {
+         return -EINVAL;
+       }
+       return 0;
+      }
+    }
+  }
+  // couldn't find a configuration option with key 'key'
+  return -ENOENT;
+}
+
+int md_config_t::get_val(const char *key, char **buf, int len)
+{
+  if (!key)
+    return -EINVAL;
+  for (int i = 0; i<num_config_options; ++i) {
+    const config_option *opt = &config_optionsp[i];
+    if (strcmp(opt->conf_name, key))
+      continue;
+
+    ostringstream oss;
+    switch (opt->type) {
+      case OPT_NONE:
+       return -ENOSYS;
+      case OPT_INT:
+       oss << *(int*)opt->val_ptr;
+       break;
+      case OPT_LONGLONG:
+       oss << *(long long*)opt->val_ptr;
+       break;
+      case OPT_STR:
+       if (opt->val_ptr)
+         oss << (char*)opt->val_ptr;
+       break;
+      case OPT_FLOAT:
+       oss << *(float*)opt->val_ptr;
+       break;
+      case OPT_DOUBLE:
+       oss << *(double*)opt->val_ptr;
+       break;
+      case OPT_BOOL:
+       oss << *(bool*)opt->val_ptr;
+       break;
+      case OPT_U32:
+       oss << *(uint32_t*)opt->val_ptr;
+       break;
+      case OPT_ADDR: {
+       oss << *(entity_addr_t*)opt->val_ptr;
+       break;
+      }
+    }
+    string str(oss.str());
+    int l = strlen(oss.str().c_str()) + 1;
+    if (len == -1) {
+      *buf = (char*)malloc(l);
+      strcpy(*buf, oss.str().c_str());
+      return 0;
+    }
+    snprintf(*buf, len, "%s", oss.str().c_str());
+    return (l > len) ? -ENAMETOOLONG : 0;
+  }
+  // couldn't find a configuration option with key 'key'
+  return -ENOENT;
+}
+
 md_config_t::~md_config_t()
 {
   int len = sizeof(config_optionsp)/sizeof(config_option);
index e005d316818390b46482175202996a5b2720230e..923cb649ca2122e64173a6f334cac66f83996c37 100644 (file)
@@ -48,6 +48,8 @@ struct ConfFile;
 struct md_config_t {
   md_config_t();
   ~md_config_t();
+  int get_val(const char *key, char **buf, int len);
+  int set_val(const char *key, const char *val);
 
   ConfFile *cf;
 
index e8ebdd5834113d4ae7e4d5e3643de68428075518..e569cff19e78963cb2e0d860b0ceecce64e8531a 100644 (file)
@@ -48,7 +48,7 @@ void install_sighandler(int signum, signal_handler_t handler, int flags)
   }
 }
 
-static void sighup_handler(int signum)
+void sighup_handler(int signum)
 {
   // All this does is set a few bits telling us to re-open our logfiles and
   // restart our central logging service.
index fa970285c4adf6952dd61b76bfc7acffc0f976bc..1081e337cab19405999a1d26d489e9d5c14c53e3 100644 (file)
@@ -22,6 +22,9 @@ typedef void (*signal_handler_t)(int);
 
 void install_sighandler(int signum, signal_handler_t handler, int flags);
 
+// handles SIGHUP
+void sighup_handler(int signum);
+
 // Install the standard Ceph signal handlers
 void install_standard_sighandlers(void);
 
index 2e0120c2966ade8986855dde4f51fc62d76303a0..edd911787a0d0d689ac3ee8f30735b0369c7d531 100644 (file)
@@ -57,8 +57,17 @@ void rados_release(rados_t cluster);
 /* config */
 int rados_conf_parse_argv(rados_t cluster, int argc, const char **argv);
 int rados_conf_read_file(rados_t cluster, const char *path);
+
+/* Sets a configuration value from a string.
+ * Returns 0 on success, error code otherwise. */
 int rados_conf_set(rados_t cluster, const char *option, const char *value);
-const char *rados_conf_get(rados_t cluster, const char *option);
+
+/* Returns a configuration value as a string.
+ * If len is positive, that is the maximum number of bytes we'll write into the
+ * buffer. If len == -1, we'll call malloc() and set *buf.
+ * Returns 0 on success, error code otherwise. Returns ENAMETOOLONG if the
+ * buffer is too short. */
+int rados_conf_get(rados_t cluster, const char *option, char **buf, int len);
 
 /* pools */
 int rados_pool_open(rados_t cluster, const char *name, rados_pool_t *pool);
index 4486c6367067bb3678a659ee0013672e87b7012d..2adf64c71d177a870a77b26c37a0d8b008de8254 100644 (file)
@@ -2418,17 +2418,21 @@ extern "C" int rados_conf_read_file(rados_t cluster, const char *path)
 
 extern "C" int rados_conf_set(rados_t cluster, const char *option, const char *value)
 {
-  return 0;
+  int ret = g_conf.set_val(option, value);
+  if (ret == 0) {
+    // Simulate SIGHUP after a configuration change.
+    sighup_handler(SIGHUP);
+  }
+  return ret;
 }
 
-extern "C" const char *rados_conf_get(rados_t cluster, const char *option)
+extern "C" int rados_conf_get(rados_t cluster, const char *option, char **buf, int len)
 {
-  return 0;
+  return g_conf.get_val(option, buf, len);
 }
 
 
-
-extern "C" int rados_pool_lookup(rados_t cluster, const char *name)
+extern "C" int rados_lookup_pool(rados_t cluster, const char *name)
 {
   RadosClient *radosp = (RadosClient *)cluster;
   return radosp->lookup_pool(name);