46#define ICMAP_MAX_VALUE_LEN (16*1024)
85static int icmap_check_key_name(
const char *key_name);
101static int icmap_is_valid_name_char(
char c);
108 const char *key_name,
119 const char *key_name,
132 res |= QB_MAP_NOTIFY_DELETED;
136 res |= QB_MAP_NOTIFY_REPLACED;
140 res |= QB_MAP_NOTIFY_INSERTED;
144 res |= QB_MAP_NOTIFY_RECURSIVE;
154 if (track_type & QB_MAP_NOTIFY_DELETED) {
158 if (track_type & QB_MAP_NOTIFY_REPLACED) {
162 if (track_type & QB_MAP_NOTIFY_INSERTED) {
166 if (track_type & QB_MAP_NOTIFY_RECURSIVE) {
173static void icmap_map_free_cb(uint32_t event,
174 char* key,
void* old_value,
182 if (item != NULL &&
value != old_value) {
192 *result = malloc(
sizeof(
struct icmap_map));
193 if (*result == NULL) {
197 (*result)->qb_map = qb_trie_create();
198 if ((*result)->qb_map == NULL) {
203 err = qb_map_notify_add((*result)->qb_map, NULL, icmap_map_free_cb, QB_MAP_NOTIFY_FREE, NULL);
205 qb_map_destroy((*result)->qb_map);
217static void icmap_set_ro_access_free(
void)
219 struct qb_list_head *iter, *tmp_iter;
222 qb_list_for_each_safe(iter, tmp_iter, &icmap_ro_access_item_list_head) {
224 qb_list_del(&icmap_ro_ai->
list);
230static void icmap_del_all_track(
void)
232 struct qb_list_head *iter, *tmp_iter;
235 qb_list_for_each_safe(iter, tmp_iter, &icmap_track_list_head) {
245 qb_map_destroy(map->
qb_map);
254 icmap_del_all_track();
263 icmap_set_ro_access_free();
271 return (icmap_global_map);
274static int icmap_is_valid_name_char(
char c)
276 return ((c >=
'a' && c <=
'z') ||
277 (c >=
'A' && c <=
'Z') ||
278 (c >=
'0' && c <=
'9') ||
279 c ==
'.' || c ==
'_' || c ==
'-' || c ==
'/' || c ==
':');
286 for (i = 0; i < strlen(
key_name); i++) {
287 if (!icmap_is_valid_name_char(
key_name[i])) {
293static int icmap_check_key_name(
const char *
key_name)
301 for (i = 0; i < strlen(
key_name); i++) {
302 if (!icmap_is_valid_name_char(
key_name[i])) {
354 if (value_len > strlen((
const char *)
value) + 1) {
373 ptr_len = strlen((
const char *)
value);
374 if (ptr_len > value_len) {
383 return (memcmp(item->
value,
value, value_len) == 0);
391 const char *key_name1,
393 const char *key_name2)
397 if (map1 == NULL || key_name1 == NULL || map2 == NULL || key_name2 == NULL) {
401 item1 = qb_map_get(map1->
qb_map, key_name1);
402 item2 = qb_map_get(map2->
qb_map, key_name2);
404 if (item1 == NULL || item2 == NULL) {
420 size_t new_value_len;
421 size_t new_item_size;
440 if (icmap_check_key_name(
key_name) != 0) {
447 new_value_len = strlen((
const char *)
value);
459 new_item_size =
sizeof(
struct icmap_item) + new_value_len;
460 new_item = malloc(new_item_size);
461 if (new_item == NULL) {
464 memset(new_item, 0, new_item_size);
480 memcpy(new_item->
value,
value, new_value_len);
483 ((
char *)new_item->
value)[new_value_len - 1] = 0;
705 size_t tmp_value_len;
707 res = icmap_get_ref_r(map,
key_name, &tmp_value, &tmp_value_len,
type);
723 memcpy(
value, tmp_value, tmp_value_len);
754 *str = malloc(str_len);
784 key_size =
sizeof(key_value);
785 memset(key_value, 0, key_size);
791 if (key_type !=
type) {
947 switch (item->
type) {
950 memcpy(&u8, item->
value,
sizeof(u8));
956 memcpy(&u16, item->
value,
sizeof(u16));
962 memcpy(&u32, item->
value,
sizeof(u32));
968 memcpy(&u64, item->
value,
sizeof(u64));
1008 switch (item->
type) {
1011 *(uint8_t *)item->
value += step;
1015 *(uint16_t *)item->
value += step;
1019 *(uint32_t *)item->
value += step;
1023 *(uint64_t *)item->
value += step;
1090 return (qb_map_pref_iter_create(map->
qb_map, prefix));
1104 res = qb_map_iter_next(iter, (
void **)&item);
1122 qb_map_iter_free(iter);
1125static void icmap_notify_fn(uint32_t event,
char *key,
void *old_value,
void *
value,
void *
user_data)
1133 if (
value == NULL && old_value == NULL) {
1137 if (new_item != NULL) {
1140 new_val.data = new_item->
value;
1142 memset(&new_val, 0,
sizeof(new_val));
1148 if (old_item != NULL && old_item != new_item) {
1149 old_val.type = old_item->
type;
1151 old_val.data = old_item->
value;
1153 memset(&old_val, 0,
sizeof(old_val));
1164 const char *key_name,
1186 if (key_name != NULL) {
1187 (*icmap_track)->key_name = strdup(key_name);
1190 (*icmap_track)->track_type = track_type;
1191 (*icmap_track)->notify_fn = notify_fn;
1194 if ((err = qb_map_notify_add(icmap_global_map->
qb_map, (*icmap_track)->key_name, icmap_notify_fn,
1196 free((*icmap_track)->key_name);
1202 qb_list_init(&(*icmap_track)->list);
1203 qb_list_add (&(*icmap_track)->list, &icmap_track_list_head);
1231 struct qb_list_head *iter, *tmp_iter;
1234 qb_list_for_each_safe(iter, tmp_iter, &icmap_ro_access_item_list_head) {
1244 qb_list_del(&icmap_ro_ai->
list);
1257 icmap_ro_ai = malloc(
sizeof(*icmap_ro_ai));
1258 if (icmap_ro_ai == NULL) {
1262 memset(icmap_ro_ai, 0,
sizeof(*icmap_ro_ai));
1264 if (icmap_ro_ai->
key_name == NULL) {
1270 qb_list_init(&icmap_ro_ai->
list);
1271 qb_list_add (&icmap_ro_ai->
list, &icmap_ro_access_item_list_head);
1278 struct qb_list_head *iter;
1281 qb_list_for_each(iter, &icmap_ro_access_item_list_head) {
1284 if (icmap_ro_ai->
prefix) {
1319 err = icmap_get_ref_r(src_map,
key_name, &
value, &value_len, &value_type);
1321 goto exit_iter_finalize;
1326 goto exit_iter_finalize;
cs_error_t qb_to_cs_error(int result)
qb_to_cs_error
cs_error_t
The cs_error_t enum.
int32_t icmap_tt_to_qbtt(int32_t track_type)
cs_error_t icmap_set_int8_r(const icmap_map_t map, const char *key_name, int8_t value)
icmap_iter_t icmap_iter_init_r(const icmap_map_t map, const char *prefix)
icmap_iter_init_r
cs_error_t icmap_get_uint8(const char *key_name, uint8_t *u8)
cs_error_t icmap_get_string_r(icmap_map_t map, const char *key_name, char **str)
cs_error_t icmap_fast_adjust_int_r(const icmap_map_t map, const char *key_name, int32_t step)
icmap_fast_adjust_int_r
cs_error_t icmap_get_uint16(const char *key_name, uint16_t *u16)
cs_error_t icmap_get_float_r(const icmap_map_t map, const char *key_name, float *flt)
cs_error_t icmap_get_uint32(const char *key_name, uint32_t *u32)
cs_error_t icmap_set_int16_r(const icmap_map_t map, const char *key_name, int16_t value)
cs_error_t icmap_set_uint8(const char *key_name, uint8_t value)
cs_error_t icmap_set_uint16_r(const icmap_map_t map, const char *key_name, uint16_t value)
cs_error_t icmap_set(const char *key_name, const void *value, size_t value_len, icmap_value_types_t type)
Store value with value_len length and type as key_name name in global icmap.
cs_error_t icmap_adjust_int(const char *key_name, int32_t step)
icmap_adjust_int
cs_error_t icmap_get_int64(const char *key_name, int64_t *i64)
cs_error_t icmap_set_ro_access(const char *key_name, int prefix, int ro_access)
Set read-only access for given key (key_name) or prefix, If prefix is set.
cs_error_t icmap_set_uint32_r(const icmap_map_t map, const char *key_name, uint32_t value)
cs_error_t icmap_delete(const char *key_name)
Delete key from map.
cs_error_t icmap_fast_dec_r(const icmap_map_t map, const char *key_name)
icmap_fast_dec_r
cs_error_t icmap_set_float_r(const icmap_map_t map, const char *key_name, float value)
#define ICMAP_MAX_VALUE_LEN
cs_error_t icmap_set_int32(const char *key_name, int32_t value)
cs_error_t icmap_delete_r(const icmap_map_t map, const char *key_name)
icmap_delete_r
cs_error_t icmap_get_uint8_r(const icmap_map_t map, const char *key_name, uint8_t *u8)
cs_error_t icmap_set_uint8_r(const icmap_map_t map, const char *key_name, uint8_t value)
cs_error_t icmap_set_uint16(const char *key_name, uint16_t value)
cs_error_t icmap_dec_r(const icmap_map_t map, const char *key_name)
icmap_dec_r
cs_error_t icmap_set_int64(const char *key_name, int64_t value)
cs_error_t icmap_track_add(const char *key_name, int32_t track_type, icmap_notify_fn_t notify_fn, void *user_data, icmap_track_t *icmap_track)
Add tracking function for given key_name.
cs_error_t icmap_set_string(const char *key_name, const char *value)
cs_error_t icmap_set_r(const icmap_map_t map, const char *key_name, const void *value, size_t value_len, icmap_value_types_t type)
Reentrant version of icmap_set.
int32_t icmap_qbtt_to_tt(int32_t track_type)
cs_error_t icmap_inc(const char *key_name)
Increase stored value by one.
cs_error_t icmap_set_int64_r(const icmap_map_t map, const char *key_name, int64_t value)
cs_error_t icmap_set_double(const char *key_name, double value)
cs_error_t icmap_set_int8(const char *key_name, int8_t value)
size_t icmap_get_valuetype_len(icmap_value_types_t type)
int icmap_key_value_eq(const icmap_map_t map1, const char *key_name1, const icmap_map_t map2, const char *key_name2)
Compare value of key with name key_name1 in map1 with key with name key_name2 in map2.
cs_error_t icmap_get_float(const char *key_name, float *flt)
cs_error_t icmap_get_double(const char *key_name, double *dbl)
cs_error_t icmap_get_int8_r(const icmap_map_t map, const char *key_name, int8_t *i8)
cs_error_t icmap_set_uint64_r(const icmap_map_t map, const char *key_name, uint64_t value)
cs_error_t icmap_fast_dec(const char *key_name)
Decrease stored value by one.
icmap_iter_t icmap_iter_init(const char *prefix)
Initialize iterator with given prefix.
cs_error_t icmap_set_double_r(const icmap_map_t map, const char *key_name, double value)
cs_error_t icmap_get_uint16_r(const icmap_map_t map, const char *key_name, uint16_t *u16)
cs_error_t icmap_copy_map(icmap_map_t dst_map, const icmap_map_t src_map)
Copy content of src_map icmap to dst_map icmap.
cs_error_t icmap_init_r(icmap_map_t *result)
Initialize additional (local, reentrant) icmap_map.
cs_error_t icmap_set_int32_r(const icmap_map_t map, const char *key_name, int32_t value)
cs_error_t icmap_get_int64_r(const icmap_map_t map, const char *key_name, int64_t *i64)
void icmap_convert_name_to_valid_name(char *key_name)
Converts given key_name to valid key name (replacing all prohibited characters by _)
cs_error_t icmap_fast_adjust_int(const char *key_name, int32_t step)
icmap_fast_adjust_int
const char * icmap_iter_next(icmap_iter_t iter, size_t *value_len, icmap_value_types_t *type)
Return next item in iterator iter.
cs_error_t icmap_fast_inc(const char *key_name)
Increase stored value by one.
cs_error_t icmap_inc_r(const icmap_map_t map, const char *key_name)
icmap_inc_r
icmap_map_t icmap_get_global_map(void)
Return global icmap.
cs_error_t icmap_get(const char *key_name, void *value, size_t *value_len, icmap_value_types_t *type)
Retrieve value of key key_name and store it in user preallocated value pointer.
cs_error_t icmap_get_double_r(const icmap_map_t map, const char *key_name, double *dbl)
cs_error_t icmap_set_string_r(const icmap_map_t map, const char *key_name, const char *value)
void icmap_iter_finalize(icmap_iter_t iter)
Finalize iterator.
void icmap_fini_r(const icmap_map_t map)
Finalize local, reentrant icmap.
cs_error_t icmap_get_int32_r(const icmap_map_t map, const char *key_name, int32_t *i32)
cs_error_t icmap_get_r(const icmap_map_t map, const char *key_name, void *value, size_t *value_len, icmap_value_types_t *type)
Same as icmap_get but it's reentrant and operates on given icmap_map.
cs_error_t icmap_get_int32(const char *key_name, int32_t *i32)
cs_error_t icmap_init(void)
Initialize global icmap.
cs_error_t icmap_track_delete(icmap_track_t icmap_track)
Remove previously added track.
cs_error_t icmap_set_uint64(const char *key_name, uint64_t value)
cs_error_t icmap_dec(const char *key_name)
Decrease stored value by one.
void icmap_fini(void)
Finalize global icmap.
cs_error_t icmap_get_uint32_r(const icmap_map_t map, const char *key_name, uint32_t *u32)
cs_error_t icmap_get_uint64_r(const icmap_map_t map, const char *key_name, uint64_t *u64)
QB_LIST_DECLARE(icmap_ro_access_item_list_head)
cs_error_t icmap_get_int16_r(const icmap_map_t map, const char *key_name, int16_t *i16)
cs_error_t icmap_set_uint32(const char *key_name, uint32_t value)
void * icmap_track_get_user_data(icmap_track_t icmap_track)
Return user data associated with given track.
cs_error_t icmap_set_int16(const char *key_name, int16_t value)
cs_error_t icmap_get_uint64(const char *key_name, uint64_t *u64)
cs_error_t icmap_get_string(const char *key_name, char **str)
Shortcut for icmap_get for string type.
cs_error_t icmap_get_int16(const char *key_name, int16_t *i16)
cs_error_t icmap_adjust_int_r(const icmap_map_t map, const char *key_name, int32_t step)
icmap_adjust_int_r
int icmap_is_key_ro(const char *key_name)
Check in given key is read only.
cs_error_t icmap_set_float(const char *key_name, float value)
cs_error_t icmap_get_int8(const char *key_name, int8_t *i8)
cs_error_t icmap_fast_inc_r(const icmap_map_t map, const char *key_name)
icmap_fast_inc_r
#define ICMAP_TRACK_MODIFY
#define ICMAP_KEYNAME_MINLEN
Minimum lenght of key in icmap.
icmap_value_types_t
Possible types of value.
#define ICMAP_TRACK_DELETE
#define ICMAP_TRACK_PREFIX
Whole prefix is tracked, instead of key only (so "totem." tracking means that "totem....
void(* icmap_notify_fn_t)(int32_t event, const char *key_name, struct icmap_notify_value new_value, struct icmap_notify_value old_value, void *user_data)
Prototype for notify callback function.
qb_map_iter_t * icmap_iter_t
Itterator type.
struct icmap_track * icmap_track_t
Track type.
#define ICMAP_KEYNAME_MAXLEN
Maximum length of key in icmap.
Structure passed as new_value and old_value in change callback.
icmap_notify_fn_t notify_fn