Re: [PATCH 04/14] Move corosync core to use icmap

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Steven Dake <sdake@xxxxxxxxxx>

On 12/14/2011 08:41 AM, Jan Friesse wrote:
> Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx>
> ---
>  exec/apidef.c                    |   32 --
>  exec/apidef.h                    |    3 -
>  exec/coroparse.c                 |  745 ++++++++++++++++++++++++++++++++++----
>  exec/evil.c                      |    1 -
>  exec/ipc_glue.c                  |  294 +++++++---------
>  exec/main.c                      |  603 +++++++------------------------
>  exec/main.h                      |    1 -
>  exec/mainconfig.c                |  450 +++++++-----------------
>  exec/mainconfig.h                |   15 -
>  exec/objdb.c                     |   12 +-
>  exec/service.c                   |  398 +++++++-------------
>  exec/service.h                   |    3 +-
>  exec/totemconfig.c               |  472 +++++++-----------------
>  exec/totemconfig.h               |    3 -
>  exec/vsf_quorum.c                |   52 +--
>  include/corosync/engine/config.h |    6 +-
>  lib/sa-confdb.c                  |    4 +-
>  17 files changed, 1361 insertions(+), 1733 deletions(-)
> 
> diff --git a/exec/apidef.c b/exec/apidef.c
> index 2d0b6cd..5d738c9 100644
> --- a/exec/apidef.c
> +++ b/exec/apidef.c
> @@ -151,38 +151,6 @@ static struct corosync_api_v1 apidef_corosync_api_v1 = {
>  	.poll_dispatch_delete = cs_poll_dispatch_delete
>  };
>  
> -void apidef_init (struct objdb_iface_ver0 *objdb) {
> -	apidef_corosync_api_v1.object_create = objdb->object_create;
> -	apidef_corosync_api_v1.object_priv_set = objdb->object_priv_set;
> -	apidef_corosync_api_v1.object_key_create = objdb->object_key_create;
> -	apidef_corosync_api_v1.object_destroy = objdb->object_destroy;
> -	apidef_corosync_api_v1.object_valid_set = objdb->object_valid_set;
> -	apidef_corosync_api_v1.object_key_valid_set = objdb->object_key_valid_set;
> -	apidef_corosync_api_v1.object_find_create = objdb->object_find_create;
> -	apidef_corosync_api_v1.object_find_next = objdb->object_find_next;
> -	apidef_corosync_api_v1.object_find_destroy = objdb->object_find_destroy;
> -	apidef_corosync_api_v1.object_key_get = objdb->object_key_get;
> -	apidef_corosync_api_v1.object_priv_get = objdb->object_priv_get;
> -	apidef_corosync_api_v1.object_key_replace = objdb->object_key_replace;
> -	apidef_corosync_api_v1.object_key_delete = objdb->object_key_delete;
> -	apidef_corosync_api_v1.object_iter_reset = objdb->object_iter_reset;
> -	apidef_corosync_api_v1.object_iter = objdb->object_iter;
> -	apidef_corosync_api_v1.object_key_iter = objdb->object_key_iter;
> -	apidef_corosync_api_v1.object_parent_get = objdb->object_parent_get;
> -	apidef_corosync_api_v1.object_name_get = objdb->object_name_get;
> -	apidef_corosync_api_v1.object_dump = objdb->object_dump;
> -	apidef_corosync_api_v1.object_key_iter_from = objdb->object_key_iter_from;
> -	apidef_corosync_api_v1.object_track_start = objdb->object_track_start;
> -	apidef_corosync_api_v1.object_track_stop = objdb->object_track_stop;
> -	apidef_corosync_api_v1.object_write_config = objdb->object_write_config;
> -	apidef_corosync_api_v1.object_reload_config = objdb->object_reload_config;
> -	apidef_corosync_api_v1.object_key_increment = objdb->object_key_increment;
> -	apidef_corosync_api_v1.object_key_decrement = objdb->object_key_decrement;
> -	apidef_corosync_api_v1.object_key_create_typed = objdb->object_key_create_typed;
> -	apidef_corosync_api_v1.object_key_get_typed = objdb->object_key_get_typed;
> -	apidef_corosync_api_v1.object_key_iter_typed = objdb->object_key_iter_typed;
> -}
> -
>  struct corosync_api_v1 *apidef_get (void)
>  {
>  	return (&apidef_corosync_api_v1);
> diff --git a/exec/apidef.h b/exec/apidef.h
> index 5e2a1f1..efb72ca 100644
> --- a/exec/apidef.h
> +++ b/exec/apidef.h
> @@ -35,11 +35,8 @@
>  #ifndef APIDEF_H_DEFINED
>  #define APIDEF_H_DEFINED
>  
> -#include <corosync/engine/objdb.h>
>  #include <corosync/engine/coroapi.h>
>  
> -void apidef_init (struct objdb_iface_ver0 *objdb);
> -
>  extern struct corosync_api_v1 *apidef_get (void);
>  
>  #endif /* APIDEF_H_DEFINED*/
> diff --git a/exec/coroparse.c b/exec/coroparse.c
> index 302c306..e88f9cf 100644
> --- a/exec/coroparse.c
> +++ b/exec/coroparse.c
> @@ -1,9 +1,10 @@
>  /*
> - * Copyright (c) 2006, 2009 Red Hat, Inc.
> + * Copyright (c) 2006, 2011 Red Hat, Inc.
>   *
>   * All rights reserved.
>   *
>   * Author: Patrick Caulfield (pcaulfie@xxxxxxxxxx)
> + *         Jan Friesse (jfriesse@xxxxxxxxxx)
>   *
>   * This software licensed under BSD license, the text of which follows:
>   *
> @@ -50,37 +51,144 @@
>  #include <dirent.h>
>  #include <limits.h>
>  #include <stddef.h>
> +#include <grp.h>
> +#include <pwd.h>
>  
> +#include <corosync/list.h>
>  #include <corosync/lcr/lcr_comp.h>
> -#include <corosync/engine/objdb.h>
> -#include <corosync/engine/config.h>
>  #include <qb/qbutil.h>
>  #define LOGSYS_UTILS_ONLY 1
>  #include <corosync/engine/logsys.h>
> +#include <corosync/engine/icmap.h>
> +#include <corosync/engine/config.h>
>  
>  #include "util.h"
>  
> -static int read_config_file_into_objdb(
> -	struct objdb_iface_ver0 *objdb,
> +enum parser_cb_type {
> +	PARSER_CB_START,
> +	PARSER_CB_END,
> +	PARSER_CB_SECTION_START,
> +	PARSER_CB_SECTION_END,
> +	PARSER_CB_ITEM,
> +};
> +
> +typedef int (*parser_cb_f)(const char *path,
> +			char *key,
> +			char *value,
> +			enum parser_cb_type type,
> +			const char **error_string,
> +			void *user_data);
> +
> +enum main_cp_cb_data_state {
> +	MAIN_CP_CB_DATA_STATE_NORMAL,
> +	MAIN_CP_CB_DATA_STATE_TOTEM,
> +	MAIN_CP_CB_DATA_STATE_INTERFACE,
> +	MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS,
> +	MAIN_CP_CB_DATA_STATE_UIDGID,
> +	MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON,
> +	MAIN_CP_CB_DATA_STATE_MEMBER,
> +	MAIN_CP_CB_DATA_STATE_QUORUM,
> +};
> +
> +struct key_value_list_item {
> +	char *key;
> +	char *value;
> +	struct list_head list;
> +};
> +
> +struct main_cp_cb_data {
> +	enum main_cp_cb_data_state state;
> +
> +	int ringnumber;
> +	char *bindnetaddr;
> +	char *mcastaddr;
> +	char *broadcast;
> +	int mcastport;
> +	int ttl;
> +
> +	struct list_head logger_subsys_items_head;
> +	char *subsys;
> +	char *logging_daemon_name;
> +	struct list_head member_items_head;
> +};
> +
> +static int read_config_file_into_icmap(
>  	const char **error_string);
>  static char error_string_response[512];
>  
> +static int uid_determine (const char *req_user)
> +{
> +	int pw_uid = 0;
> +	struct passwd passwd;
> +	struct passwd* pwdptr = &passwd;
> +	struct passwd* temp_pwd_pt;
> +	char *pwdbuffer;
> +	int  pwdlinelen;
> +
> +	pwdlinelen = sysconf (_SC_GETPW_R_SIZE_MAX);
> +
> +	if (pwdlinelen == -1) {
> +	        pwdlinelen = 256;
> +	}
> +
> +	pwdbuffer = malloc (pwdlinelen);
>  
> +	if ((getpwnam_r (req_user, pwdptr, pwdbuffer, pwdlinelen, &temp_pwd_pt)) != 0) {
> +	        sprintf (error_string_response,
> +	                "The '%s' user is not found in /etc/passwd, please read the documentation.",
> +	                req_user);
> +	        return (-1);
> +	}
> +	pw_uid = passwd.pw_uid;
> +	free (pwdbuffer);
> +
> +	return pw_uid;
> +}
> +
> +static int gid_determine (const char *req_group)
> +{
> +	int ais_gid = 0;
> +	struct group group;
> +	struct group * grpptr = &group;
> +	struct group * temp_grp_pt;
> +	char *grpbuffer;
> +	int  grplinelen;
> +
> +	grplinelen = sysconf (_SC_GETGR_R_SIZE_MAX);
> +
> +	if (grplinelen == -1) {
> +	        grplinelen = 256;
> +	}
> +
> +	grpbuffer = malloc (grplinelen);
> +
> +	if ((getgrnam_r (req_group, grpptr, grpbuffer, grplinelen, &temp_grp_pt)) != 0) {
> +	        sprintf (error_string_response,
> +	                "The '%s' group is not found in /etc/group, please read the documentation.",
> +	                req_group);
> +		return (-1);
> +	}
> +	ais_gid = group.gr_gid;
> +	free (grpbuffer);
> +
> +	return ais_gid;
> +}
>  static char *strchr_rs (const char *haystack, int byte)
>  {
>  	const char *end_address = strchr (haystack, byte);
>  	if (end_address) {
>  		end_address += 1; /* skip past { or = */
> -		end_address += strspn (end_address, " \t");
> +
> +		while (*end_address == ' ' || *end_address == '\t')
> +			end_address++;
>  	}
>  
>  	return ((char *) end_address);
>  }
>  
> -static int aisparser_readconfig (struct objdb_iface_ver0 *objdb,
> -				 const char **error_string)
> +static int aisparser_readconfig (const char **error_string)
>  {
> -	if (read_config_file_into_objdb(objdb, error_string)) {
> +	if (read_config_file_into_icmap(error_string)) {
>  		return -1;
>  	}
>  
> @@ -90,9 +198,14 @@ static int aisparser_readconfig (struct objdb_iface_ver0 *objdb,
>  
>  static char *remove_whitespace(char *string)
>  {
> -	char *start = string+strspn(string, " \t");
> -	char *end = start+(strlen(start))-1;
> +	char *start;
> +	char *end;
>  
> +	start = string;
> +	while (*start == ' ' || *start == '\t')
> +		start++;
> +
> +	end = start+(strlen(start))-1;
>  	while ((*end == ' ' || *end == '\t' || *end == ':' || *end == '{') && end > start)
>  		end--;
>  	if (end != start)
> @@ -101,25 +214,23 @@ static char *remove_whitespace(char *string)
>  	return start;
>  }
>  
> -#define PCHECK_ADD_SUBSECTION 1
> -#define PCHECK_ADD_ITEM       2
>  
> -typedef int (*parser_check_item_f)(struct objdb_iface_ver0 *objdb,
> -				hdb_handle_t parent_handle,
> -				int type,
> -				const char *name,
> -				const char **error_string);
>  
>  static int parse_section(FILE *fp,
> -			 struct objdb_iface_ver0 *objdb,
> -			 hdb_handle_t parent_handle,
> +			 char *path,
>  			 const char **error_string,
> -			 parser_check_item_f parser_check_item_call)
> +			 parser_cb_f parser_cb,
> +			 void *user_data)
>  {
>  	char line[512];
>  	int i;
>  	char *loc;
>  	int ignore_line;
> +	char new_keyname[ICMAP_KEYNAME_MAXLEN];
> +
> +	if (strcmp(path, "") == 0) {
> +		parser_cb("", NULL, NULL, PARSER_CB_START, error_string, user_data);
> +	}
>  
>  	while (fgets (line, sizeof (line), fp)) {
>  		if (strlen(line) > 0) {
> @@ -157,20 +268,22 @@ static int parse_section(FILE *fp,
>  
>  		/* New section ? */
>  		if ((loc = strchr_rs (line, '{'))) {
> -			hdb_handle_t new_parent;
>  			char *section = remove_whitespace(line);
>  
>  			loc--;
>  			*loc = '\0';
> -			if (parser_check_item_call) {
> -				if (!parser_check_item_call(objdb, parent_handle, PCHECK_ADD_SUBSECTION,
> -				    section, error_string))
> -					    return -1;
> +
> +			strcpy(new_keyname, path);
> +			if (strcmp(path, "") != 0) {
> +				strcat(new_keyname, ".");
> +			}
> +			strcat(new_keyname, section);
> +
> +			if (!parser_cb(new_keyname, NULL, NULL, PARSER_CB_SECTION_START, error_string, user_data)) {
> +				return -1;
>  			}
>  
> -			objdb->object_create (parent_handle, &new_parent,
> -					      section, strlen (section));
> -			if (parse_section(fp, objdb, new_parent, error_string, parser_check_item_call))
> +			if (parse_section(fp, new_keyname, error_string, parser_cb, user_data))
>  				return -1;
>  		}
>  
> @@ -182,59 +295,552 @@ static int parse_section(FILE *fp,
>  			*(loc-1) = '\0';
>  			key = remove_whitespace(line);
>  			value = remove_whitespace(loc);
> -			if (parser_check_item_call) {
> -				if (!parser_check_item_call(objdb, parent_handle, PCHECK_ADD_ITEM,
> -				    key, error_string))
> -					    return -1;
> +
> +			strcpy(new_keyname, path);
> +			if (strcmp(path, "") != 0) {
> +				strcat(new_keyname, ".");
> +			}
> +			strcat(new_keyname, key);
> +
> +			if (!parser_cb(new_keyname, key, value, PARSER_CB_ITEM, error_string, user_data)) {
> +				return -1;
>  			}
> -			objdb->object_key_create_typed (parent_handle, key,
> -				value, strlen (value) + 1, OBJDB_VALUETYPE_STRING);
>  		}
>  
>  		if (strchr_rs (line, '}')) {
> +			if (!parser_cb(path, NULL, NULL, PARSER_CB_SECTION_END, error_string, user_data)) {
> +				return -1;
> +			}
> +
>  			return 0;
>  		}
>  	}
>  
> -	if (parent_handle != OBJECT_PARENT_HANDLE) {
> +	if (strcmp(path, "") != 0) {
>  		*error_string = "Missing closing brace";
>  		return -1;
>  	}
>  
> +	if (strcmp(path, "") == 0) {
> +		parser_cb("", NULL, NULL, PARSER_CB_END, error_string, user_data);
> +	}
> +
>  	return 0;
>  }
>  
> -static int parser_check_item_uidgid(struct objdb_iface_ver0 *objdb,
> -			hdb_handle_t parent_handle,
> -			int type,
> -			const char *name,
> -			const char **error_string)
> +static int main_config_parser_cb(const char *path,
> +			char *key,
> +			char *value,
> +			enum parser_cb_type type,
> +			const char **error_string,
> +			void *user_data)
>  {
> -	if (type == PCHECK_ADD_SUBSECTION) {
> -		if (parent_handle != OBJECT_PARENT_HANDLE) {
> -			*error_string = "uidgid: Can't add second level subsection";
> -			return 0;
> +	int i;
> +	int add_as_string;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	struct main_cp_cb_data *data = (struct main_cp_cb_data *)user_data;
> +	struct key_value_list_item *kv_item;
> +	struct list_head *iter, *iter_next;
> +	int uid, gid;
> +
> +	switch (type) {
> +	case PARSER_CB_START:
> +		memset(data, 0, sizeof(struct main_cp_cb_data));
> +		data->state = MAIN_CP_CB_DATA_STATE_NORMAL;
> +		break;
> +	case PARSER_CB_END:
> +		break;
> +	case PARSER_CB_ITEM:
> +		add_as_string = 1;
> +
> +		switch (data->state) {
> +		case MAIN_CP_CB_DATA_STATE_NORMAL:
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_QUORUM:
> +			if ((strcmp(path, "quorum.expected_votes") == 0) ||
> +			    (strcmp(path, "quorum.votes") == 0) ||
> +			    (strcmp(path, "quorum.quorumdev_poll") == 0) ||
> +			    (strcmp(path, "quorum.leaving_timeout") == 0)) {
> +				i = atoi(value);
> +				icmap_set_uint32(path, i);
> +				add_as_string = 0;
> +			}
> +
> +			if ((strcmp(path, "quorum.disallowed") == 0) ||
> +			    (strcmp(path, "quorum.two_node") == 0) ||
> +			    (strcmp(path, "quorum.quorate") == 0)) {
> +				i = atoi(value);
> +				icmap_set_uint8(path, i);
> +				add_as_string = 0;
> +			}
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_TOTEM:
> +			if ((strcmp(path, "totem.version") == 0) ||
> +			    (strcmp(path, "totem.nodeid") == 0) ||
> +			    (strcmp(path, "totem.threads") == 0) ||
> +			    (strcmp(path, "totem.token") == 0) ||
> +			    (strcmp(path, "totem.token_retransmit") == 0) ||
> +			    (strcmp(path, "totem.hold") == 0) ||
> +			    (strcmp(path, "totem.token_retransmits_before_loss_const") == 0) ||
> +			    (strcmp(path, "totem.join") == 0) ||
> +			    (strcmp(path, "totem.send_join") == 0) ||
> +			    (strcmp(path, "totem.consensus") == 0) ||
> +			    (strcmp(path, "totem.merge") == 0) ||
> +			    (strcmp(path, "totem.downcheck") == 0) ||
> +			    (strcmp(path, "totem.fail_recv_const") == 0) ||
> +			    (strcmp(path, "totem.seqno_unchanged_const") == 0) ||
> +			    (strcmp(path, "totem.rrp_token_expired_timeout") == 0) ||
> +			    (strcmp(path, "totem.rrp_problem_count_timeout") == 0) ||
> +			    (strcmp(path, "totem.rrp_problem_count_threshold") == 0) ||
> +			    (strcmp(path, "totem.rrp_problem_count_mcast_threshold") == 0) ||
> +			    (strcmp(path, "totem.rrp_autorecovery_check_timeout") == 0) ||
> +			    (strcmp(path, "totem.heartbeat_failures_allowed") == 0) ||
> +			    (strcmp(path, "totem.max_network_delay") == 0) ||
> +			    (strcmp(path, "totem.window_size") == 0) ||
> +			    (strcmp(path, "totem.max_messages") == 0) ||
> +			    (strcmp(path, "totem.miss_count_const") == 0) ||
> +			    (strcmp(path, "totem.netmtu") == 0)) {
> +				i = atoi(value);
> +				icmap_set_uint32(path, i);
> +				add_as_string = 0;
> +			}
> +		case MAIN_CP_CB_DATA_STATE_INTERFACE:
> +			if (strcmp(path, "totem.interface.ringnumber") == 0) {
> +				data->ringnumber = atoi(value);
> +				add_as_string = 0;
> +			}
> +			if (strcmp(path, "totem.interface.bindnetaddr") == 0) {
> +				data->bindnetaddr = strdup(value);
> +				add_as_string = 0;
> +			}
> +			if (strcmp(path, "totem.interface.mcastaddr") == 0) {
> +				data->mcastaddr = strdup(value);
> +				add_as_string = 0;
> +			}
> +			if (strcmp(path, "totem.interface.broadcast") == 0) {
> +				data->broadcast = strdup(value);
> +				add_as_string = 0;
> +			}
> +			if (strcmp(path, "totem.interface.mcastport") == 0) {
> +				data->mcastport = atoi(value);
> +				if (data->mcastport < 0 || data->mcastport > 65535) {
> +					*error_string = "Invalid multicast port (should be 0..65535)";
> +
> +					return (0);
> +				};
> +				add_as_string = 0;
> +			}
> +			if (strcmp(path, "totem.interface.ttl") == 0) {
> +				data->ttl = atoi(value);
> +				if (data->ttl < 0 || data->ttl > 255) {
> +					*error_string = "Invalid TTL (should be 0..255)";
> +
> +					return (0);
> +				};
> +				add_as_string = 0;
> +			}
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS:
> +			if (strcmp(key, "subsys") == 0) {
> +				data->subsys = strdup(value);
> +				if (data->subsys == NULL) {
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +			} else {
> +				kv_item = malloc(sizeof(*kv_item));
> +				if (kv_item == NULL) {
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +				memset(kv_item, 0, sizeof(*kv_item));
> +
> +				kv_item->key = strdup(key);
> +				kv_item->value = strdup(value);
> +				if (kv_item->key == NULL || kv_item->value == NULL) {
> +					free(kv_item);
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +				list_init(&kv_item->list);
> +				list_add(&kv_item->list, &data->logger_subsys_items_head);
> +			}
> +			add_as_string = 0;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON:
> +			if (strcmp(key, "subsys") == 0) {
> +				data->subsys = strdup(value);
> +				if (data->subsys == NULL) {
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +			} else if (strcmp(key, "name") == 0) {
> +				data->logging_daemon_name = strdup(value);
> +				if (data->logging_daemon_name == NULL) {
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +			} else {
> +				kv_item = malloc(sizeof(*kv_item));
> +				if (kv_item == NULL) {
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +				memset(kv_item, 0, sizeof(*kv_item));
> +
> +				kv_item->key = strdup(key);
> +				kv_item->value = strdup(value);
> +				if (kv_item->key == NULL || kv_item->value == NULL) {
> +					free(kv_item);
> +					*error_string = "Can't alloc memory";
> +
> +					return (0);
> +				}
> +				list_init(&kv_item->list);
> +				list_add(&kv_item->list, &data->logger_subsys_items_head);
> +			}
> +			add_as_string = 0;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_UIDGID:
> +			if (strcmp(key, "uid") == 0) {
> +				uid = uid_determine(value);
> +				if (uid == -1) {
> +					*error_string = error_string_response;
> +					return (0);
> +				}
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.uid.%u",
> +						uid);
> +				icmap_set_uint8(key_name, 1);
> +				add_as_string = 0;
> +			} else if (strcmp(key, "gid") == 0) {
> +				gid = gid_determine(value);
> +				if (gid == -1) {
> +					*error_string = error_string_response;
> +					return (0);
> +				}
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.gid.%u",
> +						gid);
> +				icmap_set_uint8(key_name, 1);
> +				add_as_string = 0;
> +			} else {
> +				*error_string = "uidgid: Only uid and gid are allowed items";
> +				return (0);
> +			}
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_MEMBER:
> +			if (strcmp(key, "memberaddr") != 0) {
> +				*error_string = "Only memberaddr is allowed in member section";
> +
> +				return (0);
> +			}
> +
> +			kv_item = malloc(sizeof(*kv_item));
> +			if (kv_item == NULL) {
> +				*error_string = "Can't alloc memory";
> +
> +				return (0);
> +			}
> +			memset(kv_item, 0, sizeof(*kv_item));
> +
> +			kv_item->key = strdup(key);
> +			kv_item->value = strdup(value);
> +			if (kv_item->key == NULL || kv_item->value == NULL) {
> +				free(kv_item);
> +				*error_string = "Can't alloc memory";
> +
> +				return (0);
> +			}
> +			list_init(&kv_item->list);
> +			list_add(&kv_item->list, &data->member_items_head);
> +			add_as_string = 0;
> +			break;
>  		}
>  
> -		if (strcmp (name, "uidgid") != 0) {
> -			*error_string = "uidgid: Can't add subsection different then uidgid";
> -			return 0;
> +		if (add_as_string) {
> +			icmap_set_string(path, value);
> +		}
> +		break;
> +	case PARSER_CB_SECTION_START:
> +		if (strcmp(path, "totem.interface") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_INTERFACE;
> +			data->ringnumber = 0;
> +			data->mcastport = -1;
> +			data->ttl = -1;
> +			list_init(&data->member_items_head);
> +		};
> +		if (strcmp(path, "totem") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_TOTEM;
> +		};
> +
> +		if (strcmp(path, "logging.logger_subsys") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS;
> +			list_init(&data->logger_subsys_items_head);
> +			data->subsys = NULL;
> +		}
> +		if (strcmp(path, "logging.logging_daemon") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON;
> +			list_init(&data->logger_subsys_items_head);
> +			data->subsys = NULL;
> +			data->logging_daemon_name = NULL;
> +		}
> +		if (strcmp(path, "uidgid") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_UIDGID;
> +		}
> +		if (strcmp(path, "totem.interface.member") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_MEMBER;
> +		}
> +		if (strcmp(path, "quorum") == 0) {
> +			data->state = MAIN_CP_CB_DATA_STATE_QUORUM;
> +		}
> +		break;
> +	case PARSER_CB_SECTION_END:
> +		switch (data->state) {
> +		case MAIN_CP_CB_DATA_STATE_NORMAL:
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_INTERFACE:
> +			/*
> +			 * Create new interface section
> +			 */
> +			if (data->bindnetaddr != NULL) {
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.bindnetaddr",
> +						data->ringnumber);
> +				icmap_set_string(key_name, data->bindnetaddr);
> +
> +				free(data->bindnetaddr);
> +				data->bindnetaddr = NULL;
> +			} else {
> +				*error_string = "No bindnetaddr for interface";
> +
> +				return (0);
> +			}
> +
> +			if (data->mcastaddr != NULL) {
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.mcastaddr",
> +						data->ringnumber);
> +				icmap_set_string(key_name, data->mcastaddr);
> +
> +				free(data->mcastaddr);
> +				data->mcastaddr = NULL;
> +			}
> +
> +			if (data->broadcast != NULL) {
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.broadcast",
> +						data->ringnumber);
> +				icmap_set_string(key_name, data->broadcast);
> +
> +				free(data->broadcast);
> +				data->broadcast = NULL;
> +			}
> +
> +			if (data->mcastport > -1) {
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.mcastport",
> +						data->ringnumber);
> +				icmap_set_uint16(key_name, data->mcastport);
> +			}
> +
> +			if (data->ttl > -1) {
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.ttl",
> +						data->ringnumber);
> +				icmap_set_uint8(key_name, data->ttl);
> +			}
> +
> +			i = 0;
> +			for (iter = data->member_items_head.next;
> +			     iter != &data->member_items_head; iter = iter_next) {
> +				kv_item = list_entry(iter, struct key_value_list_item, list);
> +
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.member.%u",
> +						data->ringnumber, i);
> +				icmap_set_string(key_name, kv_item->value);
> +
> +				iter_next = iter->next;
> +
> +				free(kv_item->value);
> +				free(kv_item->key);
> +				free(kv_item);
> +				i++;
> +			}
> +
> +			data->state = MAIN_CP_CB_DATA_STATE_TOTEM;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_TOTEM:
> +			data->state = MAIN_CP_CB_DATA_STATE_NORMAL;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS:
> +			if (data->subsys == NULL) {
> +				*error_string = "No subsys key in logger_subsys directive";
> +
> +				return (0);
> +			}
> +
> +			for (iter = data->logger_subsys_items_head.next;
> +			     iter != &data->logger_subsys_items_head; iter = iter_next) {
> +				kv_item = list_entry(iter, struct key_value_list_item, list);
> +
> +				snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s.%s",
> +						data->subsys, kv_item->key);
> +				icmap_set_string(key_name, kv_item->value);
> +
> +				iter_next = iter->next;
> +
> +				free(kv_item->value);
> +				free(kv_item->key);
> +				free(kv_item);
> +			}
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s.subsys",
> +					data->subsys);
> +			icmap_set_string(key_name, data->subsys);
> +
> +			free(data->subsys);
> +
> +			data->state = MAIN_CP_CB_DATA_STATE_NORMAL;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON:
> +			if (data->logging_daemon_name == NULL) {
> +				*error_string = "No name key in logging_daemon directive";
> +
> +				return (0);
> +			}
> +
> +			for (iter = data->logger_subsys_items_head.next;
> +			     iter != &data->logger_subsys_items_head; iter = iter_next) {
> +				kv_item = list_entry(iter, struct key_value_list_item, list);
> +
> +				if (data->subsys == NULL) {
> +					if (strcmp(data->logging_daemon_name, "corosync") == 0) {
> +						snprintf(key_name, ICMAP_KEYNAME_MAXLEN,
> +								"logging.%s",
> +								kv_item->key);
> +					} else {
> +						snprintf(key_name, ICMAP_KEYNAME_MAXLEN,
> +								"logging.logging_daemon.%s.%s",
> +								data->logging_daemon_name, kv_item->key);
> +					}
> +				} else {
> +					if (strcmp(data->logging_daemon_name, "corosync") == 0) {
> +						snprintf(key_name, ICMAP_KEYNAME_MAXLEN,
> +								"logging.logger_subsys.%s.%s",
> +								data->subsys,
> +								kv_item->key);
> +					} else {
> +						snprintf(key_name, ICMAP_KEYNAME_MAXLEN,
> +								"logging.logging_daemon.%s.%s.%s",
> +								data->logging_daemon_name, data->subsys,
> +								kv_item->key);
> +					}
> +				}
> +				icmap_set_string(key_name, kv_item->value);
> +
> +				iter_next = iter->next;
> +
> +				free(kv_item->value);
> +				free(kv_item->key);
> +				free(kv_item);
> +			}
> +
> +			if (data->subsys == NULL) {
> +				if (strcmp(data->logging_daemon_name, "corosync") != 0) {
> +					snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logging_daemon.%s.name",
> +							data->logging_daemon_name);
> +					icmap_set_string(key_name, data->logging_daemon_name);
> +				}
> +			} else {
> +				if (strcmp(data->logging_daemon_name, "corosync") == 0) {
> +					snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s.subsys",
> +							data->subsys);
> +					icmap_set_string(key_name, data->subsys);
> +
> +				} else {
> +					snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logging_daemon.%s.%s.subsys",
> +							data->logging_daemon_name, data->subsys);
> +					icmap_set_string(key_name, data->subsys);
> +					snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logging_daemon.%s.%s.name",
> +							data->logging_daemon_name, data->subsys);
> +					icmap_set_string(key_name, data->logging_daemon_name);
> +				}
> +			}
> +
> +			free(data->subsys);
> +			free(data->logging_daemon_name);
> +
> +			data->state = MAIN_CP_CB_DATA_STATE_NORMAL;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_UIDGID:
> +			data->state = MAIN_CP_CB_DATA_STATE_UIDGID;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_MEMBER:
> +			data->state = MAIN_CP_CB_DATA_STATE_INTERFACE;
> +			break;
> +		case MAIN_CP_CB_DATA_STATE_QUORUM:
> +			data->state = MAIN_CP_CB_DATA_STATE_NORMAL;
> +			break;
>  		}
> +		break;
>  	}
>  
> -	if (type == PCHECK_ADD_ITEM) {
> -		if (!(strcmp (name, "uid") == 0 || strcmp (name, "gid") == 0)) {
> +	return (1);
> +}
> +
> +static int uidgid_config_parser_cb(const char *path,
> +			char *key,
> +			char *value,
> +			enum parser_cb_type type,
> +			const char **error_string,
> +			void *user_data)
> +{
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	int uid, gid;
> +
> +	switch (type) {
> +	case PARSER_CB_START:
> +		break;
> +	case PARSER_CB_END:
> +		break;
> +	case PARSER_CB_ITEM:
> +		if (strcmp(path, "uidgid.uid") == 0) {
> +			uid = uid_determine(value);
> +			if (uid == -1) {
> +				*error_string = error_string_response;
> +				return (0);
> +			}
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.uid.%u",
> +					uid);
> +			icmap_set_uint8(key_name, 1);
> +		} else if (strcmp(key, "uidgid.gid") == 0) {
> +			gid = gid_determine(value);
> +			if (gid == -1) {
> +				*error_string = error_string_response;
> +				return (0);
> +			}
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.gid.%u",
> +					gid);
> +			icmap_set_uint8(key_name, 1);
> +		} else {
>  			*error_string = "uidgid: Only uid and gid are allowed items";
> -			return 0;
> +			return (0);
>  		}
> +		break;
> +	case PARSER_CB_SECTION_START:
> +		if (strcmp(path, "uidgid") != 0) {
> +			*error_string = "uidgid: Can't add subsection different then uidgid";
> +			return (0);
> +		};
> +		break;
> +	case PARSER_CB_SECTION_END:
> +		break;
>  	}
>  
> -	return 1;
> +	return (1);
>  }
>  
> -
> -static int read_uidgid_files_into_objdb(
> -	struct objdb_iface_ver0 *objdb,
> +static int read_uidgid_files_into_icmap(
>  	const char **error_string)
>  {
>  	FILE *fp;
> @@ -247,6 +853,7 @@ static int read_uidgid_files_into_objdb(
>  	size_t len;
>  	int return_code;
>  	struct stat stat_buf;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
>  
>  	dirname = COROSYSCONFDIR "/uidgid.d";
>  	dp = opendir (dirname);
> @@ -273,7 +880,9 @@ static int read_uidgid_files_into_objdb(
>  			fp = fopen (filename, "r");
>  			if (fp == NULL) continue;
>  
> -			res = parse_section(fp, objdb, OBJECT_PARENT_HANDLE, error_string, parser_check_item_uidgid);
> +			key_name[0] = 0;
> +
> +			res = parse_section(fp, key_name, error_string, uidgid_config_parser_cb, NULL);
>  
>  			fclose (fp);
>  
> @@ -290,8 +899,7 @@ error_exit:
>  	return res;
>  }
>  
> -static int read_service_files_into_objdb(
> -	struct objdb_iface_ver0 *objdb,
> +static int read_service_files_into_icmap(
>  	const char **error_string)
>  {
>  	FILE *fp;
> @@ -304,6 +912,8 @@ static int read_service_files_into_objdb(
>  	struct stat stat_buf;
>  	size_t len;
>  	int return_code;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	struct main_cp_cb_data data;
>  
>  	dirname = COROSYSCONFDIR "/service.d";
>  	dp = opendir (dirname);
> @@ -330,7 +940,9 @@ static int read_service_files_into_objdb(
>  			fp = fopen (filename, "r");
>  			if (fp == NULL) continue;
>  
> -			res = parse_section(fp, objdb, OBJECT_PARENT_HANDLE, error_string, NULL);
> +			key_name[0] = 0;
> +
> +			res = parse_section(fp, key_name, error_string, main_config_parser_cb, &data);
>  
>  			fclose (fp);
>  
> @@ -347,15 +959,16 @@ error_exit:
>  	return res;
>  }
>  
> -/* Read config file and load into objdb */
> -static int read_config_file_into_objdb(
> -	struct objdb_iface_ver0 *objdb,
> +/* Read config file and load into icmap */
> +static int read_config_file_into_icmap(
>  	const char **error_string)
>  {
>  	FILE *fp;
>  	const char *filename;
>  	char *error_reason = error_string_response;
>  	int res;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	struct main_cp_cb_data data;
>  
>  	filename = getenv ("COROSYNC_MAIN_CONFIG_FILE");
>  	if (!filename)
> @@ -372,16 +985,18 @@ static int read_config_file_into_objdb(
>  		return -1;
>  	}
>  
> -	res = parse_section(fp, objdb, OBJECT_PARENT_HANDLE, error_string, NULL);
> +	key_name[0] = 0;
> +
> +	res = parse_section(fp, key_name, error_string, main_config_parser_cb, &data);
>  
>  	fclose(fp);
>  
>  	if (res == 0) {
> -	        res = read_uidgid_files_into_objdb(objdb, error_string);
> +	        res = read_uidgid_files_into_icmap(error_string);
>  	}
>  
>  	if (res == 0) {
> -	        res = read_service_files_into_objdb(objdb, error_string);
> +	        res = read_service_files_into_icmap(error_string);
>  	}
>  
>  	if (res == 0) {
> diff --git a/exec/evil.c b/exec/evil.c
> index 9ad8a21..94db799 100644
> --- a/exec/evil.c
> +++ b/exec/evil.c
> @@ -70,7 +70,6 @@
>  #include <corosync/corodefs.h>
>  #include <corosync/list.h>
>  #include <corosync/lcr/lcr_ifact.h>
> -#include <corosync/engine/objdb.h>
>  #include <corosync/engine/config.h>
>  #include <corosync/engine/coroapi.h>
>  #include <corosync/engine/logsys.h>
> diff --git a/exec/ipc_glue.c b/exec/ipc_glue.c
> index 8ec7c96..6dadcd5 100644
> --- a/exec/ipc_glue.c
> +++ b/exec/ipc_glue.c
> @@ -51,9 +51,8 @@
>  #include <corosync/corotypes.h>
>  #include <corosync/corodefs.h>
>  #include <corosync/totem/totempg.h>
> -#include <corosync/engine/objdb.h>
> -#include <corosync/engine/config.h>
>  #include <corosync/engine/logsys.h>
> +#include <corosync/engine/icmap.h>
>  
>  #include "mainconfig.h"
>  #include "sync.h"
> @@ -71,7 +70,6 @@ static int32_t ipc_not_enough_fds_left = 0;
>  static int32_t ipc_fc_is_quorate; /* boolean */
>  static int32_t ipc_fc_totem_queue_level; /* percentage used */
>  static int32_t ipc_fc_sync_in_process; /* boolean */
> -static qb_handle_t object_connection_handle;
>  
>  struct cs_ipcs_mapper {
>  	int32_t id;
> @@ -187,6 +185,9 @@ static const char* cs_ipcs_serv_short_name(int32_t service_id)
>  	case WD_SERVICE:
>  		name = "wd";
>  		break;
> +	case CMAP_SERVICE:
> +		name = "cmap";
> +		break;
>  	default:
>  		name = NULL;
>  		break;
> @@ -205,8 +206,9 @@ int32_t cs_ipcs_service_destroy(int32_t service_id)
>  
>  static int32_t cs_ipcs_connection_accept (qb_ipcs_connection_t *c, uid_t euid, gid_t egid)
>  {
> -	struct list_head *iter;
>  	int32_t service = qb_ipcs_service_id_get(c);
> +	uint8_t u8;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
>  
>  	if (ais_service[service] == NULL ||
>  		ais_service_exiting[service] ||
> @@ -222,15 +224,14 @@ static int32_t cs_ipcs_connection_accept (qb_ipcs_connection_t *c, uid_t euid, g
>  		return 0;
>  	}
>  
> -	for (iter = uidgid_list_head.next; iter != &uidgid_list_head;
> -		iter = iter->next) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.uid.%u", euid);
> +	if (icmap_get_uint8(key_name, &u8) == CS_OK && u8 == 1)
> +		return 0;
>  
> -		struct uidgid_item *ugi = qb_list_entry (iter, struct uidgid_item,
> -			list);
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.gid.%u", egid);
> +	if (icmap_get_uint8(key_name, &u8) == CS_OK && u8 == 1)
> +		return 0;
>  
> -		if (euid == ugi->uid || egid == ugi->gid)
> -			return 0;
> -	}
>  	log_printf(LOGSYS_LEVEL_ERROR, "Denied connection attempt from %d:%d", euid, egid);
>  
>  	return -EACCES;
> @@ -280,9 +281,8 @@ static char * pid_to_name (pid_t pid, char *out_name, size_t name_len)
>  	return out_name;
>  }
>  
> -
>  struct cs_ipcs_conn_context {
> -	qb_handle_t stats_handle;
> +	char *icmap_path;
>  	struct list_head outq_head;
>  	int32_t queuing;
>  	uint32_t queued;
> @@ -295,15 +295,13 @@ struct cs_ipcs_conn_context {
>  static void cs_ipcs_connection_created(qb_ipcs_connection_t *c)
>  {
>  	int32_t service = 0;
> -	uint32_t zero_32 = 0;
> -	uint64_t zero_64 = 0;
> -	unsigned int key_incr_dummy;
> -	qb_handle_t object_handle;
>  	struct cs_ipcs_conn_context *context;
> -	char conn_name[42];
>  	char proc_name[32];
>  	struct qb_ipcs_connection_stats stats;
>  	int32_t size = sizeof(struct cs_ipcs_conn_context);
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	int set_client_pid = 0;
> +	int set_proc_name = 0;
>  
>  	log_printf(LOG_INFO, "%s() new connection", __func__);
>  
> @@ -321,95 +319,75 @@ static void cs_ipcs_connection_created(qb_ipcs_connection_t *c)
>  
>  	ais_service[service]->lib_init_fn(c);
>  
> -	api->object_key_increment (object_connection_handle,
> -		"active", strlen("active"),
> -		&key_incr_dummy);
> +	icmap_inc("runtime.connections.active");
>  
>  	qb_ipcs_connection_stats_get(c, &stats, QB_FALSE);
>  
>  	if (stats.client_pid > 0) {
>  		if (pid_to_name (stats.client_pid, proc_name, sizeof(proc_name))) {
> -			snprintf (conn_name,
> -				sizeof(conn_name),
> -				"%s:%d:%p", proc_name,
> -				stats.client_pid, c);
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.connections.%s:%u:%p",
> +					proc_name, stats.client_pid, c);
> +			set_proc_name = 1;
>  		} else {
> -			snprintf (conn_name,
> -				sizeof(conn_name),
> -				"%d:%p",
> -				stats.client_pid, c);
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.connections.%u:%p",
> +					stats.client_pid, c);
>  		}
> +		set_client_pid = 1;
>  	} else {
> -		snprintf (conn_name,
> -			sizeof(conn_name),
> -			"%p", c);
> -	}
> -
> -	api->object_create (object_connection_handle,
> -		&object_handle,
> -		conn_name,
> -		strlen (conn_name));
> -	context->stats_handle = object_handle;
> -
> -	api->object_key_create_typed (object_handle,
> -		"service_id",
> -		&zero_32, sizeof (zero_32),
> -		OBJDB_VALUETYPE_UINT32);
> -
> -	api->object_key_create_typed (object_handle,
> -		"client_pid",
> -		&zero_32, sizeof (zero_32),
> -		OBJDB_VALUETYPE_INT32);
> -
> -	api->object_key_create_typed (object_handle,
> -		"responses",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"dispatched",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"requests",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_INT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"send_retries",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"recv_retries",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"flow_control",
> -		&zero_32, sizeof (zero_32),
> -		OBJDB_VALUETYPE_UINT32);
> -
> -	api->object_key_create_typed (object_handle,
> -		"flow_control_count",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"queue_size",
> -		&zero_32, sizeof (zero_32),
> -		OBJDB_VALUETYPE_UINT32);
> -
> -	api->object_key_create_typed (object_handle,
> -		"invalid_request",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -
> -	api->object_key_create_typed (object_handle,
> -		"overload",
> -		&zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.connections.%p", c);
> +	}
> +
> +	icmap_convert_name_to_valid_name(key_name);
> +
> +	context->icmap_path = strdup(key_name);
> +	if (context->icmap_path == NULL) {
> +		return ;
> +	}
> +
> +	if (set_proc_name) {
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.name", context->icmap_path);
> +		icmap_set_string(key_name, proc_name);
> +	}
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.client_pid", context->icmap_path);
> +	if (set_client_pid) {
> +		icmap_set_uint32(key_name, stats.client_pid);
> +	} else {
> +		icmap_set_uint32(key_name, 0);
> +	}
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.service_id", context->icmap_path);
> +	icmap_set_uint32(key_name, service);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.responses", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.dispatched", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.requests", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.send_retries", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.recv_retries", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.flow_control", context->icmap_path);
> +	icmap_set_uint32(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.flow_control_count", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.queue_size", context->icmap_path);
> +	icmap_set_uint32(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.invalid_request", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
> +
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.overload", context->icmap_path);
> +	icmap_set_uint64(key_name, 0);
>  }
>  
>  void cs_ipc_refcnt_inc(void *conn)
> @@ -455,10 +433,12 @@ static void cs_ipcs_connection_destroyed (qb_ipcs_connection_t *c)
>  
>  static int32_t cs_ipcs_connection_closed (qb_ipcs_connection_t *c)
>  {
> -	struct cs_ipcs_conn_context *cnx;
> -	unsigned int key_incr_dummy;
>  	int32_t res = 0;
>  	int32_t service = qb_ipcs_service_id_get(c);
> +	icmap_iter_t iter;
> +	char prefix[ICMAP_KEYNAME_MAXLEN];
> +	const char *key_name;
> +	struct cs_ipcs_conn_context *cnx;
>  
>  	log_printf(LOG_INFO, "%s() ", __func__);
>  	res = ais_service[service]->lib_exit_fn(c);
> @@ -467,14 +447,16 @@ static int32_t cs_ipcs_connection_closed (qb_ipcs_connection_t *c)
>  	}
>  
>  	cnx = qb_ipcs_context_get(c);
> -	api->object_destroy (cnx->stats_handle);
>  
> -	api->object_key_increment (object_connection_handle,
> -		"closed", strlen("closed"),
> -		&key_incr_dummy);
> -	api->object_key_decrement (object_connection_handle,
> -		"active", strlen("active"),
> -		&key_incr_dummy);
> +	snprintf(prefix, ICMAP_KEYNAME_MAXLEN, "%s.", cnx->icmap_path);
> +	iter = icmap_iter_init(prefix);
> +	while ((key_name = icmap_iter_next(iter, NULL, NULL)) != NULL) {
> +		icmap_delete(key_name);
> +	}
> +	free(cnx->icmap_path);
> +
> +	icmap_inc("runtie.connections.closed");
> +	icmap_dec("runtime.connections.active");
>  
>  	return 0;
>  }
> @@ -787,6 +769,7 @@ void cs_ipcs_stats_update(void)
>  	struct qb_ipcs_connection_stats stats;
>  	qb_ipcs_connection_t *c;
>  	struct cs_ipcs_conn_context *cnx;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
>  
>  	for (i = 0; i < SERVICE_HANDLER_MAXIMUM_COUNT; i++) {
>  		if (ais_service[i] == NULL || ipcs_mapper[i].inst == NULL) {
> @@ -802,40 +785,39 @@ void cs_ipcs_stats_update(void)
>  
>  			qb_ipcs_connection_stats_get(c, &stats, QB_FALSE);
>  
> -			api->object_key_replace(cnx->stats_handle,
> -				"client_pid", strlen("client_pid"),
> -				&stats.client_pid, sizeof(uint32_t));
> -
> -			api->object_key_replace(cnx->stats_handle,
> -				"requests", strlen("requests"),
> -				&stats.requests, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"responses", strlen("responses"),
> -				&stats.responses, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"dispatched", strlen("dispatched"),
> -				&stats.events, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"send_retries", strlen("send_retries"),
> -				&stats.send_retries, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"recv_retries", strlen("recv_retries"),
> -				&stats.recv_retries, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"flow_control", strlen("flow_control"),
> -				&stats.flow_control_state, sizeof(uint32_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"flow_control_count", strlen("flow_control_count"),
> -				&stats.flow_control_count, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"queue_size", strlen("queue_size"),
> -				&cnx->queued, sizeof(uint32_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"invalid_request", strlen("invalid_request"),
> -				&cnx->invalid_request, sizeof(uint64_t));
> -			api->object_key_replace(cnx->stats_handle,
> -				"overload", strlen("overload"),
> -				&cnx->overload, sizeof(uint64_t));
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.client_pid", cnx->icmap_path);
> +			icmap_set_uint32(key_name, stats.client_pid);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.requests", cnx->icmap_path);
> +			icmap_set_uint64(key_name, stats.requests);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.responses", cnx->icmap_path);
> +			icmap_set_uint64(key_name, stats.responses);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.dispatched", cnx->icmap_path);
> +			icmap_set_uint64(key_name, stats.events);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.send_retries", cnx->icmap_path);
> +			icmap_set_uint64(key_name, stats.send_retries);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.recv_retries", cnx->icmap_path);
> +			icmap_set_uint64(key_name, stats.recv_retries);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.flow_control", cnx->icmap_path);
> +			icmap_set_uint32(key_name, stats.flow_control_state);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.flow_control_count", cnx->icmap_path);
> +			icmap_set_uint64(key_name, stats.flow_control_count);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.queue_size", cnx->icmap_path);
> +			icmap_set_uint32(key_name, cnx->queued);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.invalid_request", cnx->icmap_path);
> +			icmap_set_uint64(key_name, cnx->invalid_request);
> +
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.overload", cnx->icmap_path);
> +			icmap_set_uint64(key_name, cnx->overload);
> +
>  			qb_ipcs_connection_unref(c);
>  		}
>  	}
> @@ -868,10 +850,6 @@ void cs_ipcs_service_init(struct corosync_service_engine *service)
>  
>  void cs_ipcs_init(void)
>  {
> -	qb_handle_t object_find_handle;
> -	qb_handle_t object_runtime_handle;
> -	uint64_t zero_64 = 0;
> -
>  	api = apidef_get ();
>  
>  	qb_loop_poll_low_fds_event_set(cs_poll_handle_get(), cs_ipcs_low_fds_event);
> @@ -879,27 +857,9 @@ void cs_ipcs_init(void)
>  	api->quorum_register_callback (cs_ipcs_fc_quorum_changed, NULL);
>  	totempg_queue_level_register_callback (cs_ipcs_totem_queue_level_changed);
>  
> -	api->object_find_create (OBJECT_PARENT_HANDLE,
> -		"runtime", strlen ("runtime"),
> -		&object_find_handle);
> -
> -	if (api->object_find_next (object_find_handle,
> -			&object_runtime_handle) != 0) {
> -		log_printf (LOGSYS_LEVEL_ERROR,"arrg no runtime");
> -		return;
> -	}
> -
> -	/* Connection objects */
> -	api->object_create (object_runtime_handle,
> -		&object_connection_handle,
> -		"connections", strlen ("connections"));
> +	icmap_set_ro_access("runtime.connections.", 1, 1);
>  
> -	api->object_key_create_typed (object_connection_handle,
> -		"active", &zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -	api->object_key_create_typed (object_connection_handle,
> -		"closed", &zero_64, sizeof (zero_64),
> -		OBJDB_VALUETYPE_UINT64);
> -	api->object_find_destroy (object_find_handle);
> +	icmap_set_uint64("runtime.connections.active", 0);
> +	icmap_set_uint64("runtime.connections.closed", 0);
>  }
>  
> diff --git a/exec/main.c b/exec/main.c
> index 0e3954a..019f659 100644
> --- a/exec/main.c
> +++ b/exec/main.c
> @@ -107,9 +107,9 @@
>  #include <corosync/list.h>
>  #include <corosync/lcr/lcr_ifact.h>
>  #include <corosync/totem/totempg.h>
> -#include <corosync/engine/objdb.h>
>  #include <corosync/engine/config.h>
>  #include <corosync/engine/logsys.h>
> +#include <corosync/engine/icmap.h>
>  
>  #include "quorum.h"
>  #include "totemsrp.h"
> @@ -150,8 +150,6 @@ static int num_config_modules;
>  
>  static struct config_iface_ver0 *config_modules[MAX_DYNAMIC_SERVICES];
>  
> -static struct objdb_iface_ver0 *objdb = NULL;
> -
>  static struct corosync_api_v1 *api = NULL;
>  
>  static enum cs_sync_mode minimum_sync_mode;
> @@ -162,8 +160,6 @@ static qb_loop_t *corosync_poll_handle;
>  
>  struct sched_param global_sched_param;
>  
> -static hdb_handle_t object_memb_handle;
> -
>  static corosync_timer_handle_t corosync_stats_timer_handle;
>  
>  static const char *corosync_lock_file = LOCALSTATEDIR"/run/corosync.pid";
> @@ -344,75 +340,30 @@ static struct memb_ring_id corosync_ring_id;
>  
>  static void member_object_joined (unsigned int nodeid)
>  {
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_node_handle;
> -	char * nodeint_str;
> -	char nodeid_str[64];
> -	unsigned int key_incr_dummy;
> -
> -	snprintf (nodeid_str, 64, "%d", nodeid);
> -
> -	objdb->object_find_create (
> -		object_memb_handle,
> -		nodeid_str,
> -		strlen (nodeid_str),
> -		&object_find_handle);
> -
> -	if (objdb->object_find_next (object_find_handle,
> -			&object_node_handle) == 0) {
> -
> -		objdb->object_key_increment (object_node_handle,
> -			"join_count", strlen("join_count"),
> -			&key_incr_dummy);
> -
> -		objdb->object_key_replace (object_node_handle,
> -			"status", strlen("status"),
> -			"joined", strlen("joined"));
> +	char member_ip[ICMAP_KEYNAME_MAXLEN];
> +	char member_join_count[ICMAP_KEYNAME_MAXLEN];
> +	char member_status[ICMAP_KEYNAME_MAXLEN];
> +
> +	snprintf(member_ip, ICMAP_KEYNAME_MAXLEN, "runtime.totem.pg.mrp.srp.members.%u.ip", nodeid);
> +	snprintf(member_join_count, ICMAP_KEYNAME_MAXLEN, "runtime.totem.pg.mrp.srp.members.%u.join_count", nodeid);
> +	snprintf(member_status, ICMAP_KEYNAME_MAXLEN, "runtime.totem.pg.mrp.srp.members.%u.status", nodeid);
> +
> +	if (icmap_get(member_ip, NULL, NULL, NULL) == CS_OK) {
> +		icmap_inc(member_join_count);
> +		icmap_set_string(member_status, "joined");
>  	} else {
> -		nodeint_str = (char*)api->totem_ifaces_print (nodeid);
> -		objdb->object_create (object_memb_handle,
> -			&object_node_handle,
> -			nodeid_str, strlen (nodeid_str));
> -
> -		objdb->object_key_create_typed (object_node_handle,
> -			"ip",
> -			nodeint_str, strlen(nodeint_str),
> -			OBJDB_VALUETYPE_STRING);
> -		key_incr_dummy = 1;
> -		objdb->object_key_create_typed (object_node_handle,
> -			"join_count",
> -			&key_incr_dummy, sizeof (key_incr_dummy),
> -			OBJDB_VALUETYPE_UINT32);
> -		objdb->object_key_create_typed (object_node_handle,
> -			"status",
> -			"joined", strlen("joined"),
> -			OBJDB_VALUETYPE_STRING);
> -	}
> -	objdb->object_find_destroy (object_find_handle);
> +		icmap_set_string(member_ip, (char*)api->totem_ifaces_print (nodeid));
> +		icmap_set_uint32(member_join_count, 1);
> +		icmap_set_string(member_status, "joined");
> +	}
>  }
>  
>  static void member_object_left (unsigned int nodeid)
>  {
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_node_handle;
> -	char nodeid_str[64];
> -
> -	snprintf (nodeid_str, 64, "%u", nodeid);
> -
> -	objdb->object_find_create (
> -		object_memb_handle,
> -		nodeid_str,
> -		strlen (nodeid_str),
> -		&object_find_handle);
> -
> -	if (objdb->object_find_next (object_find_handle,
> -			&object_node_handle) == 0) {
> +	char member_status[ICMAP_KEYNAME_MAXLEN];
>  
> -		objdb->object_key_replace (object_node_handle,
> -			"status", strlen("status"),
> -			"left", strlen("left"));
> -	}
> -	objdb->object_find_destroy (object_find_handle);
> +	snprintf(member_status, ICMAP_KEYNAME_MAXLEN, "runtime.totem.pg.mrp.srp.members.%u.status", nodeid);
> +	icmap_set_string(member_status, "left");
>  }
>  
>  static void confchg_fn (
> @@ -541,102 +492,42 @@ static void corosync_mlockall (void)
>  static void corosync_totem_stats_updater (void *data)
>  {
>  	totempg_stats_t * stats;
> -	uint32_t mtt_rx_token;
>  	uint32_t total_mtt_rx_token;
> -	uint32_t avg_backlog_calc;
>  	uint32_t total_backlog_calc;
> -	uint32_t avg_token_holdtime;
>  	uint32_t total_token_holdtime;
>  	int t, prev;
>  	int32_t token_count;
> -	uint32_t firewall_enabled_or_nic_failure;
>  
>  	stats = api->totem_get_stats();
>  
> -	objdb->object_key_replace (stats->hdr.handle,
> -		"msg_reserved", strlen("msg_reserved"),
> -		&stats->msg_reserved, sizeof (stats->msg_reserved));
> -	objdb->object_key_replace (stats->hdr.handle,
> -		"msg_queue_avail", strlen("msg_queue_avail"),
> -		&stats->msg_queue_avail, sizeof (stats->msg_queue_avail));
> -
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"orf_token_tx", strlen("orf_token_tx"),
> -		&stats->mrp->srp->orf_token_tx, sizeof (stats->mrp->srp->orf_token_tx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"orf_token_rx", strlen("orf_token_rx"),
> -		&stats->mrp->srp->orf_token_rx, sizeof (stats->mrp->srp->orf_token_rx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"memb_merge_detect_tx", strlen("memb_merge_detect_tx"),
> -		&stats->mrp->srp->memb_merge_detect_tx, sizeof (stats->mrp->srp->memb_merge_detect_tx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"memb_merge_detect_rx", strlen("memb_merge_detect_rx"),
> -		&stats->mrp->srp->memb_merge_detect_rx, sizeof (stats->mrp->srp->memb_merge_detect_rx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"memb_join_tx", strlen("memb_join_tx"),
> -		&stats->mrp->srp->memb_join_tx, sizeof (stats->mrp->srp->memb_join_tx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"memb_join_rx", strlen("memb_join_rx"),
> -		&stats->mrp->srp->memb_join_rx, sizeof (stats->mrp->srp->memb_join_rx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"mcast_tx", strlen("mcast_tx"),
> -		&stats->mrp->srp->mcast_tx,	sizeof (stats->mrp->srp->mcast_tx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"mcast_retx", strlen("mcast_retx"),
> -		&stats->mrp->srp->mcast_retx, sizeof (stats->mrp->srp->mcast_retx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"mcast_rx", strlen("mcast_rx"),
> -		&stats->mrp->srp->mcast_rx, sizeof (stats->mrp->srp->mcast_rx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"memb_commit_token_tx", strlen("memb_commit_token_tx"),
> -		&stats->mrp->srp->memb_commit_token_tx, sizeof (stats->mrp->srp->memb_commit_token_tx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"memb_commit_token_rx", strlen("memb_commit_token_rx"),
> -		&stats->mrp->srp->memb_commit_token_rx, sizeof (stats->mrp->srp->memb_commit_token_rx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"token_hold_cancel_tx", strlen("token_hold_cancel_tx"),
> -		&stats->mrp->srp->token_hold_cancel_tx, sizeof (stats->mrp->srp->token_hold_cancel_tx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"token_hold_cancel_rx", strlen("token_hold_cancel_rx"),
> -		&stats->mrp->srp->token_hold_cancel_rx, sizeof (stats->mrp->srp->token_hold_cancel_rx));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"operational_entered", strlen("operational_entered"),
> -		&stats->mrp->srp->operational_entered, sizeof (stats->mrp->srp->operational_entered));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"operational_token_lost", strlen("operational_token_lost"),
> -		&stats->mrp->srp->operational_token_lost, sizeof (stats->mrp->srp->operational_token_lost));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"gather_entered", strlen("gather_entered"),
> -		&stats->mrp->srp->gather_entered, sizeof (stats->mrp->srp->gather_entered));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"gather_token_lost", strlen("gather_token_lost"),
> -		&stats->mrp->srp->gather_token_lost, sizeof (stats->mrp->srp->gather_token_lost));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"commit_entered", strlen("commit_entered"),
> -		&stats->mrp->srp->commit_entered, sizeof (stats->mrp->srp->commit_entered));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"commit_token_lost", strlen("commit_token_lost"),
> -		&stats->mrp->srp->commit_token_lost, sizeof (stats->mrp->srp->commit_token_lost));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"recovery_entered", strlen("recovery_entered"),
> -		&stats->mrp->srp->recovery_entered, sizeof (stats->mrp->srp->recovery_entered));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"recovery_token_lost", strlen("recovery_token_lost"),
> -		&stats->mrp->srp->recovery_token_lost, sizeof (stats->mrp->srp->recovery_token_lost));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"consensus_timeouts", strlen("consensus_timeouts"),
> -		&stats->mrp->srp->consensus_timeouts, sizeof (stats->mrp->srp->consensus_timeouts));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"rx_msg_dropped", strlen("rx_msg_dropped"),
> -		&stats->mrp->srp->rx_msg_dropped, sizeof (stats->mrp->srp->rx_msg_dropped));
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"continuous_gather", strlen("continuous_gather"),
> -		&stats->mrp->srp->continuous_gather, sizeof (stats->mrp->srp->continuous_gather));
> -
> -	firewall_enabled_or_nic_failure = (stats->mrp->srp->continuous_gather > MAX_NO_CONT_GATHER ? 1 : 0);
> -	objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -		"firewall_enabled_or_nic_failure", strlen("firewall_enabled_or_nic_failure"),
> -		&firewall_enabled_or_nic_failure, sizeof (firewall_enabled_or_nic_failure));
> +	icmap_set_uint32("runtime.totem.pg.msg_reserved", stats->msg_reserved);
> +	icmap_set_uint32("runtime.totem.pg.msg_queue_avail", stats->msg_queue_avail);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.orf_token_tx", stats->mrp->srp->orf_token_tx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.orf_token_rx", stats->mrp->srp->orf_token_rx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.memb_merge_detect_tx", stats->mrp->srp->memb_merge_detect_tx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.memb_merge_detect_rx", stats->mrp->srp->memb_merge_detect_rx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.memb_join_tx", stats->mrp->srp->memb_join_tx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.memb_join_rx", stats->mrp->srp->memb_join_rx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.mcast_tx", stats->mrp->srp->mcast_tx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.mcast_retx", stats->mrp->srp->mcast_retx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.mcast_rx", stats->mrp->srp->mcast_rx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.memb_commit_token_tx", stats->mrp->srp->memb_commit_token_tx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.memb_commit_token_rx", stats->mrp->srp->memb_commit_token_rx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.token_hold_cancel_tx", stats->mrp->srp->token_hold_cancel_tx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.token_hold_cancel_rx", stats->mrp->srp->token_hold_cancel_rx);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.operational_entered", stats->mrp->srp->operational_entered);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.operational_token_lost", stats->mrp->srp->operational_token_lost);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.gather_entered", stats->mrp->srp->gather_entered);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.gather_token_lost", stats->mrp->srp->gather_token_lost);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.commit_entered", stats->mrp->srp->commit_entered);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.commit_token_lost", stats->mrp->srp->commit_token_lost);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.recovery_entered", stats->mrp->srp->recovery_entered);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.recovery_token_lost", stats->mrp->srp->recovery_token_lost);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.consensus_timeouts", stats->mrp->srp->consensus_timeouts);
> +	icmap_set_uint64("runtime.totem.pg.mrp.srp.rx_msg_dropped", stats->mrp->srp->rx_msg_dropped);
> +	icmap_set_uint32("runtime.totem.pg.mrp.srp.continuous_gather", stats->mrp->srp->continuous_gather);
> +	icmap_set_uint8("runtime.totem.pg.mrp.srp.firewall_enabled_or_nic_failure",
> +		stats->mrp->srp->continuous_gather > MAX_NO_CONT_GATHER ? 1 : 0);
>  
>  	total_mtt_rx_token = 0;
>  	total_token_holdtime = 0;
> @@ -661,18 +552,9 @@ static void corosync_totem_stats_updater (void *data)
>  		t = prev;
>  	}
>  	if (token_count) {
> -		mtt_rx_token = (total_mtt_rx_token / token_count);
> -		avg_backlog_calc = (total_backlog_calc / token_count);
> -		avg_token_holdtime = (total_token_holdtime / token_count);
> -		objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -			"mtt_rx_token", strlen("mtt_rx_token"),
> -			&mtt_rx_token, sizeof (mtt_rx_token));
> -		objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -			"avg_token_workload", strlen("avg_token_workload"),
> -			&avg_token_holdtime, sizeof (avg_token_holdtime));
> -		objdb->object_key_replace (stats->mrp->srp->hdr.handle,
> -			"avg_backlog_calc", strlen("avg_backlog_calc"),
> -			&avg_backlog_calc, sizeof (avg_backlog_calc));
> +		icmap_set_uint32("runtime.totem.pg.mrp.srp.mtt_rx_token", (total_mtt_rx_token / token_count));
> +		icmap_set_uint32("runtime.totem.pg.mrp.srp.avg_token_workload", (total_token_holdtime / token_count));
> +		icmap_set_uint32("runtime.totem.pg.mrp.srp.avg_backlog_calc", (total_backlog_calc / token_count));
>  	}
>  
>  	cs_ipcs_stats_update();
> @@ -682,262 +564,82 @@ static void corosync_totem_stats_updater (void *data)
>  		&corosync_stats_timer_handle);
>  }
>  
> -static void totem_dynamic_name_to_ip (char *dest,
> -	size_t dest_size,
> -	const void *src,
> -	size_t src_len)
> -{
> -	char *p;
> -	size_t len;
> -
> -	len = (src_len + 1 > dest_size) ? dest_size-1 : src_len;
> -	memset(dest, 0, dest_size);
> -	memcpy(dest, src, len);
> -	for (p = dest; p != dest + len; p++) {
> -		if (*p == '-') {
> -			*p = '.';
> -		}
> -	}
> -}
> -
> -static void totem_dynamic_create_notify_fn (
> -	hdb_handle_t parent_object_handle,
> -	hdb_handle_t object_handle,
> -	const void *name_pt, size_t name_len,
> -	void *priv_data_pt)
> +static void totem_dynamic_notify(
> +	int32_t event,
> +	const char *key_name,
> +	struct icmap_notify_value new_val,
> +	struct icmap_notify_value old_val,
> +	void *user_data)
>  {
> +	int res;
> +	int ring_no;
> +	int member_no;
>  	struct totem_ip_address member;
> -	int ring_no; 
> -	char object_name[128];
> +	int add_new_member = 0;
> +	int remove_old_member = 0;
>  
> -	totem_dynamic_name_to_ip (object_name,
> -		sizeof object_name, name_pt, name_len);
> -	log_printf (LOGSYS_LEVEL_DEBUG,
> -		"adding dynamic member: %s\n", object_name);
> +	res = sscanf(key_name, "totem.interface.%u.member.%u", &ring_no, &member_no);
> +	if (res != 2)
> +		return ;
>  
> -	/*
> -	 * add new member
> -	 */
> -	if (totemip_parse (&member, object_name, 0) == 0) {
> -		ring_no = 0;
> -		totempg_member_add (&member, ring_no);
> +	if (event == ICMAP_TRACK_ADD && new_val.type == ICMAP_VALUETYPE_STRING) {
> +		add_new_member = 1;
>  	}
> -}
> -
> -static void totem_dynamic_destroy_notify_fn(
> -	hdb_handle_t parent_object_handle,
> -	const void *name_pt, size_t name_len,
> -	void *priv_data_pt)
> -{
> -	struct totem_ip_address member;
> -	int ring_no; 
> -	char object_name[128];
> -
> -	totem_dynamic_name_to_ip (object_name, sizeof object_name,
> -		name_pt, name_len);
> -	log_printf(LOGSYS_LEVEL_DEBUG,
> -		"removing dynamic member: %s\n", object_name);
>  
> -	/*
> -	 * remove member
> -	 */
> -	if (totemip_parse(&member, object_name, 0) == 0) {
> -		ring_no = 0;
> -		totempg_member_remove (&member, ring_no);
> +	if (event == ICMAP_TRACK_DELETE && old_val.type == ICMAP_VALUETYPE_STRING) {
> +		remove_old_member = 1;
>  	}
> -}
>  
> -static void corosync_totem_dynamic_init (void)
> -{
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_totem_handle;
> -	hdb_handle_t object_interface_handle;
> -	hdb_handle_t object_dynamic_handle;
> -
> -	if (objdb->object_find_create (OBJECT_PARENT_HANDLE,
> -		"totem", strlen("totem"), &object_find_handle) != 0) {
> -		log_printf(LOGSYS_LEVEL_ERROR,
> -			"corosync_totem_dynamic_init:: FAILED to find totem!\n");
> -		return;
> -	}
> -	if (objdb->object_find_next (object_find_handle,
> -		&object_totem_handle) != 0) {
> -		return;
> +	if (event == ICMAP_TRACK_MODIFY && new_val.type == ICMAP_VALUETYPE_STRING &&
> +			old_val.type == ICMAP_VALUETYPE_STRING) {
> +		add_new_member = 1;
> +		remove_old_member = 1;
>  	}
> -	api->object_find_destroy (object_find_handle);
> -
> -	if (objdb->object_find_create(object_totem_handle,
> -		"interface", strlen("interface"), &object_find_handle) != 0) {
>  
> -		log_printf(LOGSYS_LEVEL_ERROR,
> -			"corosync_totem_dynamic_init:: FAILED to find totem.interface!\n");
> -		return;
> +	if (remove_old_member) {
> +		log_printf(LOGSYS_LEVEL_DEBUG,
> +			"removing dynamic member %s for ring %u\n", (char *)old_val.data, ring_no);
> +		if (totemip_parse(&member, (char *)old_val.data, 0) == 0) {
> +			totempg_member_remove (&member, ring_no);
> +		}
>  	}
> -	if (objdb->object_find_next (object_find_handle,
> -		&object_interface_handle) != 0) {
>  
> -		return;
> +	if (add_new_member) {
> +		log_printf(LOGSYS_LEVEL_DEBUG,
> +			"adding dynamic member %s for ring %u\n", (char *)new_val.data, ring_no);
> +		if (totemip_parse(&member, (char *)new_val.data, 0) == 0) {
> +			totempg_member_add (&member, ring_no);
> +		}
>  	}
> -	api->object_find_destroy (object_find_handle);
> -
> -	/*
> -	 * create new child object: dynamic
> -	 */
> -	if (objdb->object_create (object_interface_handle,
> -		&object_dynamic_handle,
> -		"dynamic", strlen("dynamic")) != 0) {
> +}
>  
> -		log_printf(LOGSYS_LEVEL_ERROR,
> -			"unable to create object: \"totem.interface.dynamic\"\n");
> -		return;
> -	}
> +static void corosync_totem_dynamic_init (void)
> +{
> +	icmap_track_t icmap_track;
>  
> -	objdb->object_track_start (object_dynamic_handle,
> -		OBJECT_TRACK_DEPTH_RECURSIVE,
> +	icmap_track_add("totem.interface.",
> +		ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY | ICMAP_TRACK_PREFIX,
> +		totem_dynamic_notify,
>  		NULL,
> -		totem_dynamic_create_notify_fn,
> -		totem_dynamic_destroy_notify_fn,
> -		NULL, NULL);
> +		&icmap_track);
>  }
>  
>  static void corosync_totem_stats_init (void)
>  {
>  	totempg_stats_t * stats;
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_runtime_handle;
> -	hdb_handle_t object_totem_handle;
> -	uint32_t zero_32 = 0;
> -	uint64_t zero_64 = 0;
>  
>  	stats = api->totem_get_stats();
>  
> -	objdb->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"runtime",
> -		strlen ("runtime"),
> -		&object_find_handle);
> -
> -	if (objdb->object_find_next (object_find_handle,
> -			&object_runtime_handle) == 0) {
> -
> -		objdb->object_create (object_runtime_handle,
> -			&object_totem_handle,
> -			"totem", strlen ("totem"));
> -		objdb->object_create (object_totem_handle,
> -			&stats->hdr.handle,
> -			"pg", strlen ("pg"));
> -		objdb->object_create (stats->hdr.handle,
> -			&stats->mrp->hdr.handle,
> -			"mrp", strlen ("mrp"));
> -		objdb->object_create (stats->mrp->hdr.handle,
> -			&stats->mrp->srp->hdr.handle,
> -			"srp", strlen ("srp"));
> -
> -		objdb->object_key_create_typed (stats->hdr.handle,
> -			"msg_reserved", &stats->msg_reserved,
> -			sizeof (stats->msg_reserved), OBJDB_VALUETYPE_UINT32);
> -		objdb->object_key_create_typed (stats->hdr.handle,
> -			"msg_queue_avail", &stats->msg_queue_avail,
> -			sizeof (stats->msg_queue_avail), OBJDB_VALUETYPE_UINT32);
> -
> -		/* Members object */
> -		objdb->object_create (stats->mrp->srp->hdr.handle,
> -			&object_memb_handle,
> -			"members", strlen ("members"));
> -
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"orf_token_tx",	&stats->mrp->srp->orf_token_tx,
> -			sizeof (stats->mrp->srp->orf_token_tx),	OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"orf_token_rx", &stats->mrp->srp->orf_token_rx,
> -			sizeof (stats->mrp->srp->orf_token_rx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"memb_merge_detect_tx", &stats->mrp->srp->memb_merge_detect_tx,
> -			sizeof (stats->mrp->srp->memb_merge_detect_tx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"memb_merge_detect_rx", &stats->mrp->srp->memb_merge_detect_rx,
> -			sizeof (stats->mrp->srp->memb_merge_detect_rx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"memb_join_tx", &stats->mrp->srp->memb_join_tx,
> -			sizeof (stats->mrp->srp->memb_join_tx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"memb_join_rx", &stats->mrp->srp->memb_join_rx,
> -			sizeof (stats->mrp->srp->memb_join_rx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"mcast_tx", &stats->mrp->srp->mcast_tx,
> -			sizeof (stats->mrp->srp->mcast_tx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"mcast_retx", &stats->mrp->srp->mcast_retx,
> -			sizeof (stats->mrp->srp->mcast_retx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"mcast_rx", &stats->mrp->srp->mcast_rx,
> -			sizeof (stats->mrp->srp->mcast_rx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"memb_commit_token_tx", &stats->mrp->srp->memb_commit_token_tx,
> -			sizeof (stats->mrp->srp->memb_commit_token_tx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"memb_commit_token_rx", &stats->mrp->srp->memb_commit_token_rx,
> -			sizeof (stats->mrp->srp->memb_commit_token_rx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"token_hold_cancel_tx", &stats->mrp->srp->token_hold_cancel_tx,
> -			sizeof (stats->mrp->srp->token_hold_cancel_tx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"token_hold_cancel_rx", &stats->mrp->srp->token_hold_cancel_rx,
> -			sizeof (stats->mrp->srp->token_hold_cancel_rx), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"operational_entered", &stats->mrp->srp->operational_entered,
> -			sizeof (stats->mrp->srp->operational_entered), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"operational_token_lost", &stats->mrp->srp->operational_token_lost,
> -			sizeof (stats->mrp->srp->operational_token_lost), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"gather_entered", &stats->mrp->srp->gather_entered,
> -			sizeof (stats->mrp->srp->gather_entered), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"gather_token_lost", &stats->mrp->srp->gather_token_lost,
> -			sizeof (stats->mrp->srp->gather_token_lost), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"commit_entered", &stats->mrp->srp->commit_entered,
> -			sizeof (stats->mrp->srp->commit_entered), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"commit_token_lost", &stats->mrp->srp->commit_token_lost,
> -			sizeof (stats->mrp->srp->commit_token_lost), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"recovery_entered", &stats->mrp->srp->recovery_entered,
> -			sizeof (stats->mrp->srp->recovery_entered), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"recovery_token_lost", &stats->mrp->srp->recovery_token_lost,
> -			sizeof (stats->mrp->srp->recovery_token_lost), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"consensus_timeouts", &stats->mrp->srp->consensus_timeouts,
> -			sizeof (stats->mrp->srp->consensus_timeouts), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"mtt_rx_token", &zero_32,
> -			sizeof (zero_32), OBJDB_VALUETYPE_UINT32);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"avg_token_workload", &zero_32,
> -			sizeof (zero_32), OBJDB_VALUETYPE_UINT32);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"avg_backlog_calc", &zero_32,
> -			sizeof (zero_32), OBJDB_VALUETYPE_UINT32);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"rx_msg_dropped", &zero_64,
> -			sizeof (zero_64), OBJDB_VALUETYPE_UINT64);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"continuous_gather", &zero_32,
> -			sizeof (zero_32), OBJDB_VALUETYPE_UINT32);
> -		objdb->object_key_create_typed (stats->mrp->srp->hdr.handle,
> -			"firewall_enabled_or_nic_failure", &zero_32,
> -			sizeof (zero_32), OBJDB_VALUETYPE_UINT32);
> -
> -	}
> -	objdb->object_find_destroy (object_find_handle);
> +	icmap_set_uint32("runtime.totem.pg.mrp.srp.mtt_rx_token", 0);
> +	icmap_set_uint32("runtime.totem.pg.mrp.srp.avg_token_workload", 0);
> +	icmap_set_uint32("runtime.totem.pg.mrp.srp.avg_backlog_calc", 0);
> +
> +	icmap_set_ro_access("runtime.totem", CS_TRUE, CS_TRUE);
>  
>  	/* start stats timer */
>  	api->timer_add_duration (1500 * MILLI_2_NANO_SECONDS, NULL,
>  		corosync_totem_stats_updater,
>  		&corosync_stats_timer_handle);
> -
>  }
>  
>  
> @@ -951,7 +653,6 @@ static void deliver_fn (
>  	int32_t service;
>  	int32_t fn_id;
>  	uint32_t id;
> -	uint32_t key_incr_dummy;
>  
>  	header = msg;
>  	if (endian_conversion_required) {
> @@ -980,9 +681,7 @@ static void deliver_fn (
>  		return;
>  	}
>  
> -	objdb->object_key_increment (service_stats_handle[service][fn_id],
> -		"rx", strlen("rx"),
> -		&key_incr_dummy);
> +	icmap_inc(service_stats_rx[service][fn_id]);
>  
>  	if (endian_conversion_required) {
>  		assert(ais_service[service]->exec_engine[fn_id].exec_endian_convert_fn != NULL);
> @@ -1008,14 +707,12 @@ int main_mcast (
>  	const struct qb_ipc_request_header *req = iovec->iov_base;
>  	int32_t service;
>  	int32_t fn_id;
> -	uint32_t key_incr_dummy;
>  
>  	service = req->id >> 16;
>  	fn_id = req->id & 0xffff;
>  
>  	if (ais_service[service]) {
> -		objdb->object_key_increment (service_stats_handle[service][fn_id],
> -			"tx", strlen("tx"), &key_incr_dummy);
> +		icmap_inc(service_stats_tx[service][fn_id]);
>  	}
>  
>  	return (totempg_groups_mcast_joined (corosync_group_handle, iovec, iov_len, guarantee));
> @@ -1182,55 +879,37 @@ _logsys_log_printf(int level, int subsys,
>  }
>  
>  static void fplay_key_change_notify_fn (
> -	object_change_type_t change_type,
> -	hdb_handle_t parent_object_handle,
> -	hdb_handle_t object_handle,
> -	const void *object_name_pt, size_t object_name_len,
> -	const void *key_name_pt, size_t key_len,
> -	const void *key_value_pt, size_t key_value_len,
> -	void *priv_data_pt)
> +	int32_t event,
> +	const char *key_name,
> +	struct icmap_notify_value new_val,
> +	struct icmap_notify_value old_val,
> +	void *user_data)
>  {
> -	if (key_len == strlen ("dump_flight_data") &&
> -		memcmp ("dump_flight_data", key_name_pt, key_len) == 0) {
> +	if (strcmp(key_name, "runtime.blackbox.dump_flight_data") == 0) {
> +		fprintf(stderr,"Writetofile\n");
>  		qb_log_blackbox_write_to_file (LOCALSTATEDIR "/lib/corosync/fdata");
>  	}
> -	if (key_len == strlen ("dump_state") &&
> -		memcmp ("dump_state", key_name_pt, key_len) == 0) {
> +	if (strcmp(key_name, "runtime.blackbox.dump_state") == 0) {
> +		fprintf(stderr,"statefump\n");
>  		corosync_state_dump ();
>  	}
>  }
>  
>  static void corosync_fplay_control_init (void)
>  {
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_runtime_handle;
> -	hdb_handle_t object_blackbox_handle;
> -
> -	objdb->object_find_create (OBJECT_PARENT_HANDLE,
> -		"runtime", strlen ("runtime"),
> -		&object_find_handle);
> -
> -	if (objdb->object_find_next (object_find_handle,
> -			&object_runtime_handle) != 0) {
> -		return;
> -	}
> -	objdb->object_find_destroy (object_find_handle);
> -
> -	objdb->object_create (object_runtime_handle,
> -		&object_blackbox_handle,
> -		"blackbox", strlen ("blackbox"));
> -
> -	objdb->object_key_create_typed (object_blackbox_handle,
> -		"dump_flight_data", "no", strlen("no"),
> -		OBJDB_VALUETYPE_STRING);
> -	objdb->object_key_create_typed (object_blackbox_handle,
> -		"dump_state", "no", strlen("no"),
> -		OBJDB_VALUETYPE_STRING);
> -
> -	objdb->object_track_start (object_blackbox_handle,
> -		OBJECT_TRACK_DEPTH_RECURSIVE,
> -		fplay_key_change_notify_fn,
> -		NULL, NULL, NULL, NULL);
> +	icmap_track_t track;
> +
> +	icmap_set_string("runtime.blackbox.dump_flight_data", "no");
> +	icmap_set_string("runtime.blackbox.dump_state", "no");
> +
> +	icmap_track_add("runtime.blackbox.dump_flight_data",
> +			ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY,
> +			fplay_key_change_notify_fn,
> +			NULL, &track);
> +	icmap_track_add("runtime.blackbox.dump_state",
> +			ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY,
> +			fplay_key_change_notify_fn,
> +			NULL, &track);
>  }
>  
>  static void main_service_ready (void)
> @@ -1363,10 +1042,8 @@ int main (int argc, char **argv, char **envp)
>  {
>  	const char *error_string;
>  	struct totem_config totem_config;
> -	hdb_handle_t objdb_handle;
>  	hdb_handle_t config_handle;
>  	unsigned int config_version = 0;
> -	void *objdb_p;
>  	struct config_iface_ver0 *config;
>  	void *config_p;
>  	const char *config_iface_init;
> @@ -1377,7 +1054,6 @@ int main (int argc, char **argv, char **envp)
>  	int background, setprio;
>  	struct stat stat_out;
>  	char corosync_lib_dir[PATH_MAX];
> -	hdb_handle_t object_runtime_handle;
>  	enum e_ais_done flock_err;
>  
>  	/* default configuration
> @@ -1444,28 +1120,14 @@ int main (int argc, char **argv, char **envp)
>  	(void)signal (SIGPIPE, SIG_IGN);
>  #endif
>  
> -	/*
> -	 * Load the object database interface
> -	 */
> -	res = lcr_ifact_reference (
> -		&objdb_handle,
> -		"objdb",
> -		0,
> -		&objdb_p,
> -		0);
> -	if (res == -1) {
> -		log_printf (LOGSYS_LEVEL_ERROR, "Corosync Executive couldn't open configuration object database component.\n");
> +	if (icmap_init() != CS_OK) {
> +		log_printf (LOGSYS_LEVEL_ERROR, "Corosync Executive couldn't initialize configuration component.\n");
>  		corosync_exit_error (AIS_DONE_OBJDB);
>  	}
>  
> -	objdb = (struct objdb_iface_ver0 *)objdb_p;
> -
> -	objdb->objdb_init ();
> -
>  	/*
>  	 * Initialize the corosync_api_v1 definition
>  	 */
> -	apidef_init (objdb);
>  	api = apidef_get ();
>  
>  	num_config_modules = 0;
> @@ -1502,7 +1164,7 @@ int main (int argc, char **argv, char **envp)
>  			corosync_exit_error (AIS_DONE_MAINCONFIGREAD);
>  		}
>  
> -		res = config->config_readconfig(objdb, &error_string);
> +		res = config->config_readconfig(&error_string);
>  		if (res == -1) {
>  			log_printf (LOGSYS_LEVEL_ERROR, "%s", error_string);
>  			corosync_exit_error (AIS_DONE_MAINCONFIGREAD);
> @@ -1514,7 +1176,7 @@ int main (int argc, char **argv, char **envp)
>  	}
>  	free(config_iface);
>  
> -	res = corosync_main_config_read (objdb, &error_string);
> +	res = corosync_main_config_read (&error_string);
>  	if (res == -1) {
>  		/*
>  		 * if we are here, we _must_ flush the logsys queue
> @@ -1539,13 +1201,13 @@ int main (int argc, char **argv, char **envp)
>  		corosync_exit_error (AIS_DONE_DIR_NOT_PRESENT);
>  	}
>  
> -	res = totem_config_read (objdb, &totem_config, &error_string);
> +	res = totem_config_read (&totem_config, &error_string);
>  	if (res == -1) {
>  		log_printf (LOGSYS_LEVEL_ERROR, "%s", error_string);
>  		corosync_exit_error (AIS_DONE_MAINCONFIGREAD);
>  	}
>  
> -	res = totem_config_keyread (objdb, &totem_config, &error_string);
> +	res = totem_config_keyread (&totem_config, &error_string);
>  	if (res == -1) {
>  		log_printf (LOGSYS_LEVEL_ERROR, "%s", error_string);
>  		corosync_exit_error (AIS_DONE_MAINCONFIGREAD);
> @@ -1567,19 +1229,13 @@ int main (int argc, char **argv, char **envp)
>  	totem_config.totem_logging_configuration.log_printf = _logsys_log_printf;
>  	logsys_config_apply();
>  
> -	res = corosync_main_config_compatibility_read (objdb,
> -		&minimum_sync_mode,
> +	res = corosync_main_config_compatibility_read (&minimum_sync_mode,
>  		&error_string);
>  	if (res == -1) {
>  		log_printf (LOGSYS_LEVEL_ERROR, "%s", error_string);
>  		corosync_exit_error (AIS_DONE_MAINCONFIGREAD);
>  	}
>  
> -	/* create the main runtime object */
> -	objdb->object_create (OBJECT_PARENT_HANDLE,
> -		&object_runtime_handle,
> -		"runtime", strlen ("runtime"));
> -
>  	/*
>  	 * Now we are fully initialized.
>  	 */
> @@ -1649,9 +1305,8 @@ int main (int argc, char **argv, char **envp)
>  	qb_loop_destroy (corosync_poll_handle);
>  
>  	/*
> -	 * free up the objdb
> +	 * free up the icmap 
>  	 */
> -	objdb->objdb_fini ();
>  
>  	/*
>  	 * Remove pid lock file
> diff --git a/exec/main.h b/exec/main.h
> index 2efedef..91a2706 100644
> --- a/exec/main.h
> +++ b/exec/main.h
> @@ -48,7 +48,6 @@
>  #include <corosync/hdb.h>
>  #include <qb/qbloop.h>
>  #include <corosync/totem/totempg.h>
> -#include <corosync/engine/objdb.h>
>  #include <corosync/engine/config.h>
>  #include <corosync/engine/coroapi.h>
>  
> diff --git a/exec/mainconfig.c b/exec/mainconfig.c
> index 8a6787f..1c0d4a9 100644
> --- a/exec/mainconfig.c
> +++ b/exec/mainconfig.c
> @@ -1,10 +1,11 @@
>  /*
>   * Copyright (c) 2002-2005 MontaVista Software, Inc.
> - * Copyright (c) 2006-2009 Red Hat, Inc.
> + * Copyright (c) 2006-2011 Red Hat, Inc.
>   *
>   * All rights reserved.
>   *
>   * Author: Steven Dake (sdake@xxxxxxxxxx)
> + *         Jan Friesse (jfriesse@xxxxxxxxxx)
>   *
>   * This software licensed under BSD license, the text of which follows:
>   *
> @@ -43,66 +44,19 @@
>  #include <sys/socket.h>
>  #include <netinet/in.h>
>  #include <arpa/inet.h>
> -#include <pwd.h>
> -#include <grp.h>
>  #include <limits.h>
>  
>  #include <corosync/corotypes.h>
>  #include <corosync/list.h>
>  #include <corosync/totem/totem.h>
>  #include <corosync/engine/logsys.h>
> +#include <corosync/engine/icmap.h>
>  
>  #include "util.h"
>  #include "mainconfig.h"
>  
>  static char error_string_response[512];
>  
> -static struct objdb_iface_ver0 *global_objdb;
> -
> -DECLARE_LIST_INIT(uidgid_list_head);
> -
> -
> -/* This just makes the code below a little neater */
> -static inline int objdb_get_string (
> -	const struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_service_handle,
> -	const char *key, char **value)
> -{
> -	int res;
> -
> -	*value = NULL;
> -	if ( !(res = objdb->object_key_get (object_service_handle,
> -		key,
> -		strlen (key),
> -		(void *)value,
> -		NULL))) {
> -
> -		if (*value) {
> -			return 0;
> -		}
> -	}
> -	return -1;
> -}
> -
> -static inline void objdb_get_int (
> -	const struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_service_handle,
> -	char *key, unsigned int *intvalue)
> -{
> -	char *value = NULL;
> -
> -	if (!objdb->object_key_get (object_service_handle,
> -		key,
> -		strlen (key),
> -		(void *)&value,
> -		NULL)) {
> -
> -		if (value) {
> -			*intvalue = atoi(value);
> -		}
> -	}
> -}
> -
>  /**
>   * insert_into_buffer
>   * @target_buffer: a buffer where to write results
> @@ -179,16 +133,14 @@ static int insert_into_buffer(
>   * doesn't apply at system/subsystem level.
>   */
>  static int corosync_main_config_format_set (
> -	struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_handle,
>  	const char **error_string)
>  {
>  	const char *error_reason;
>  	char new_format_buffer[PATH_MAX];
> -	char *value;
> -	int err = 0;
> +	char *value = NULL;
> +	cs_error_t err;
>  
> -	if (!objdb_get_string (objdb,object_handle, "fileline", &value)) {
> +	if (icmap_get_string("logging.fileline", &value) == CS_OK) {
>  		if (strcmp (value, "on") == 0) {
>  			if (!insert_into_buffer(new_format_buffer,
>  					sizeof(new_format_buffer),
> @@ -207,8 +159,11 @@ static int corosync_main_config_format_set (
>  			error_reason = "unknown value for fileline";
>  			goto parse_error;
>  		}
> +
> +		free(value);
>  	}
> -	if (!objdb_get_string (objdb,object_handle, "function_name", &value)) {
> +
> +	if (icmap_get_string("logging.function_name", &value) == CS_OK) {
>  		if (strcmp (value, "on") == 0) {
>  			if (!insert_into_buffer(new_format_buffer,
>  					sizeof(new_format_buffer),
> @@ -227,8 +182,11 @@ static int corosync_main_config_format_set (
>  			error_reason = "unknown value for function_name";
>  			goto parse_error;
>  		}
> +
> +		free(value);
>  	}
> -	if (!objdb_get_string (objdb,object_handle, "timestamp", &value)) {
> +
> +	if (icmap_get_string("logging.timestamp", &value) == CS_OK) {
>  		if (strcmp (value, "on") == 0) {
>  			if(!insert_into_buffer(new_format_buffer,
>  					sizeof(new_format_buffer),
> @@ -242,40 +200,40 @@ static int corosync_main_config_format_set (
>  			error_reason = "unknown value for timestamp";
>  			goto parse_error;
>  		}
> -	}
> -	if (err) {
> -		error_reason = "exhausted virtual memory";
> -		goto parse_error;
> +
> +		free(value);
>  	}
>  
>  	return (0);
>  
>  parse_error:
> +	free(value);
>  	*error_string = error_reason;
>  
>  	return (-1);
>  }
>  
>  static int corosync_main_config_log_destination_set (
> -	struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_handle,
> +	const char *path,
> +	const char *key,
>  	const char *subsys,
>  	const char **error_string,
> -	const char *objdb_key,
>  	unsigned int mode_mask,
>  	char deprecated,
>  	const char *replacement)
>  {
>  	static char formatted_error_reason[128];
> -	char *value;
> +	char *value = NULL;
>  	unsigned int mode;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
>  
> -	if (!objdb_get_string (objdb, object_handle, objdb_key, &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, key);
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		if (deprecated) {
>  			log_printf(LOGSYS_LEVEL_WARNING,
>  			 "Warning: the %s config paramater has been obsoleted."
>  			 " See corosync.conf man page %s directive.",
> -			 objdb_key, replacement);
> +			 key, replacement);
>  		}
>  
>  		mode = logsys_config_mode_get (subsys);
> @@ -283,37 +241,40 @@ static int corosync_main_config_log_destination_set (
>  		if (strcmp (value, "yes") == 0 || strcmp (value, "on") == 0) {
>  			mode |= mode_mask;
>  			if (logsys_config_mode_set(subsys, mode) < 0) {
> -				sprintf (formatted_error_reason, "unable to set mode %s", objdb_key);
> -				*error_string = formatted_error_reason;
> -				return -1;
> +				sprintf (formatted_error_reason, "unable to set mode %s", key);
> +				goto parse_error;
>  			}
>  		} else
>  		if (strcmp (value, "no") == 0 || strcmp (value, "off") == 0) {
>  			mode &= ~mode_mask;
>  			if (logsys_config_mode_set(subsys, mode) < 0) {
> -				sprintf (formatted_error_reason, "unable to unset mode %s", objdb_key);
> -				*error_string = formatted_error_reason;
> -				return -1;
> +				sprintf (formatted_error_reason, "unable to unset mode %s", key);
> +				goto parse_error;
>  			}
>  		} else {
> -			sprintf (formatted_error_reason, "unknown value for %s", objdb_key);
> -			*error_string = formatted_error_reason;
> -			return -1;
> +			sprintf (formatted_error_reason, "unknown value for %s", key);
> +			goto parse_error;
>  		}
>  	}
>  
> -	return 0;
> +	free(value);
> +	return (0);
> +
> +parse_error:
> +	*error_string = formatted_error_reason;
> +	free(value);
> +	return (-1);
>  }
>  
>  static int corosync_main_config_set (
> -	struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_handle,
> +	const char *path,
>  	const char *subsys,
>  	const char **error_string)
>  {
>  	const char *error_reason = error_string_response;
>  	char *value;
>  	int mode;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
>  
>  	/*
>  	 * this bit abuses the internal logsys exported API
> @@ -337,19 +298,16 @@ static int corosync_main_config_set (
>  		goto parse_error;
>  	}
>  
> -	if (corosync_main_config_log_destination_set (objdb, object_handle, subsys, &error_reason,
> -	    "to_stderr", LOGSYS_MODE_OUTPUT_STDERR, 0, NULL) != 0)
> -		goto parse_error;
> -
> -	if (corosync_main_config_log_destination_set (objdb, object_handle, subsys, &error_reason,
> -	    "to_syslog", LOGSYS_MODE_OUTPUT_SYSLOG, 0, NULL) != 0)
> +	if (corosync_main_config_log_destination_set (path, "to_stderr", subsys, &error_reason,
> +	    LOGSYS_MODE_OUTPUT_STDERR, 0, NULL) != 0)
>  		goto parse_error;
>  
> -	if (corosync_main_config_log_destination_set (objdb, object_handle, subsys, &error_reason,
> -	    "to_file", LOGSYS_MODE_OUTPUT_FILE, 1, "to_logfile") != 0)
> +	if (corosync_main_config_log_destination_set (path, "to_syslog", subsys, &error_reason,
> +	    LOGSYS_MODE_OUTPUT_SYSLOG, 0, NULL) != 0)
>  		goto parse_error;
>  
> -	if (!objdb_get_string (objdb,object_handle, "syslog_facility", &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, "syslog_facility");
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		int syslog_facility;
>  
>  		syslog_facility = qb_log_facility2int(value);
> @@ -362,9 +320,12 @@ static int corosync_main_config_set (
>  			error_reason = "unable to set syslog facility";
>  			goto parse_error;
>  		}
> +
> +		free(value);
>  	}
>  
> -	if (!objdb_get_string (objdb,object_handle, "syslog_level", &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, "syslog_level");
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		int syslog_priority;
>  
>  		log_printf(LOGSYS_LEVEL_WARNING,
> @@ -381,9 +342,11 @@ static int corosync_main_config_set (
>  			error_reason = "unable to set syslog level";
>  			goto parse_error;
>  		}
> +		free(value);
>  	}
>  
> -	if (!objdb_get_string (objdb,object_handle, "syslog_priority", &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, "syslog_priority");
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		int syslog_priority;
>  
>  		syslog_priority = logsys_priority_id_get(value);
> @@ -396,19 +359,27 @@ static int corosync_main_config_set (
>  			error_reason = "unable to set syslog priority";
>  			goto parse_error;
>  		}
> +		free(value);
>  	}
>  
> -	if (!objdb_get_string (objdb,object_handle, "logfile", &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, "logfile");
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		if (logsys_config_file_set (subsys, error_string, value) < 0) {
>  			goto parse_error;
>  		}
> +		free(value);
>  	}
>  
> -	if (corosync_main_config_log_destination_set (objdb, object_handle, subsys, &error_reason,
> -	    "to_logfile", LOGSYS_MODE_OUTPUT_FILE, 0, NULL) != 0)
> +	if (corosync_main_config_log_destination_set (path, "to_file", subsys, &error_reason,
> +	    LOGSYS_MODE_OUTPUT_FILE, 1, "to_logfile") != 0)
> +		goto parse_error;
> +
> +	if (corosync_main_config_log_destination_set (path, "to_logfile", subsys, &error_reason,
> +	    LOGSYS_MODE_OUTPUT_FILE, 0, NULL) != 0)
>  		goto parse_error;
>  
> -	if (!objdb_get_string (objdb,object_handle, "logfile_priority", &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, "logfile_priority");
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		int logfile_priority;
>  
>  		logfile_priority = logsys_priority_id_get(value);
> @@ -421,9 +392,11 @@ static int corosync_main_config_set (
>  			error_reason = "unable to set logfile priority";
>  			goto parse_error;
>  		}
> +		free(value);
>  	}
>  
> -	if (!objdb_get_string (objdb, object_handle, "debug", &value)) {
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s.%s", path, "debug");
> +	if (icmap_get_string(key_name, &value) == CS_OK) {
>  		if (strcmp (value, "on") == 0) {
>  			if (logsys_config_debug_set (subsys, 1) < 0) {
>  				error_reason = "unable to set debug on";
> @@ -439,125 +412,60 @@ static int corosync_main_config_set (
>  			error_reason = "unknown value for debug";
>  			goto parse_error;
>  		}
> +		free(value);
>  	}
>  
>  	return (0);
>  
>  parse_error:
>  	*error_string = error_reason;
> +	free(value);
>  
>  	return (-1);
>  }
>  
>  static int corosync_main_config_read_logging (
> -	struct objdb_iface_ver0 *objdb,
>  	const char **error_string)
>  {
> -	hdb_handle_t object_service_handle;
> -	hdb_handle_t object_logger_subsys_handle;
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_find_logsys_handle;
>  	const char *error_reason;
> -	char *value;
> +	icmap_iter_t iter;
> +	const char *key_name;
> +	char key_subsys[ICMAP_KEYNAME_MAXLEN];
> +	char key_item[ICMAP_KEYNAME_MAXLEN];
> +	int res;
>  
> -	objdb->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"logging",
> -		strlen ("logging"),
> -		&object_find_handle);
> +	/* format set is supported only for toplevel */
> +	if (corosync_main_config_format_set(&error_reason) < 0) {
> +		goto parse_error;
> +	}
>  
> -	if (objdb->object_find_next (
> -		object_find_handle,
> -		&object_service_handle) == 0) {
> +	if (corosync_main_config_set ("logging", NULL, &error_reason) < 0) {
> +		goto parse_error;
> +	}
>  
> -		/* format set is supported only for toplevel */
> -		if (corosync_main_config_format_set (objdb,
> -						       object_service_handle,
> -						       &error_reason) < 0) {
> -			goto parse_error;
> -		}
> +	/*
> +	 * we will need 2 of these to compensate for new logging
> +	 * config format
> +	 */
> +	iter = icmap_iter_init("logging.logger_subsys.");
> +	while ((key_name = icmap_iter_next(iter, NULL, NULL)) != NULL) {
> +		res = sscanf(key_name, "logging.logger_subsys.%[^.].%s", key_subsys, key_item);
>  
> -		if (corosync_main_config_set (objdb,
> -						object_service_handle,
> -						NULL,
> -						&error_reason) < 0) {
> -			goto parse_error;
> +		if (res != 2) {
> +			continue ;
>  		}
>  
> -		/* we will need 2 of these to compensate for new logging
> -		 * config format */
> -
> -		objdb->object_find_create (
> -			object_service_handle,
> -			"logger_subsys",
> -			strlen ("logger_subsys"),
> -			&object_find_logsys_handle);
> -
> -		while (objdb->object_find_next (
> -			object_find_logsys_handle,
> -			&object_logger_subsys_handle) == 0) {
> -
> -			if (!objdb_get_string (objdb,
> -				object_logger_subsys_handle,
> -				"subsys", &value)) {
> -
> -				if (corosync_main_config_set (objdb,
> -						object_logger_subsys_handle,
> -						value,
> -						&error_reason) < 0) {
> -					goto parse_error;
> -				}
> -			}
> -			else {
> -				error_reason = "subsys required for logger directive";
> -				goto parse_error;
> -			}
> +		if (strcmp(key_item, "subsys") != 0) {
> +			continue ;
>  		}
> -		objdb->object_find_destroy (object_find_logsys_handle);
> -
> -		objdb->object_find_create (
> -			object_service_handle,
> -			"logging_daemon",
> -			strlen ("logging_daemon"),
> -			&object_find_logsys_handle);
> -
> -		while (objdb->object_find_next (
> -			object_find_logsys_handle,
> -			&object_logger_subsys_handle) == 0) {
> -
> -			if (!objdb_get_string (objdb,
> -				object_logger_subsys_handle,
> -				"name", &value)) {
> -
> -				if (strcmp(value, "corosync") == 0) {
> -					if (!objdb_get_string (objdb,
> -						object_logger_subsys_handle,
> -						"subsys", &value)) {
> -						if (corosync_main_config_set (objdb,
> -								object_logger_subsys_handle,
> -								value,
> -								&error_reason) < 0) {
> -							goto parse_error;
> -						}
> -					}
> -					else {
> -						if (corosync_main_config_set (objdb,
> -								object_logger_subsys_handle,
> -								NULL,
> -								&error_reason) < 0) {
> -							goto parse_error;
> -						}
> -					}
> -				}
> -			}
> -			else {
> -				error_reason = "name required for logging_daemon directive";
> -				goto parse_error;
> -			}
> +
> +		snprintf(key_item, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s", key_subsys);
> +
> +		if (corosync_main_config_set(key_item, key_subsys, &error_reason) < 0) {
> +			goto parse_error;
>  		}
> -		objdb->object_find_destroy (object_find_logsys_handle);
>  	}
> -	objdb->object_find_destroy (object_find_handle);
> +	icmap_iter_finalize(iter);
>  
>  	logsys_config_apply();
>  	return 0;
> @@ -568,159 +476,46 @@ parse_error:
>  	return (-1);
>  }
>  
> -static int uid_determine (const char *req_user)
> -{
> -	int pw_uid = 0;
> -	struct passwd passwd;
> -	struct passwd* pwdptr = &passwd;
> -	struct passwd* temp_pwd_pt;
> -	char *pwdbuffer;
> -	int  pwdlinelen;
> -
> -	pwdlinelen = sysconf (_SC_GETPW_R_SIZE_MAX);
> -
> -	if (pwdlinelen == -1) {
> -		pwdlinelen = 256;
> -	}
> -
> -	pwdbuffer = malloc (pwdlinelen);
> -
> -	if ((getpwnam_r (req_user, pwdptr, pwdbuffer, pwdlinelen, &temp_pwd_pt)) != 0) {
> -		log_printf (LOGSYS_LEVEL_ERROR,
> -			"ERROR: The '%s' user is not found in /etc/passwd, please read the documentation.\n",
> -			req_user);
> -		corosync_exit_error (AIS_DONE_UID_DETERMINE);
> -	}
> -	pw_uid = passwd.pw_uid;
> -	free (pwdbuffer);
> -
> -	return pw_uid;
> -}
> -
> -static int gid_determine (const char *req_group)
> -{
> -	int ais_gid = 0;
> -	struct group group;
> -	struct group * grpptr = &group;
> -	struct group * temp_grp_pt;
> -	char *grpbuffer;
> -	int  grplinelen;
> -
> -	grplinelen = sysconf (_SC_GETGR_R_SIZE_MAX);
> -
> -	if (grplinelen == -1) {
> -		grplinelen = 256;
> -	}
> -
> -	grpbuffer = malloc (grplinelen);
> -
> -	if ((getgrnam_r (req_group, grpptr, grpbuffer, grplinelen, &temp_grp_pt)) != 0) {
> -		log_printf (LOGSYS_LEVEL_ERROR,
> -			"ERROR: The '%s' group is not found in /etc/group, please read the documentation.\n",
> -			req_group);
> -		corosync_exit_error (AIS_DONE_GID_DETERMINE);
> -	}
> -	ais_gid = group.gr_gid;
> -	free (grpbuffer);
> -
> -	return ais_gid;
> -}
> -
> -
> -static void main_objdb_reload_notify(objdb_reload_notify_type_t type, int flush,
> -				     void *priv_data_pt)
> +static void main_logging_notify(
> +		int32_t event,
> +		const char *key_name,
> +		struct icmap_notify_value new_val,
> +		struct icmap_notify_value old_val,
> +		void *user_data)
>  {
>  	const char *error_string;
>  
> -	if (type == OBJDB_RELOAD_NOTIFY_END) {
> -
> -		/*
> -		 * Reload the logsys configuration
> -		 */
> -		if (logsys_format_set(NULL) == -1) {
> -			fprintf (stderr, "Unable to setup logging format.\n");
> -		}
> -		corosync_main_config_read_logging(global_objdb,
> -						  &error_string);
> +	/*
> +	 * Reload the logsys configuration
> +	 */
> +	if (logsys_format_set(NULL) == -1) {
> +		fprintf (stderr, "Unable to setup logging format.\n");
>  	}
> +	corosync_main_config_read_logging(&error_string);
>  }
>  
> -static void add_logsys_config_notification(
> -	struct objdb_iface_ver0 *objdb)
> +static void add_logsys_config_notification(void)
>  {
> +	icmap_track_t icmap_track;
>  
> -	global_objdb = objdb;
> -
> -	objdb->object_track_start(OBJECT_PARENT_HANDLE,
> -				  1,
> -				  NULL,
> -				  NULL,
> -				  NULL,
> -				  main_objdb_reload_notify,
> -				  NULL);
> -
> -}
> -
> -static int corosync_main_config_read_uidgid (
> -	struct objdb_iface_ver0 *objdb,
> -	const char **error_string)
> -{
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_service_handle;
> -	char *value;
> -	int uid, gid;
> -	struct uidgid_item *ugi;
> -
> -	objdb->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"uidgid",
> -		strlen ("uidgid"),
> -		&object_find_handle);
> -
> -	while (objdb->object_find_next (
> -		object_find_handle,
> -		&object_service_handle) == 0) {
> -		uid = -1;
> -		gid = -1;
> -
> -		if (!objdb_get_string (objdb,object_service_handle, "uid", &value)) {
> -			uid = uid_determine(value);
> -		}
> -
> -		if (!objdb_get_string (objdb,object_service_handle, "gid", &value)) {
> -			gid = gid_determine(value);
> -		}
> -
> -		if (uid > -1 || gid > -1) {
> -			ugi = malloc (sizeof (*ugi));
> -			if (ugi == NULL) {
> -				_corosync_out_of_memory_error();
> -			}
> -			ugi->uid = uid;
> -			ugi->gid = gid;
> -			list_init (&ugi->list);
> -			list_add (&ugi->list, &uidgid_list_head);
> -		}
> -	}
> -	objdb->object_find_destroy (object_find_handle);
> -
> -	return 0;
> +	icmap_track_add("logging.",
> +			ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY | ICMAP_TRACK_PREFIX,
> +			main_logging_notify,
> +			NULL,
> +			&icmap_track);
>  }
>  
>  int corosync_main_config_read (
> -	struct objdb_iface_ver0 *objdb,
>  	const char **error_string)
>  {
>  	const char *error_reason = error_string_response;
>  
> -	if (corosync_main_config_read_logging(objdb, error_string) < 0) {
> +	if (corosync_main_config_read_logging(error_string) < 0) {
>  		error_reason = *error_string;
>  		goto parse_error;
>  	}
>  
> -	corosync_main_config_read_uidgid (objdb, error_string);
> -
> -	add_logsys_config_notification(objdb);
> +	add_logsys_config_notification();
>  
>  	return 0;
>  
> @@ -734,7 +529,6 @@ parse_error:
>  }
>  
>  int corosync_main_config_compatibility_read (
> -        struct objdb_iface_ver0 *objdb,
>          enum cs_sync_mode *minimum_sync_mode,
>          const char **error_string)
>  {
> @@ -742,8 +536,7 @@ int corosync_main_config_compatibility_read (
>  	char *value;
>  
>  	*minimum_sync_mode = CS_SYNC_V1;
> -	if (!objdb_get_string (objdb, OBJECT_PARENT_HANDLE, "compatibility", &value)) {
> -
> +	if (icmap_get_string("compatibility", &value) == CS_OK) {
>  		if (strcmp (value, "whitetank") == 0) {
>  			*minimum_sync_mode = CS_SYNC_V1;
>  		} else
> @@ -755,12 +548,13 @@ int corosync_main_config_compatibility_read (
>  				"Invalid compatibility option '%s' specified, must be none or whitetank.\n", value);
>  			goto parse_error;
>  		}
> +		free(value);
>  	}
>  
>  	return 0;
>  
>  parse_error:
>  	*error_string = error_reason;
> -
> +	free(value);
>  	return (-1);
>  }
> diff --git a/exec/mainconfig.h b/exec/mainconfig.h
> index b8d4ff9..5f7a2c2 100644
> --- a/exec/mainconfig.h
> +++ b/exec/mainconfig.h
> @@ -35,7 +35,6 @@
>  #ifndef MAINCONFIG_H_DEFINED
>  #define MAINCONFIG_H_DEFINED
>  
> -#include <corosync/engine/objdb.h>
>  #include <corosync/engine/logsys.h>
>  #include <corosync/list.h>
>  #include <corosync/engine/coroapi.h>
> @@ -47,27 +46,13 @@ struct dynamic_service {
>  	char *name;
>  	unsigned int ver;
>  	unsigned int handle;
> -	struct corosync_service_engine_iface_ver0 *iface_ver0;
>  };
>  #define MAX_DYNAMIC_SERVICES 128
>  
> -/**
> - * Structure describing cached uidgid item
> - */
> -struct uidgid_item {
> -	struct list_head list;
> -	int uid;
> -	int gid;
> -};
> -
> -extern struct list_head uidgid_list_head;
> -
>  extern int corosync_main_config_read (
> -	struct objdb_iface_ver0 *objdb,
>  	const char **error_string);
>  
>  extern int corosync_main_config_compatibility_read (
> -	struct objdb_iface_ver0 *objdb,
>  	enum cs_sync_mode *minimum_sync_mode,
>  	const char **error_string);
>  
> diff --git a/exec/objdb.c b/exec/objdb.c
> index 37a521a..8988600 100644
> --- a/exec/objdb.c
> +++ b/exec/objdb.c
> @@ -1753,16 +1753,16 @@ static int object_write_config(const char **error_string)
>  	struct config_iface_ver0 **modules;
>  	int num_modules;
>  	int i;
> -	int res;
> +//	int res;
>  
>  	main_get_config_modules(&modules, &num_modules);
>  
>  	for (i=0; i<num_modules; i++) {
>  		if (modules[i]->config_writeconfig) {
> -			res = modules[i]->config_writeconfig(&objdb_iface, error_string);
> +/*			res = modules[i]->config_writeconfig(&objdb_iface, error_string);
>  			if (res) {
>  				return res;
> -			}
> +			}*/
>  		}
>  	}
>  	return 0;
> @@ -1773,18 +1773,18 @@ static int object_reload_config(int flush, const char **error_string)
>  	struct config_iface_ver0 **modules;
>  	int num_modules;
>  	int i;
> -	int res;
> +/*	int res = 0; */
>  
>  	main_get_config_modules(&modules, &num_modules);
>  	object_reload_notification(OBJDB_RELOAD_NOTIFY_START, flush);
>  
>  	for (i=0; i<num_modules; i++) {
>  		if (modules[i]->config_reloadconfig) {
> -			res = modules[i]->config_reloadconfig(&objdb_iface, flush, error_string);
> +/*			res = modules[i]->config_reloadconfig(&objdb_iface, flush, error_string);
>  			if (res) {
>  				object_reload_notification(OBJDB_RELOAD_NOTIFY_FAILED, flush);
>  				return res;
> -			}
> +			} */
>  		}
>  	}
>  	object_reload_notification(OBJDB_RELOAD_NOTIFY_END, flush);
> diff --git a/exec/service.c b/exec/service.c
> index 3e3b1b3..59c1028 100644
> --- a/exec/service.c
> +++ b/exec/service.c
> @@ -46,6 +46,7 @@
>  #include "mainconfig.h"
>  #include "util.h"
>  #include <corosync/engine/logsys.h>
> +#include <corosync/engine/icmap.h>
>  
>  #include "timer.h"
>  #include <corosync/totem/totempg.h>
> @@ -78,10 +79,6 @@ static struct default_service default_services[] = {
>  		.ver			 = 0,
>  	},
>  	{
> -		.name			 = "corosync_confdb",
> -		.ver			 = 0,
> -	},
> -	{
>  		.name			 = "corosync_pload",
>  		.ver			 = 0,
>  	},
> @@ -100,7 +97,11 @@ static struct default_service default_services[] = {
>  	{
>  		.name			 = "corosync_quorum",
>  		.ver			 = 0,
> -	}
> +	},
> +	{
> +		.name			 = "corosync_cmap",
> +		.ver			 = 0,
> +	},
>  };
>  
>  /*
> @@ -114,50 +115,30 @@ struct seus_handler_data {
>  
>  struct corosync_service_engine *ais_service[SERVICE_HANDLER_MAXIMUM_COUNT];
>  
> -hdb_handle_t service_stats_handle[SERVICE_HANDLER_MAXIMUM_COUNT][64];
> +const char *service_stats_rx[SERVICE_HANDLER_MAXIMUM_COUNT][64];
> +const char *service_stats_tx[SERVICE_HANDLER_MAXIMUM_COUNT][64];
>  
>  int ais_service_exiting[SERVICE_HANDLER_MAXIMUM_COUNT];
>  
> -static hdb_handle_t object_internal_configuration_handle;
> -
> -static hdb_handle_t object_stats_services_handle;
> -
>  static void (*service_unlink_all_complete) (void) = NULL;
>  
>  static unsigned int default_services_requested (struct corosync_api_v1 *corosync_api)
>  {
> -	hdb_handle_t object_service_handle;
> -	hdb_handle_t object_find_handle;
> -	char *value;
> +	char *value = NULL;
> +	int res;
>  
>  	/*
>  	 * Don't link default services if they have been disabled
>  	 */
> -	corosync_api->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"aisexec",
> -		strlen ("aisexec"),
> -		&object_find_handle);
> -
> -	if (corosync_api->object_find_next (
> -		object_find_handle,
> -		&object_service_handle) == 0) {
> -
> -		if ( ! corosync_api->object_key_get (object_service_handle,
> -			"defaultservices",
> -			strlen ("defaultservices"),
> -			(void *)&value,
> -			NULL)) {
> -
> -			if (value && strcmp (value, "no") == 0) {
> -				return 0;
> -			}
> -		}
> +	if (icmap_get_string("aisexec.defaultservices", &value) == CS_OK &&
> +			value != NULL && strcmp(value, "no") == 0) {
> +		res = 0;
> +	} else {
> +		res = -1;
>  	}
>  
> -	corosync_api->object_find_destroy (object_find_handle);
> -
> -	return (-1);
> +	free(value);
> +	return (res);
>  }
>  
>  unsigned int corosync_service_link_and_init (
> @@ -170,14 +151,11 @@ unsigned int corosync_service_link_and_init (
>  	hdb_handle_t handle;
>  	struct corosync_service_engine *service;
>  	int res;
> -	hdb_handle_t object_service_handle;
> -	hdb_handle_t object_stats_handle;
>  	int fn;
> -	char object_name[32];
>  	char *name_sufix;
> -	uint64_t zero_64 = 0;
>  	void* _start;
>  	void* _stop;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
>  
>  	/*
>  	 * reference the service interface
> @@ -220,32 +198,16 @@ unsigned int corosync_service_link_and_init (
>  	}
>  
>  	/*
> -	 * Store service in object database
> +	 * Store service in cmap db
>  	 */
> -	corosync_api->object_create (object_internal_configuration_handle,
> -		&object_service_handle,
> -		"service",
> -		strlen ("service"));
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.name", service->id);
> +	icmap_set_string(key_name, service_name);
>  
> -	corosync_api->object_key_create_typed (object_service_handle,
> -		"name",
> -		service_name,
> -		strlen (service_name) + 1, OBJDB_VALUETYPE_STRING);
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.ver", service->id);
> +	icmap_set_uint32(key_name, service_ver);
>  
> -	corosync_api->object_key_create_typed (object_service_handle,
> -		"ver",
> -		&service_ver,
> -		sizeof (service_ver), OBJDB_VALUETYPE_UINT32);
> -
> -	res = corosync_api->object_key_create_typed (object_service_handle,
> -		"handle",
> -		&handle,
> -		sizeof (handle), OBJDB_VALUETYPE_UINT64);
> -
> -	corosync_api->object_key_create_typed (object_service_handle,
> -		"service_id",
> -		&service->id,
> -		sizeof (service->id), OBJDB_VALUETYPE_UINT16);
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service->id);
> +	icmap_set_uint64(key_name, handle);
>  
>  	name_sufix = strrchr (service_name, '_');
>  	if (name_sufix)
> @@ -253,31 +215,17 @@ unsigned int corosync_service_link_and_init (
>  	else
>  		name_sufix = (char*)service_name;
>  
> -	corosync_api->object_create (object_stats_services_handle,
> -		&object_stats_handle,
> -		name_sufix, strlen (name_sufix));
> -
> -	corosync_api->object_key_create_typed (object_stats_handle,
> -		"service_id",
> -		&service->id, sizeof (service->id),
> -		OBJDB_VALUETYPE_INT16);
> +	snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.services.%s.service_id", name_sufix);
> +	icmap_set_uint16(key_name, service->id);
>  
>  	for (fn = 0; fn < service->exec_engine_count; fn++) {
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.services.%s.%d.tx", name_sufix, fn);
> +		icmap_set_uint64(key_name, 0);
> +		service_stats_tx[service->id][fn] = strdup(key_name);
>  
> -		snprintf (object_name, 32, "%d", fn);
> -		corosync_api->object_create (object_stats_handle,
> -			&service_stats_handle[service->id][fn],
> -			object_name, strlen (object_name));
> -
> -		corosync_api->object_key_create_typed (service_stats_handle[service->id][fn],
> -			"tx",
> -			&zero_64, sizeof (zero_64),
> -			OBJDB_VALUETYPE_UINT64);
> -
> -		corosync_api->object_key_create_typed (service_stats_handle[service->id][fn],
> -			"rx",
> -			&zero_64, sizeof (zero_64),
> -			OBJDB_VALUETYPE_UINT64);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.services.%s.%d.rx", name_sufix, fn);
> +		icmap_set_uint64(key_name, 0);
> +		service_stats_rx[service->id][fn] = strdup(key_name);
>  	}
>  
>  	log_printf (LOGSYS_LEVEL_NOTICE,
> @@ -308,10 +256,10 @@ corosync_service_unlink_priority (
>  	int *current_service_engine,
>  	hdb_handle_t *current_service_handle)
>  {
> -	unsigned short *service_id;
> -	hdb_handle_t object_service_handle;
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t *found_service_handle;
> +	unsigned short service_id;
> +	hdb_handle_t found_service_handle;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	int res;
>  
>  	for(; *current_priority >= lowest_priority; *current_priority = *current_priority - 1) {
>  		for(*current_service_engine = 0;
> @@ -324,56 +272,33 @@ corosync_service_unlink_priority (
>  			}
>  
>  			/*
> -			 * find service object in object database by service id
> -			 * and unload it if possible.
> +			 * find service handle and unload it if possible.
>  			 *
>  			 * If the service engine's exec_exit_fn returns -1 indicating
>  			 * it was busy, this function returns -1 and can be called again
>  			 * at a later time (usually via the schedwrk api).
>  			 */
> -			corosync_api->object_find_create (
> -			    object_internal_configuration_handle,
> -			    "service", strlen ("service"), &object_find_handle);
> -
> -			while (corosync_api->object_find_next (
> -				  object_find_handle, &object_service_handle) == 0) {
> -
> -				int res = corosync_api->object_key_get (
> -					object_service_handle,
> -					"service_id", strlen ("service_id"),
> -					(void *)&service_id, NULL);
> -
> -				if (res == 0 && *service_id ==
> -					 ais_service[*current_service_engine]->id) {
> -
> -					if (ais_service[*service_id]->exec_exit_fn) {
> -						res = ais_service[*service_id]->exec_exit_fn ();
> -						if (res == -1) {
> -							corosync_api->object_find_destroy (object_find_handle);
> -							return (-1);
> -						}
> +			snprintf(key_name, ICMAP_KEYNAME_MAXLEN,
> +					"internal_configuration.service.%u.handle",
> +					ais_service[*current_service_engine]->id);
> +			if (icmap_get_uint64(key_name, &found_service_handle) == CS_OK) {
> +				service_id = ais_service[*current_service_engine]->id;
> +
> +				if (ais_service[service_id]->exec_exit_fn) {
> +					res = ais_service[service_id]->exec_exit_fn ();
> +					if (res == -1) {
> +						return (-1);
>  					}
> +				}
>  
> -					res = corosync_api->object_key_get (
> -						object_service_handle,
> -						"handle", strlen ("handle"),
> -						(void *)&found_service_handle,
> -						NULL);
> -
> -					*current_service_handle = *found_service_handle;
> -
> -					ais_service_exiting[*current_service_engine] = 1;
> -
> -					corosync_api->object_find_destroy (object_find_handle);
> +				*current_service_handle = found_service_handle;
> +				ais_service_exiting[*current_service_engine] = 1;
>  
> -					/*
> -					 * Call should call this function again
> -					 */
> -					return (1);
> -				}
> +				/*
> +				 * Call should call this function again
> +				 */
> +				return (1);
>  			}
> -
> -			corosync_api->object_find_destroy (object_find_handle);
>  		}
>  	}
>  	/*
> @@ -387,14 +312,16 @@ static unsigned int service_unlink_and_exit (
>  	const char *service_name,
>  	unsigned int service_ver)
>  {
> -	hdb_handle_t object_service_handle;
> -	char *found_service_name;
> -	unsigned short *service_id;
> -	unsigned int *found_service_ver;
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t *found_service_handle;
> +	unsigned short service_id;
> +	hdb_handle_t found_service_handle;
>  	char *name_sufix;
>  	int res;
> +	const char *iter_key_name;
> +	icmap_iter_t iter;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +	unsigned int found_service_ver;
> +	char *found_service_name;
> +	int service_found;
>  
>  	name_sufix = strrchr (service_name, '_');
>  	if (name_sufix)
> @@ -402,93 +329,65 @@ static unsigned int service_unlink_and_exit (
>  	else
>  		name_sufix = (char*)service_name;
>  
> -	corosync_api->object_find_create (
> -		object_stats_services_handle,
> -		name_sufix, strlen (name_sufix),
> -		&object_find_handle);
> -
> -	if (corosync_api->object_find_next (
> -			object_find_handle,
> -			&object_service_handle) == 0) {
>  
> -		corosync_api->object_destroy (object_service_handle);
> -
> -	}
> -	corosync_api->object_find_destroy (object_find_handle);
> -
> -
> -	corosync_api->object_find_create (
> -		object_internal_configuration_handle,
> -		"service",
> -		strlen ("service"),
> -		&object_find_handle);
> -
> -	while (corosync_api->object_find_next (
> -		object_find_handle,
> -		&object_service_handle) == 0) {
> -
> -		corosync_api->object_key_get (object_service_handle,
> -			"name",
> -			strlen ("name"),
> -			(void *)&found_service_name,
> -			NULL);
> -
> -		if (strcmp (service_name, found_service_name) != 0) {
> -		    continue;
> +	service_found = 0;
> +	found_service_name = NULL;
> +	iter = icmap_iter_init("internal_configuration.service.");
> +	while ((iter_key_name = icmap_iter_next(iter, NULL, NULL)) != NULL) {
> +		res = sscanf(iter_key_name, "internal_configuration.service.%hu.%s", &service_id, key_name);
> +		if (res != 2) {
> +			continue;
>  		}
>  
> -		corosync_api->object_key_get (object_service_handle,
> -			"ver",
> -			strlen ("ver"),
> -			(void *)&found_service_ver,
> -			NULL);
> -
> -		/*
> -		 * If service found and linked exit it
> -		 */
> -		if (service_ver != *found_service_ver) {
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%hu.name", service_id);
> +		free(found_service_name);
> +		if (icmap_get_string(key_name, &found_service_name) != CS_OK) {
>  			continue;
>  		}
>  
> -		corosync_api->object_key_get (
> -			object_service_handle,
> -			"service_id", strlen ("service_id"),
> -			(void *)&service_id, NULL);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.ver", service_id);
> +		if (icmap_get_uint32(key_name, &found_service_ver) != CS_OK) {
> +			continue;
> +		}
>  
> -		if(service_id != NULL
> -			&& *service_id < SERVICE_HANDLER_MAXIMUM_COUNT
> -			&& ais_service[*service_id] != NULL) {
> +		if (service_ver == found_service_ver && strcmp(found_service_name, service_name) == 0) {
> +			free(found_service_name);
> +			service_found = 1;
> +			break;
> +		}
> +	}
> +	icmap_iter_finalize(iter);
>  
> -			corosync_api->object_find_destroy (object_find_handle);
> +	if (service_found && service_id < SERVICE_HANDLER_MAXIMUM_COUNT
> +		&& ais_service[service_id] != NULL) {
>  
> -			if (ais_service[*service_id]->exec_exit_fn) {
> -				res = ais_service[*service_id]->exec_exit_fn ();
> -				if (res == -1) {
> -					return (-1);
> -				}
> +		if (ais_service[service_id]->exec_exit_fn) {
> +			res = ais_service[service_id]->exec_exit_fn ();
> +			if (res == -1) {
> +				return (-1);
>  			}
> +		}
>  
> -			log_printf(LOGSYS_LEVEL_NOTICE,
> -				"Service engine unloaded: %s\n",
> -				   ais_service[*service_id]->name);
> -
> -			ais_service[*service_id] = NULL;
> -
> -			res = corosync_api->object_key_get (
> -				object_service_handle,
> -				"handle", strlen ("handle"),
> -				(void *)&found_service_handle,
> -				NULL);
> +		log_printf(LOGSYS_LEVEL_NOTICE,
> +			"Service engine unloaded: %s\n",
> +			   ais_service[service_id]->name);
>  
> -			cs_ipcs_service_destroy (*service_id);
> +		ais_service[service_id] = NULL;
>  
> -			lcr_ifact_release (*found_service_handle);
> +		cs_ipcs_service_destroy (service_id);
>  
> -			corosync_api->object_destroy (object_service_handle);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service_id);
> +		if (icmap_get_uint64(key_name, &found_service_handle) == CS_OK) {
> +			lcr_ifact_release (found_service_handle);
>  		}
> -	}
>  
> -	corosync_api->object_find_destroy (object_find_handle);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service_id);
> +		icmap_delete(key_name);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.name", service_id);
> +		icmap_delete(key_name);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.ver", service_id);
> +		icmap_delete(key_name);
> +	}
>  
>  	return (0);
>  }
> @@ -500,68 +399,45 @@ unsigned int corosync_service_defaults_link_and_init (struct corosync_api_v1 *co
>  {
>  	unsigned int i;
>  
> -	hdb_handle_t object_service_handle;
> +	icmap_iter_t iter;
>  	char *found_service_name;
> -	char *found_service_ver;
> -	unsigned int found_service_ver_atoi;
> -	hdb_handle_t object_find_handle;
> -	hdb_handle_t object_find2_handle;
> -	hdb_handle_t object_runtime_handle;
> -
> -	corosync_api->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"runtime",
> -		strlen ("runtime"),
> -		&object_find2_handle);
> -
> -	if (corosync_api->object_find_next (
> -			object_find2_handle,
> -			&object_runtime_handle) == 0) {
> -
> -		corosync_api->object_create (object_runtime_handle,
> -			&object_stats_services_handle,
> -			"services", strlen ("services"));
> -	}
> -	corosync_api->object_find_destroy (object_find2_handle);
> -
> -	corosync_api->object_create (OBJECT_PARENT_HANDLE,
> -		&object_internal_configuration_handle,
> -		"internal_configuration",
> -		strlen ("internal_configuration"));
> -
> -	corosync_api->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"service",
> -		strlen ("service"),
> -		&object_find_handle);
> -
> -	while (corosync_api->object_find_next (
> -		object_find_handle,
> -		&object_service_handle) == 0) {
> -
> -		corosync_api->object_key_get (object_service_handle,
> -			"name",
> -			strlen ("name"),
> -			(void *)&found_service_name,
> -			NULL);
> -
> -		found_service_ver = NULL;
> +	int res;
> +	unsigned int found_service_ver;
> +	const char *iter_key_name;
> +	unsigned int service_pos;
> +	char key_name[ICMAP_KEYNAME_MAXLEN];
> +
> +	icmap_set_ro_access("internal_configuration.", 1, 1);
> +	icmap_set_ro_access("runtime.services.", 1, 1);
> +
> +	found_service_name = NULL;
> +	iter = icmap_iter_init("service.");
> +	while ((iter_key_name = icmap_iter_next(iter, NULL, NULL)) != NULL) {
> +		res = sscanf(iter_key_name, "service.%u.%s", &service_pos, key_name);
> +		if (res != 2) {
> +			continue;
> +		}
> +		if (strcmp(key_name, "name") != 0) {
> +			continue;
> +		}
>  
> -		corosync_api->object_key_get (object_service_handle,
> -			"ver",
> -			strlen ("ver"),
> -			(void *)&found_service_ver,
> -			NULL);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "service.%u.name", service_pos);
> +		free(found_service_name);
> +		if (icmap_get_string(key_name, &found_service_name) != CS_OK) {
> +			continue;
> +		}
>  
> -		found_service_ver_atoi = (found_service_ver ? atoi (found_service_ver) : 0);
> +		snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "service.%u.ver", service_pos);
> +		if (icmap_get_uint32(key_name, &found_service_ver) != CS_OK) {
> +			continue;
> +		}
>  
>  		corosync_service_link_and_init (
>  			corosync_api,
>  			found_service_name,
> -			found_service_ver_atoi);
> +			found_service_ver);
>  	}
> -
> -	corosync_api->object_find_destroy (object_find_handle);
> +	icmap_iter_finalize(iter);
>  
>   	if (default_services_requested (corosync_api) == 0) {
>   		return (0);
> diff --git a/exec/service.h b/exec/service.h
> index b7b934a..1ff132d 100644
> --- a/exec/service.h
> +++ b/exec/service.h
> @@ -72,6 +72,7 @@ extern struct corosync_service_engine *ais_service[];
>  
>  extern int ais_service_exiting[];
>  
> -extern hdb_handle_t service_stats_handle[SERVICE_HANDLER_MAXIMUM_COUNT][64];
> +extern const char *service_stats_rx[SERVICE_HANDLER_MAXIMUM_COUNT][64];
> +extern const char *service_stats_tx[SERVICE_HANDLER_MAXIMUM_COUNT][64];
>  
>  #endif /* SERVICE_H_DEFINED */
> diff --git a/exec/totemconfig.c b/exec/totemconfig.c
> index a74017a..1248a72 100644
> --- a/exec/totemconfig.c
> +++ b/exec/totemconfig.c
> @@ -1,10 +1,11 @@
>  /*
>   * Copyright (c) 2002-2005 MontaVista Software, Inc.
> - * Copyright (c) 2006-2010 Red Hat, Inc.
> + * Copyright (c) 2006-2011 Red Hat, Inc.
>   *
>   * All rights reserved.
>   *
>   * Author: Steven Dake (sdake@xxxxxxxxxx)
> + *         Jan Friesse (jfriesse@xxxxxxxxxx)
>   *
>   * This software licensed under BSD license, the text of which follows:
>   *
> @@ -52,9 +53,9 @@
>  #include <corosync/list.h>
>  #include <qb/qbdefs.h>
>  #include <corosync/totem/totem.h>
> -#include <corosync/engine/objdb.h>
>  #include <corosync/engine/config.h>
>  #include <corosync/engine/logsys.h>
> +#include <corosync/engine/icmap.h>
>  
>  #ifdef HAVE_LIBNSS
>  #include <nss.h>
> @@ -86,162 +87,50 @@
>  #define RRP_AUTORECOVERY_CHECK_TIMEOUT		1000
>  
>  static char error_string_response[512];
> -static struct objdb_iface_ver0 *global_objdb;
> -
> -static void add_totem_config_notification(
> -	struct objdb_iface_ver0 *objdb,
> -	struct totem_config *totem_config,
> -	hdb_handle_t totem_object_handle);
>  
> +static void add_totem_config_notification(struct totem_config *totem_config);
>  
> -/* These just makes the code below a little neater */
> -static inline int objdb_get_string (
> -	const struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_service_handle,
> -	const char *key, const char **value)
> +static void totem_volatile_config_read (struct totem_config *totem_config)
>  {
> -	int res;
> -
> -	*value = NULL;
> -	if ( !(res = objdb->object_key_get (object_service_handle,
> -		key,
> -		strlen (key),
> -		(void *)value,
> -		NULL))) {
> -
> -		if (*value) {
> -			return 0;
> -		}
> -	}
> -	return -1;
> -}
> -
> -static inline void objdb_get_int (
> -	const struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_service_handle,
> -	const char *key, unsigned int *intvalue)
> -{
> -	char *value = NULL;
> -
> -	if (!objdb->object_key_get (object_service_handle,
> -		key,
> -		strlen (key),
> -		(void *)&value,
> -		NULL)) {
> -
> -		if (value) {
> -			*intvalue = atoi(value);
> -		}
> -	}
> -}
> -
> -static unsigned int totem_handle_find (
> -	struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t *totem_find_handle)  {
> -
> -	hdb_handle_t object_find_handle;
> -	unsigned int res;
> -
> -	/*
> -	 * Find a network section
> -	 */
> -	objdb->object_find_create (
> -		OBJECT_PARENT_HANDLE,
> -		"network",
> -		strlen ("network"),
> -		&object_find_handle);
> -
> -	res = objdb->object_find_next (
> -		object_find_handle,
> -		totem_find_handle);
> -
> -	objdb->object_find_destroy (object_find_handle);
> -
> -	/*
> -	 * Network section not found in configuration, checking for totem
> -	 */
> -	if (res == -1) {
> -		objdb->object_find_create (
> -			OBJECT_PARENT_HANDLE,
> -			"totem",
> -			strlen ("totem"),
> -			&object_find_handle);
> -
> -		res = objdb->object_find_next (
> -			object_find_handle,
> -			totem_find_handle);
> -
> -		objdb->object_find_destroy (object_find_handle);
> -	}
> -
> -	if (res == -1) {
> -		return (-1);
> +	char *str;
> +
> +	icmap_get_uint32("totem.token", &totem_config->token_timeout);
> +	icmap_get_uint32("totem.token_retransmit", &totem_config->token_retransmit_timeout);
> +	icmap_get_uint32("totem.hold", &totem_config->token_hold_timeout);
> +	icmap_get_uint32("totem.token_retransmits_before_loss_const", &totem_config->token_retransmits_before_loss_const);
> +	icmap_get_uint32("totem.join", &totem_config->join_timeout);
> +	icmap_get_uint32("totem.send_join", &totem_config->send_join_timeout);
> +	icmap_get_uint32("totem.consensus", &totem_config->consensus_timeout);
> +	icmap_get_uint32("totem.merge", &totem_config->merge_timeout);
> +	icmap_get_uint32("totem.downcheck", &totem_config->downcheck_timeout);
> +	icmap_get_uint32("totem.fail_recv_const", &totem_config->fail_to_recv_const);
> +	icmap_get_uint32("totem.seqno_unchanged_const", &totem_config->seqno_unchanged_const);
> +	icmap_get_uint32("totem.rrp_token_expired_timeout", &totem_config->rrp_token_expired_timeout);
> +	icmap_get_uint32("totem.rrp_problem_count_timeout", &totem_config->rrp_problem_count_timeout);
> +	icmap_get_uint32("totem.rrp_problem_count_threshold", &totem_config->rrp_problem_count_threshold);
> +	icmap_get_uint32("totem.rrp_problem_count_mcast_threshold", &totem_config->rrp_problem_count_mcast_threshold);
> +	icmap_get_uint32("totem.rrp_autorecovery_check_timeout", &totem_config->rrp_autorecovery_check_timeout);
> +	icmap_get_uint32("totem.heartbeat_failures_allowed", &totem_config->heartbeat_failures_allowed);
> +	icmap_get_uint32("totem.max_network_delay", &totem_config->max_network_delay);
> +	icmap_get_uint32("totem.window_size", &totem_config->window_size);
> +	icmap_get_uint32("totem.max_messages", &totem_config->max_messages);
> +	icmap_get_uint32("totem.miss_count_const", &totem_config->miss_count_const);
> +	if (icmap_get_string("totem.vsftype", &str) == CS_OK) {
> +		totem_config->vsf_type = str;
>  	}
> -
> -	return (0);
> -}
> -
> -static void totem_volatile_config_read (
> -	struct objdb_iface_ver0 *objdb,
> -	struct totem_config *totem_config,
> -	hdb_handle_t object_totem_handle)
> -{
> -	objdb_get_int (objdb,object_totem_handle, "token", &totem_config->token_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "token_retransmit", &totem_config->token_retransmit_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "hold", &totem_config->token_hold_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "token_retransmits_before_loss_const", &totem_config->token_retransmits_before_loss_const);
> -
> -	objdb_get_int (objdb,object_totem_handle, "join", &totem_config->join_timeout);
> -	objdb_get_int (objdb,object_totem_handle, "send_join", &totem_config->send_join_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "consensus", &totem_config->consensus_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "merge", &totem_config->merge_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "downcheck", &totem_config->downcheck_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "fail_recv_const", &totem_config->fail_to_recv_const);
> -
> -	objdb_get_int (objdb,object_totem_handle, "seqno_unchanged_const", &totem_config->seqno_unchanged_const);
> -
> -	objdb_get_int (objdb,object_totem_handle, "rrp_token_expired_timeout", &totem_config->rrp_token_expired_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "rrp_problem_count_timeout", &totem_config->rrp_problem_count_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "rrp_problem_count_threshold", &totem_config->rrp_problem_count_threshold);
> -
> -	objdb_get_int (objdb,object_totem_handle, "rrp_problem_count_mcast_threshold", &totem_config->rrp_problem_count_mcast_threshold);
> -
> -	objdb_get_int (objdb,object_totem_handle, "rrp_autorecovery_check_timeout", &totem_config->rrp_autorecovery_check_timeout);
> -
> -	objdb_get_int (objdb,object_totem_handle, "heartbeat_failures_allowed", &totem_config->heartbeat_failures_allowed);
> -
> -	objdb_get_int (objdb,object_totem_handle, "max_network_delay", &totem_config->max_network_delay);
> -
> -	objdb_get_int (objdb,object_totem_handle, "window_size", &totem_config->window_size);
> -	(void)objdb_get_string (objdb, object_totem_handle, "vsftype", &totem_config->vsf_type);
> -
> -	objdb_get_int (objdb,object_totem_handle, "max_messages", &totem_config->max_messages);
> -
> -	objdb_get_int (objdb,object_totem_handle, "miss_count_const", &totem_config->miss_count_const);
>  }
>  
>  
> -static void totem_get_crypto_type(
> -	const struct objdb_iface_ver0 *objdb,
> -	hdb_handle_t object_totem_handle,
> -	struct totem_config *totem_config)
> +static void totem_get_crypto_type(struct totem_config *totem_config)
>  {
> -	const char *str;
> +	char *str;
>  
>  	totem_config->crypto_accept = TOTEM_CRYPTO_ACCEPT_OLD;
> -	if (!objdb_get_string (objdb, object_totem_handle, "crypto_accept", &str)) {
> +	if (icmap_get_string("totem.crypto_accept", &str) == CS_OK) {
>  		if (strcmp(str, "new") == 0) {
>  			totem_config->crypto_accept = TOTEM_CRYPTO_ACCEPT_NEW;
>  		}
> +		free(str);
>  	}
>  
>  	totem_config->crypto_type = TOTEM_CRYPTO_SOBER;
> @@ -255,42 +144,34 @@ static void totem_get_crypto_type(
>  	totem_config->crypto_sign_type = CKM_SHA256_RSA_PKCS;
>  #endif
>  
> -	if (!objdb_get_string (objdb, object_totem_handle, "crypto_type", &str)) {
> +	if (icmap_get_string("totem.crypto_type", &str) == CS_OK) {
>  		if (strcmp(str, "sober") == 0) {
> +			free(str);
>  			return;
>  		}
>  #ifdef HAVE_LIBNSS
>  		if (strcmp(str, "nss") == 0) {
>  			totem_config->crypto_type = TOTEM_CRYPTO_NSS;
> -
>  		}
> +		free(str);
>  #endif
>  	}
>  }
>  
> -
> -
>  extern int totem_config_read (
> -	struct objdb_iface_ver0 *objdb,
>  	struct totem_config *totem_config,
>  	const char **error_string)
>  {
>  	int res = 0;
> -	hdb_handle_t object_totem_handle;
> -	hdb_handle_t object_interface_handle;
> -	hdb_handle_t object_member_handle;
> -	const char *str;
> +	char *str;
>  	unsigned int ringnumber = 0;
> -	hdb_handle_t object_find_interface_handle;
> -	hdb_handle_t object_find_member_handle;
> -	const char *transport_type;
>  	int member_count = 0;
> -
> -	res = totem_handle_find (objdb, &object_totem_handle);
> -	if (res == -1) {
> -printf ("couldn't find totem handle\n");
> -		return (-1);
> -	}
> +	icmap_iter_t iter, member_iter;
> +	const char *iter_key;
> +	const char *member_iter_key;
> +	char ringnumber_key[ICMAP_KEYNAME_MAXLEN];
> +	char tmp_key[ICMAP_KEYNAME_MAXLEN];
> +	uint8_t u8;
>  
>  	memset (totem_config, 0, sizeof (struct totem_config));
>  	totem_config->interfaces = malloc (sizeof (struct totem_interface) * INTERFACE_MAX);
> @@ -306,142 +187,138 @@ printf ("couldn't find totem handle\n");
>  
>  	strcpy (totem_config->rrp_mode, "none");
>  
> -	if (!objdb_get_string (objdb, object_totem_handle, "version", &str)) {
> -		if (strcmp (str, "2") == 0) {
> -			totem_config->version = 2;
> -		}
> -	}
> -	if (!objdb_get_string (objdb, object_totem_handle, "secauth", &str)) {
> +	icmap_get_uint32("totem.version", (uint32_t *)&totem_config->version);
> +
> +	if (icmap_get_string("totem.secauth", &str) == CS_OK) {
>  		if (strcmp (str, "on") == 0) {
>  			totem_config->secauth = 1;
>  		}
>  		if (strcmp (str, "off") == 0) {
>  			totem_config->secauth = 0;
>  		}
> +		free(str);
>  	}
>  
>  	if (totem_config->secauth == 1) {
> -		totem_get_crypto_type(objdb, object_totem_handle, totem_config);
> +		totem_get_crypto_type(totem_config);
>  	}
>  
> -	if (!objdb_get_string (objdb, object_totem_handle, "rrp_mode", &str)) {
> +	if (icmap_get_string("totem.rrp_mode", &str) == CS_OK) {
>  		strcpy (totem_config->rrp_mode, str);
> +		free(str);
>  	}
>  
>  	/*
>  	 * Get interface node id
>  	 */
> -	objdb_get_int (objdb, object_totem_handle, "nodeid", &totem_config->node_id);
> +	icmap_get_uint32("totem.nodeid", &totem_config->node_id);
>  
>  	totem_config->clear_node_high_bit = 0;
> -	if (!objdb_get_string (objdb,object_totem_handle, "clear_node_high_bit", &str)) {
> +	if (icmap_get_string("totem.clear_node_high_bit", &str) == CS_OK) {
>  		if (strcmp (str, "yes") == 0) {
>  			totem_config->clear_node_high_bit = 1;
>  		}
> +		free(str);
>  	}
>  
> -	objdb_get_int (objdb,object_totem_handle, "threads", &totem_config->threads);
> -
> +	icmap_get_uint32("totem.threads", &totem_config->threads);
>  
> -	objdb_get_int (objdb,object_totem_handle, "netmtu", &totem_config->net_mtu);
> +	icmap_get_uint32("totem.netmtu", &totem_config->net_mtu);
>  
>  	/*
>  	 * Get things that might change in the future
>  	 */
> -	totem_volatile_config_read (objdb, totem_config, object_totem_handle);
> +	totem_volatile_config_read(totem_config);
>  
> -	objdb->object_find_create (
> -		object_totem_handle,
> -		"interface",
> -		strlen ("interface"),
> -		&object_find_interface_handle);
> +	iter = icmap_iter_init("totem.interface.");
> +	while ((iter_key = icmap_iter_next(iter, NULL, NULL)) != NULL) {
> +		res = sscanf(iter_key, "totem.interface.%[^.].%s", ringnumber_key, tmp_key);
> +		if (res != 2) {
> +			continue;
> +		}
>  
> -	while (objdb->object_find_next (
> -		object_find_interface_handle,
> -		&object_interface_handle) == 0) {
> +		if (strcmp(tmp_key, "bindnetaddr") != 0) {
> +			continue;
> +		}
>  
>  		member_count = 0;
>  
> -		objdb_get_int (objdb, object_interface_handle, "ringnumber", &ringnumber);
> +		ringnumber = atoi(ringnumber_key);
> +
> +		/*
> +		 * Get the bind net address
> +		 */
> +		if (icmap_get_string(iter_key, &str) == CS_OK) {
> +			res = totemip_parse (&totem_config->interfaces[ringnumber].bindnet, str,
> +						     totem_config->interfaces[ringnumber].mcast_addr.family);
> +			free(str);
> +		}
>  
>  		/*
>  		 * Get interface multicast address
>  		 */
> -		if (!objdb_get_string (objdb, object_interface_handle, "mcastaddr", &str)) {
> +		snprintf(tmp_key, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.mcastaddr", ringnumber);
> +		if (icmap_get_string(tmp_key, &str) == CS_OK) {
>  			res = totemip_parse (&totem_config->interfaces[ringnumber].mcast_addr, str, 0);
> +			free(str);
>  		}
> +
>  		totem_config->broadcast_use = 0;
> -		if (!objdb_get_string (objdb, object_interface_handle, "broadcast", &str)) {
> +		snprintf(tmp_key, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.broadcast", ringnumber);
> +		if (icmap_get_string(tmp_key, &str) == CS_OK) {
>  			if (strcmp (str, "yes") == 0) {
>  				totem_config->broadcast_use = 1;
>  				totemip_parse (
>  					&totem_config->interfaces[ringnumber].mcast_addr,
>  					"255.255.255.255", 0);
>  			}
> +			free(str);
>  		}
>  
>  		/*
>  		 * Get mcast port
>  		 */
> -		if (!objdb_get_string (objdb, object_interface_handle, "mcastport", &str)) {
> -			totem_config->interfaces[ringnumber].ip_port = atoi (str);
> -		}
> -
> -		/*
> -		 * Get the bind net address
> -		 */
> -		if (!objdb_get_string (objdb, object_interface_handle, "bindnetaddr", &str)) {
> -
> -			res = totemip_parse (&totem_config->interfaces[ringnumber].bindnet, str,
> -					     totem_config->interfaces[ringnumber].mcast_addr.family);
> -		}
> +		snprintf(tmp_key, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.mcastport", ringnumber);
> +		icmap_get_uint16(tmp_key, &totem_config->interfaces[ringnumber].ip_port);
>  
>  		/*
>  		 * Get the TTL
>  		 */
>  		totem_config->interfaces[ringnumber].ttl = 1;
> -		if (!objdb_get_string (objdb, object_interface_handle, "ttl", &str)) {
> -			totem_config->interfaces[ringnumber].ttl = atoi (str);
> -		}
>  
> -		objdb->object_find_create (
> -			object_interface_handle,
> -			"member",
> -			strlen ("member"),
> -			&object_find_member_handle);
> +		snprintf(tmp_key, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.ttl", ringnumber);
>  
> -		while (objdb->object_find_next (
> -			object_find_member_handle,
> -			&object_member_handle) == 0) {
> +		if (icmap_get_uint8(tmp_key, &u8) == CS_OK) {
> +			totem_config->interfaces[ringnumber].ttl = u8;
> +		}
>  
> -			if (!objdb_get_string (objdb, object_member_handle, "memberaddr", &str)) {
> -				res = totemip_parse (&totem_config->interfaces[ringnumber].member_list[member_count++], str, 0);
> +		snprintf(tmp_key, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.member.", ringnumber);
> +		member_iter = icmap_iter_init(tmp_key);
> +		while ((member_iter_key = icmap_iter_next(member_iter, NULL, NULL)) != NULL) {
> +			if (icmap_get_string(member_iter_key, &str) == CS_OK) {
> +				res = totemip_parse (&totem_config->interfaces[ringnumber].member_list[member_count++],
> +						str, 0);
>  			}
> -		
>  		}
> +
>  		totem_config->interfaces[ringnumber].member_count = member_count;
>  		totem_config->interface_count++;
> -		objdb->object_find_destroy (object_find_member_handle);
>  	}
>  
> -	objdb->object_find_destroy (object_find_interface_handle);
> -
> -	add_totem_config_notification(objdb, totem_config, object_totem_handle);
> -
>  	totem_config->transport_number = TOTEM_TRANSPORT_UDP;
> -	(void)objdb_get_string (objdb, object_totem_handle, "transport", &transport_type);
> -
> -	if (transport_type) {
> -		if (strcmp (transport_type, "udpu") == 0) {
> +	if (icmap_get_string("totem.transport", &str) == CS_OK) {
> +		if (strcmp (str, "udpu") == 0) {
>  			totem_config->transport_number = TOTEM_TRANSPORT_UDPU;
>  		}
> -	}
> -	if (transport_type) {
> -		if (strcmp (transport_type, "iba") == 0) {
> +
> +		if (strcmp (str, "iba") == 0) {
>  			totem_config->transport_number = TOTEM_TRANSPORT_RDMA;
>  		}
> +		free(str);
>  	}
>  
> +	add_totem_config_notification(totem_config);
> +
>  	return 0;
>  }
>  
> @@ -804,14 +681,13 @@ parse_error:
>  }
>  
>  int totem_config_keyread (
> -	struct objdb_iface_ver0 *objdb,
>  	struct totem_config *totem_config,
>  	const char **error_string)
>  {
>  	int got_key = 0;
> -	const char *key_location = NULL;
> -	hdb_handle_t object_totem_handle;
> +	char *key_location = NULL;
>  	int res;
> +	size_t key_len;
>  
>  	memset (totem_config->private_key, 0, 128);
>  	totem_config->private_key_len = 128;
> @@ -820,34 +696,27 @@ int totem_config_keyread (
>  		return (0);
>  	}
>  
> -	res = totem_handle_find (objdb, &object_totem_handle);
> -	if (res == -1) {
> -		return (-1);
> -	}
> -	/* objdb may store the location of the key file */
> -	if (!objdb_get_string (objdb,object_totem_handle, "keyfile", &key_location)
> -	    && key_location) {
> +	/* cmap may store the location of the key file */
> +	if (icmap_get_string("totem.keyfile", &key_location) == CS_OK) {
>  		res = read_keyfile(key_location, totem_config, error_string);
> +		free(key_location);
>  		if (res)  {
>  			goto key_error;
>  		}
>  		got_key = 1;
> -	} else { /* Or the key itself may be in the objdb */
> -		char *key = NULL;
> -		size_t key_len;
> -		res = objdb->object_key_get (object_totem_handle,
> -			"key",
> -			strlen ("key"),
> -			(void *)&key,
> -			&key_len);
> -
> -		if (res == 0 && key) {
> +	} else { /* Or the key itself may be in the cmap */
> +		if (icmap_get("totem.key", NULL, &key_len, NULL) == CS_OK) {
>  			if (key_len > sizeof (totem_config->private_key)) {
> +				sprintf(error_string_response, "key is too long");
> +				goto key_error;
> +			}
> +			if (icmap_get("totem.key", totem_config->private_key, &key_len, NULL) == CS_OK) {
> +				totem_config->private_key_len = key_len;
> +				got_key = 1;
> +			} else {
> +				sprintf(error_string_response, "can't store private key");
>  				goto key_error;
>  			}
> -			memcpy(totem_config->private_key, key, key_len);
> -			totem_config->private_key_len = key_len;
> -			got_key = 1;
>  		}
>  	}
>  
> @@ -870,100 +739,23 @@ key_error:
>  
>  }
>  
> -static void totem_key_change_notify(object_change_type_t change_type,
> -			      hdb_handle_t parent_object_handle,
> -			      hdb_handle_t object_handle,
> -			      const void *object_name_pt, size_t object_name_len,
> -			      const void *key_name_pt, size_t key_len,
> -			      const void *key_value_pt, size_t key_value_len,
> -			      void *priv_data_pt)
> +static void totem_change_notify(
> +	int32_t event,
> +	const char *key_name,
> +	struct icmap_notify_value new_val,
> +	struct icmap_notify_value old_val,
> +	void *user_data)
>  {
> -	struct totem_config *totem_config = priv_data_pt;
> -
> -	if (memcmp(object_name_pt, "totem", object_name_len) == 0)
> -		totem_volatile_config_read(global_objdb,
> -					   totem_config,
> -					   object_handle); // CHECK
> -}
> -
> -static void totem_objdb_reload_notify(objdb_reload_notify_type_t type, int flush,
> -				      void *priv_data_pt)
> -{
> -	struct totem_config *totem_config = priv_data_pt;
> -	hdb_handle_t totem_object_handle;
> -
> -	if (totem_config == NULL)
> -	        return;
> -
> -	/*
> -	 * A new totem {} key might exist, cancel the
> -	 * existing notification at the start of reload,
> -	 * and start a new one on the new object when
> -	 * it's all settled.
> -	 */
> -
> -	if (type == OBJDB_RELOAD_NOTIFY_START) {
> -		global_objdb->object_track_stop(
> -			totem_key_change_notify,
> -			NULL,
> -			NULL,
> -			NULL,
> -			totem_config);
> -	}
> -
> -	if (type == OBJDB_RELOAD_NOTIFY_END ||
> -	    type == OBJDB_RELOAD_NOTIFY_FAILED) {
> -
> -
> -		if (!totem_handle_find(global_objdb,
> -				      &totem_object_handle)) {
> -
> -		        global_objdb->object_track_start(totem_object_handle,
> -						  1,
> -						  totem_key_change_notify,
> -						  NULL, // object_create_notify,
> -						  NULL, // object_destroy_notify,
> -						  NULL, // object_reload_notify
> -						  totem_config); // priv_data
> -			/*
> -			 * Reload the configuration
> -			 */
> -			totem_volatile_config_read(global_objdb,
> -						   totem_config,
> -						   totem_object_handle);
> -
> -		}
> -		else {
> -			log_printf(LOGSYS_LEVEL_ERROR, "totem objdb tracking stopped, cannot find totem{} handle on objdb\n");
> -		}
> -	}
> +	totem_volatile_config_read((struct totem_config *)user_data);
>  }
>  
> -
> -static void add_totem_config_notification(
> -	struct objdb_iface_ver0 *objdb,
> -	struct totem_config *totem_config,
> -	hdb_handle_t totem_object_handle)
> +static void add_totem_config_notification(struct totem_config *totem_config)
>  {
> +	icmap_track_t icmap_track;
>  
> -	global_objdb = objdb;
> -	objdb->object_track_start(totem_object_handle,
> -				  1,
> -				  totem_key_change_notify,
> -				  NULL, // object_create_notify,
> -				  NULL, // object_destroy_notify,
> -				  NULL, // object_reload_notify
> -				  totem_config); // priv_data
> -
> -	/*
> -	 * Reload notify must be on the parent object
> -	 */
> -	objdb->object_track_start(OBJECT_PARENT_HANDLE,
> -				  1,
> -				  NULL, // key_change_notify,
> -				  NULL, // object_create_notify,
> -				  NULL, // object_destroy_notify,
> -				  totem_objdb_reload_notify, // object_reload_notify
> -				  totem_config); // priv_data
> -
> +	icmap_track_add("totem.",
> +		ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY | ICMAP_TRACK_PREFIX,
> +		totem_change_notify,
> +		totem_config,
> +		&icmap_track);
>  }
> diff --git a/exec/totemconfig.h b/exec/totemconfig.h
> index 9901b8c..cee52b7 100644
> --- a/exec/totemconfig.h
> +++ b/exec/totemconfig.h
> @@ -40,12 +40,10 @@
>  #include <corosync/list.h>
>  #include <qb/qbloop.h>
>  #include <corosync/totem/totempg.h>
> -#include <corosync/engine/objdb.h>
>  
>  #include "totemsrp.h"
>  
>  extern int totem_config_read (
> -	struct objdb_iface_ver0 *objdb,
>  	struct totem_config *totem_config,
>  	const char **error_string);
>  
> @@ -54,7 +52,6 @@ extern int totem_config_validate (
>  	const char **error_string);
>  
>  int totem_config_keyread (
> -	struct objdb_iface_ver0 *objdb,
>  	struct totem_config *totem_config,
>  	const char **error_string);
>  
> diff --git a/exec/vsf_quorum.c b/exec/vsf_quorum.c
> index ede7786..53ad331 100644
> --- a/exec/vsf_quorum.c
> +++ b/exec/vsf_quorum.c
> @@ -67,6 +67,7 @@
>  #include <corosync/engine/coroapi.h>
>  #include <corosync/engine/logsys.h>
>  #include <corosync/engine/quorum.h>
> +#include <corosync/engine/icmap.h>
>  
>  LOGSYS_DECLARE_SUBSYS ("QUORUM");
>  
> @@ -278,8 +279,6 @@ static struct quorum_callin_functions callins = {
>  
>  static int quorum_exec_init_fn (struct corosync_api_v1 *api)
>  {
> -	hdb_handle_t find_handle;
> -	hdb_handle_t quorum_handle = 0;
>  	hdb_handle_t q_handle;
>  	char *quorum_module;
>  	int res;
> @@ -300,37 +299,28 @@ static int quorum_exec_init_fn (struct corosync_api_v1 *api)
>  	/*
>  	 * Look for a quorum provider
>  	 */
> -	api->object_find_create(OBJECT_PARENT_HANDLE, "quorum", strlen("quorum"), &find_handle);
> -        api->object_find_next(find_handle, &quorum_handle);
> -	api->object_find_destroy(find_handle);
> -
> -	if (quorum_handle) {
> -		if ( !(res = api->object_key_get(quorum_handle,
> -						 "provider",
> -						 strlen("provider"),
> -						 (void *)&quorum_module,
> -						 NULL))) {
> -
> -			res = lcr_ifact_reference (
> -				&q_handle,
> -				quorum_module,
> -				0,
> -				&quorum_iface_p,
> -				0);
> -
> -			if (res == -1) {
> -				log_printf (LOGSYS_LEVEL_NOTICE,
> -					    "Couldn't load quorum provider %s\n",
> -					    quorum_module);
> -				return (-1);
> -			}
> -
> +	if (icmap_get_string("quorum.provider", &quorum_module) == CS_OK) {
> +		res = lcr_ifact_reference (
> +			&q_handle,
> +			quorum_module,
> +			0,
> +			&quorum_iface_p,
> +			0);
> +
> +		if (res == -1) {
>  			log_printf (LOGSYS_LEVEL_NOTICE,
> -				    "Using quorum provider %s\n", quorum_module);
> -
> -			quorum_iface = (struct quorum_services_api_ver1 *)quorum_iface_p;
> -			quorum_iface->init (api, quorum_api_set_quorum);
> +				    "Couldn't load quorum provider %s\n",
> +				    quorum_module);
> +			free(quorum_module);
> +			return (-1);
>  		}
> +
> +		log_printf (LOGSYS_LEVEL_NOTICE,
> +			    "Using quorum provider %s\n", quorum_module);
> +
> +		quorum_iface = (struct quorum_services_api_ver1 *)quorum_iface_p;
> +		quorum_iface->init (api, quorum_api_set_quorum);
> +		free(quorum_module);
>  	}
>  	if (!quorum_iface) {
>  		/*
> diff --git a/include/corosync/engine/config.h b/include/corosync/engine/config.h
> index e7c8ded..e6f7686 100644
> --- a/include/corosync/engine/config.h
> +++ b/include/corosync/engine/config.h
> @@ -36,9 +36,9 @@
>  #define CONFIG_H_DEFINED
>  
>  struct config_iface_ver0 {
> -	int (*config_readconfig) (struct objdb_iface_ver0 *objdb, const char **error_string);
> -	int (*config_writeconfig) (struct objdb_iface_ver0 *objdb, const char **error_string);
> -	int (*config_reloadconfig) (struct objdb_iface_ver0 *objdb, int flush, const char **error_string);
> +	int (*config_readconfig) (const char **error_string);
> +	int (*config_writeconfig) (const char **error_string);
> +	int (*config_reloadconfig) (int flush, const char **error_string);
>  };
>  
>  
> diff --git a/lib/sa-confdb.c b/lib/sa-confdb.c
> index bd97234..bf7bc3e 100644
> --- a/lib/sa-confdb.c
> +++ b/lib/sa-confdb.c
> @@ -96,7 +96,7 @@ static int load_config(void)
>  	hdb_handle_t config_version = 0;
>  	void *config_p;
>  	struct config_iface_ver0 *config;
> -	const char *error_string;
> +//	const char *error_string;
>  	char *strtok_savept;
>  
>  	/* User's bootstrap config service */
> @@ -127,7 +127,7 @@ static int load_config(void)
>  			return -1;
>  		}
>  
> -		res = config->config_readconfig(objdb, &error_string);
> +//		res = config->config_readconfig(objdb, &error_string);
>  		if (res == -1) {
>  			return -1;
>  		}

_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss


[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux