Code

Merged branch 'master' of git://git.tokkee.org/sysdb.git.
authorSebastian Harl <sh@tokkee.org>
Mon, 1 Apr 2013 18:09:28 +0000 (20:09 +0200)
committerSebastian Harl <sh@tokkee.org>
Mon, 1 Apr 2013 18:09:28 +0000 (20:09 +0200)
1  2 
src/core/plugin.c
src/core/store.c
src/include/core/store.h

diff --combined src/core/plugin.c
index 205c74f148d3f41cb97a1c5b9c891228d1fcc490,5fdaca0db885b9ba3c0870ac301cd13c17017602..53bba9e74bfc6bcb95522b36ab5c478035e733dc
@@@ -27,9 -27,9 +27,9 @@@
  
  #include "sysdb.h"
  #include "core/plugin.h"
- #include "utils/error.h"
+ #include "core/error.h"
+ #include "core/time.h"
  #include "utils/llist.h"
- #include "utils/time.h"
  
  #include <assert.h>
  
@@@ -184,10 -184,6 +184,10 @@@ sdb_plugin_find_by_name(sdb_llist_t *li
        return SDB_PLUGIN_CB(obj);
  } /* sdb_plugin_find_by_name */
  
 +/*
 + * private types
 + */
 +
  static int
  sdb_plugin_cb_init(sdb_object_t *obj, va_list ap)
  {
@@@ -227,22 -223,6 +227,22 @@@ sdb_plugin_cb_destroy(sdb_object_t *obj
        sdb_object_deref(SDB_PLUGIN_CB(obj)->cb_user_data);
  } /* sdb_plugin_cb_destroy */
  
 +static sdb_type_t sdb_plugin_cb_type = {
 +      sizeof(sdb_plugin_cb_t),
 +
 +      sdb_plugin_cb_init,
 +      sdb_plugin_cb_destroy,
 +      /* clone = */ NULL
 +};
 +
 +static sdb_type_t sdb_plugin_collector_cb_type = {
 +      sizeof(sdb_plugin_collector_cb_t),
 +
 +      sdb_plugin_cb_init,
 +      sdb_plugin_cb_destroy,
 +      /* clone = */ NULL
 +};
 +
  static int
  sdb_plugin_add_callback(sdb_llist_t **list, const char *type,
                const char *name, void *callback, sdb_object_t *user_data)
        if (! *list)
                return -1;
  
 -      obj = sdb_object_create(sizeof(sdb_plugin_cb_t), sdb_plugin_cb_init,
 -                      sdb_plugin_cb_destroy, list, type, name, callback, user_data);
 +      obj = sdb_object_create(sdb_plugin_cb_type,
 +                      list, type, name, callback, user_data);
        if (! obj)
                return -1;
  
@@@ -455,7 -435,8 +455,7 @@@ sdb_plugin_register_collector(const cha
        if (! collector_list)
                return -1;
  
 -      obj = sdb_object_create(sizeof(sdb_plugin_collector_cb_t),
 -                      sdb_plugin_cb_init, sdb_plugin_cb_destroy,
 +      obj = sdb_object_create(sdb_plugin_collector_cb_type,
                        &collector_list, "collector", name, callback, user_data);
        if (! obj)
                return -1;
diff --combined src/core/store.c
index 024733fc7350cf33cbc20673b5e09c4ccfe17a12,714a0b39ed18161b07b6bdd3bd856da335abd04d..4ec9f44f204fc5be018595cbc6a61ce950e7d6c2
@@@ -27,7 -27,7 +27,7 @@@
  
  #include "sysdb.h"
  #include "core/store.h"
- #include "utils/error.h"
+ #include "core/error.h"
  #include "utils/llist.h"
  
  #include <assert.h>
@@@ -82,10 -82,6 +82,10 @@@ sdb_cmp_store_obj_with_name(const sdb_o
        return strcasecmp(obj->name, lookup->obj_name);
  } /* sdb_cmp_store_obj_with_name */
  
 +/*
 + * public types
 + */
 +
  static int
  sdb_host_init(sdb_object_t *obj, va_list ap)
  {
@@@ -121,39 -117,6 +121,39 @@@ sdb_host_destroy(sdb_object_t *obj
                sdb_llist_destroy(SDB_HOST(obj)->services);
  } /* sdb_host_destroy */
  
 +static sdb_object_t *
 +sdb_host_do_clone(const sdb_object_t *obj)
 +{
 +      const sdb_host_t *host = (const sdb_host_t *)obj;
 +      sdb_host_t *new;
 +
 +      new = sdb_host_create(host->_name);
 +      if (! new)
 +              return NULL;
 +
 +      /* make sure these are initialized; else sdb_object_deref() might access
 +       * arbitrary memory in case of an error */
 +      new->services = new->attributes = NULL;
 +
 +      if (host->attributes) {
 +              new->attributes = sdb_llist_clone(host->attributes);
 +              if (! new->attributes) {
 +                      sdb_object_deref(SDB_OBJ(new));
 +                      return NULL;
 +              }
 +      }
 +
 +      new->_last_update = host->_last_update;
 +      if (host->services) {
 +              new->services = sdb_llist_clone(host->services);
 +              if (! new->services) {
 +                      sdb_object_deref(SDB_OBJ(new));
 +                      return NULL;
 +              }
 +      }
 +      return SDB_OBJ(new);
 +} /* sdb_host_do_clone */
 +
  static int
  sdb_attr_init(sdb_object_t *obj, va_list ap)
  {
@@@ -185,21 -148,6 +185,21 @@@ sdb_attr_destroy(sdb_object_t *obj
                free(SDB_ATTR(obj)->attr_value);
  } /* sdb_attr_destroy */
  
 +static sdb_object_t *
 +sdb_attr_clone(const sdb_object_t *obj)
 +{
 +      const sdb_attribute_t *attr = (const sdb_attribute_t *)obj;
 +      sdb_attribute_t *new;
 +
 +      new = sdb_attribute_create(attr->hostname,
 +                      attr->_name, attr->attr_value);
 +      if (! new)
 +              return NULL;
 +
 +      new->_last_update = attr->_last_update;
 +      return SDB_OBJ(new);
 +} /* sdb_attr_clone */
 +
  static int
  sdb_svc_init(sdb_object_t *obj, va_list ap)
  {
@@@ -227,44 -175,6 +227,44 @@@ sdb_svc_destroy(sdb_object_t *obj
                free(SDB_SVC(obj)->_name);
  } /* sdb_svc_destroy */
  
 +static sdb_object_t *
 +sdb_svc_clone(const sdb_object_t *obj)
 +{
 +      const sdb_service_t *svc = (const sdb_service_t *)obj;
 +      sdb_service_t *new;
 +
 +      new = sdb_service_create(svc->hostname, svc->_name);
 +      if (! new)
 +              return NULL;
 +
 +      new->_last_update = svc->_last_update;
 +      return SDB_OBJ(new);
 +} /* sdb_svc_clone */
 +
 +const sdb_type_t sdb_host_type = {
 +      sizeof(sdb_host_t),
 +
 +      sdb_host_init,
 +      sdb_host_destroy,
 +      sdb_host_do_clone
 +};
 +
 +const sdb_type_t sdb_attribute_type = {
 +      sizeof(sdb_attribute_t),
 +
 +      sdb_attr_init,
 +      sdb_attr_destroy,
 +      sdb_attr_clone
 +};
 +
 +const sdb_type_t sdb_service_type = {
 +      sizeof(sdb_service_t),
 +
 +      sdb_svc_init,
 +      sdb_svc_destroy,
 +      sdb_svc_clone
 +};
 +
  /*
   * public API
   */
@@@ -277,12 -187,45 +277,12 @@@ sdb_host_create(const char *name
        if (! name)
                return NULL;
  
 -      obj = sdb_object_create(sizeof(sdb_host_t), sdb_host_init,
 -                      sdb_host_destroy, name);
 +      obj = sdb_object_create(sdb_host_type, name);
        if (! obj)
                return NULL;
        return SDB_HOST(obj);
  } /* sdb_host_create */
  
 -sdb_host_t *
 -sdb_host_clone(const sdb_host_t *host)
 -{
 -      sdb_host_t *new;
 -
 -      new = sdb_host_create(host->_name);
 -      if (! new)
 -              return NULL;
 -
 -      /* make sure these are initialized; else sdb_object_deref() might access
 -       * arbitrary memory in case of an error */
 -      new->services = new->attributes = NULL;
 -
 -      if (host->attributes) {
 -              new->attributes = sdb_llist_clone(host->attributes);
 -              if (! new->attributes) {
 -                      sdb_object_deref(SDB_OBJ(new));
 -                      return NULL;
 -              }
 -      }
 -
 -      new->_last_update = host->_last_update;
 -      if (host->services) {
 -              new->services = sdb_llist_clone(host->services);
 -              if (! new->services) {
 -                      sdb_object_deref(SDB_OBJ(new));
 -                      return NULL;
 -              }
 -      }
 -      return new;
 -} /* sdb_host_clone */
 -
  int
  sdb_store_host(const sdb_host_t *host)
  {
                }
        }
        else {
 -              sdb_host_t *new = sdb_host_clone(host);
 +              sdb_host_t *new = SDB_HOST(sdb_object_clone(SDB_CONST_OBJ(host)));
                if (! new) {
                        char errbuf[1024];
                        sdb_log(SDB_LOG_ERR, "store: Failed to clone host object: %s",
@@@ -397,12 -340,27 +397,12 @@@ sdb_attribute_create(const char *hostna
        if ((! hostname) || (! name) || (! value))
                return NULL;
  
 -      obj = sdb_object_create(sizeof(sdb_attribute_t), sdb_attr_init,
 -                      sdb_attr_destroy, hostname, name, value);
 +      obj = sdb_object_create(sdb_attribute_type, hostname, name, value);
        if (! obj)
                return NULL;
        return SDB_ATTR(obj);
  } /* sdb_attribute_create */
  
 -sdb_attribute_t *
 -sdb_attribute_clone(const sdb_attribute_t *attr)
 -{
 -      sdb_attribute_t *new;
 -
 -      new = sdb_attribute_create(attr->hostname,
 -                      attr->_name, attr->attr_value);
 -      if (! new)
 -              return NULL;
 -
 -      new->_last_update = attr->_last_update;
 -      return new;
 -} /* sdb_attribute_clone */
 -
  int
  sdb_store_attribute(const sdb_attribute_t *attr)
  {
                }
        }
        else {
 -              sdb_attribute_t *new = sdb_attribute_clone(attr);
 +              sdb_attribute_t *new = SDB_ATTR(sdb_object_clone(SDB_CONST_OBJ(attr)));
                if (! new) {
                        char errbuf[1024];
                        sdb_log(SDB_LOG_ERR, "store: Failed to clone attribute "
@@@ -482,12 -440,26 +482,12 @@@ sdb_service_create(const char *hostname
        if ((! hostname) || (! name))
                return NULL;
  
 -      obj = sdb_object_create(sizeof(sdb_service_t), sdb_svc_init,
 -                      sdb_svc_destroy, hostname, name);
 +      obj = sdb_object_create(sdb_service_type, hostname, name);
        if (! obj)
                return NULL;
        return SDB_SVC(obj);
  } /* sdb_service_create */
  
 -sdb_service_t *
 -sdb_service_clone(const sdb_service_t *svc)
 -{
 -      sdb_service_t *new;
 -
 -      new = sdb_service_create(svc->hostname, svc->_name);
 -      if (! new)
 -              return NULL;
 -
 -      new->_last_update = svc->_last_update;
 -      return new;
 -} /* sdb_service_clone */
 -
  int
  sdb_store_service(const sdb_service_t *svc)
  {
                }
        }
        else {
 -              sdb_service_t *new = sdb_service_clone(svc);
 +              sdb_service_t *new = SDB_SVC(sdb_object_clone(SDB_CONST_OBJ(svc)));
                if (! new) {
                        char errbuf[1024];
                        sdb_log(SDB_LOG_ERR, "store: Failed to clone service "
diff --combined src/include/core/store.h
index a6f58cbdab8e00eca517557d14d68736c3600263,6bda96783763f2e0234a5eb089857ed40acc23ff..7cdfbf0576671a2e119f2fa78d28201deb77680d
@@@ -30,7 -30,7 +30,7 @@@
  
  #include "sysdb.h"
  #include "core/object.h"
- #include "utils/time.h"
+ #include "core/time.h"
  #include "utils/llist.h"
  
  #include <stdio.h>
  extern "C" {
  #endif
  
 +extern const sdb_type_t sdb_host_type;
 +extern const sdb_type_t sdb_attribute_type;
 +extern const sdb_type_t sdb_service_type;
 +
  typedef struct {
        sdb_object_t parent;
  
        sdb_time_t last_update;
        char *name;
  } sdb_store_obj_t;
 -#define SDB_STORE_OBJ_INIT { SDB_OBJECT_INIT, 0, NULL }
 +#define SDB_STORE_OBJ_INIT(t) { SDB_OBJECT_TYPED_INIT(t), 0, NULL }
  #define SDB_STORE_OBJ(obj) ((sdb_store_obj_t *)(obj))
 +#define SDB_CONST_STORE_OBJ(obj) ((const sdb_store_obj_t *)(obj))
  
  typedef struct {
        sdb_store_obj_t parent;
  
        char *hostname;
  } sdb_service_t;
 -#define SDB_SVC_INIT { SDB_STORE_OBJ_INIT, NULL }
 +#define SDB_SVC_INIT { SDB_STORE_OBJ_INIT(sdb_service_type), NULL }
  #define SDB_SVC(obj) ((sdb_service_t *)(obj))
 +#define SDB_CONST_SVC(obj) ((const sdb_service_t *)(obj))
  
  typedef struct {
        sdb_store_obj_t parent;
@@@ -68,9 -62,8 +68,9 @@@
        char *attr_value;
        char *hostname;
  } sdb_attribute_t;
 -#define SDB_ATTR_INIT { SDB_STORE_OBJ_INIT, NULL, NULL }
 +#define SDB_ATTR_INIT { SDB_STORE_OBJ_INIT(sdb_attribute_type), NULL, NULL }
  #define SDB_ATTR(obj) ((sdb_attribute_t *)(obj))
 +#define SDB_CONST_ATTR(obj) ((const sdb_attribute_t *)(obj))
  
  typedef struct {
        sdb_store_obj_t parent;
@@@ -78,9 -71,8 +78,9 @@@
        sdb_llist_t *attributes;
        sdb_llist_t *services;
  } sdb_host_t;
 -#define SDB_HOST_INIT { SDB_STORE_OBJ_INIT, NULL, NULL }
 +#define SDB_HOST_INIT { SDB_STORE_OBJ_INIT(sdb_host_type), NULL, NULL }
  #define SDB_HOST(obj) ((sdb_host_t *)(obj))
 +#define SDB_CONST_HOST(obj) ((const sdb_host_t *)(obj))
  
  /* shortcuts for accessing the sdb_store_obj_t attributes of inheriting
   * objects */
@@@ -90,6 -82,9 +90,6 @@@
  sdb_host_t *
  sdb_host_create(const char *name);
  
 -sdb_host_t *
 -sdb_host_clone(const sdb_host_t *host);
 -
  /*
   * sdb_store_host:
   * Add/update a host in the store. If the host, identified by its name,
@@@ -114,6 -109,9 +114,6 @@@ sdb_attribute_t 
  sdb_attribute_create(const char *hostname,
                const char *name, const char *value);
  
 -sdb_attribute_t *
 -sdb_attribute_clone(const sdb_attribute_t *attr);
 -
  /*
   * sdb_store_attribute:
   * Add/update a host's attribute in the store. If the attribute, identified by
@@@ -136,6 -134,9 +136,6 @@@ sdb_store_attribute(const sdb_attribute
  sdb_service_t *
  sdb_service_create(const char *hostname, const char *name);
  
 -sdb_service_t *
 -sdb_service_clone(const sdb_service_t *svc);
 -
  /*
   * sdb_store_service:
   * Add/update a store in the store. If the service, identified by its name,