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);
213static void icmap_set_ro_access_free(
void)
215 struct qb_list_head *iter, *tmp_iter;
218 qb_list_for_each_safe(iter, tmp_iter, &icmap_ro_access_item_list_head) {
220 qb_list_del(&icmap_ro_ai->
list);
226static void icmap_del_all_track(
void)
228 struct qb_list_head *iter, *tmp_iter;
231 qb_list_for_each_safe(iter, tmp_iter, &icmap_track_list_head) {
241 qb_map_destroy(map->
qb_map);
250 icmap_del_all_track();
259 icmap_set_ro_access_free();
267 return (icmap_global_map);
270static int icmap_is_valid_name_char(
char c)
272 return ((c >=
'a' && c <=
'z') ||
273 (c >=
'A' && c <=
'Z') ||
274 (c >=
'0' && c <=
'9') ||
275 c ==
'.' || c ==
'_' || c ==
'-' || c ==
'/' || c ==
':');
282 for (i = 0; i < strlen(
key_name); i++) {
283 if (!icmap_is_valid_name_char(
key_name[i])) {
289static int icmap_check_key_name(
const char *
key_name)
297 for (i = 0; i < strlen(
key_name); i++) {
298 if (!icmap_is_valid_name_char(
key_name[i])) {
350 if (value_len > strlen((
const char *)
value) + 1) {
369 ptr_len = strlen((
const char *)
value);
370 if (ptr_len > value_len) {
379 return (memcmp(item->
value,
value, value_len) == 0);
387 const char *key_name1,
389 const char *key_name2)
393 if (map1 == NULL || key_name1 == NULL || map2 == NULL || key_name2 == NULL) {
397 item1 = qb_map_get(map1->
qb_map, key_name1);
398 item2 = qb_map_get(map2->
qb_map, key_name2);
400 if (item1 == NULL || item2 == NULL) {
416 size_t new_value_len;
417 size_t new_item_size;
436 if (icmap_check_key_name(
key_name) != 0) {
443 new_value_len = strlen((
const char *)
value);
455 new_item_size =
sizeof(
struct icmap_item) + new_value_len;
456 new_item = malloc(new_item_size);
457 if (new_item == NULL) {
460 memset(new_item, 0, new_item_size);
476 memcpy(new_item->
value,
value, new_value_len);
479 ((
char *)new_item->
value)[new_value_len - 1] = 0;
701 size_t tmp_value_len;
703 res = icmap_get_ref_r(map,
key_name, &tmp_value, &tmp_value_len,
type);
719 memcpy(
value, tmp_value, tmp_value_len);
750 *str = malloc(str_len);
780 key_size =
sizeof(key_value);
781 memset(key_value, 0, key_size);
787 if (key_type !=
type) {
943 switch (item->
type) {
946 memcpy(&u8, item->
value,
sizeof(u8));
952 memcpy(&u16, item->
value,
sizeof(u16));
958 memcpy(&u32, item->
value,
sizeof(u32));
964 memcpy(&u64, item->
value,
sizeof(u64));
1004 switch (item->
type) {
1007 *(uint8_t *)item->
value += step;
1011 *(uint16_t *)item->
value += step;
1015 *(uint32_t *)item->
value += step;
1019 *(uint64_t *)item->
value += step;
1086 return (qb_map_pref_iter_create(map->
qb_map, prefix));
1100 res = qb_map_iter_next(iter, (
void **)&item);
1118 qb_map_iter_free(iter);
1121static void icmap_notify_fn(uint32_t event,
char *key,
void *old_value,
void *
value,
void *
user_data)
1129 if (
value == NULL && old_value == NULL) {
1133 if (new_item != NULL) {
1136 new_val.data = new_item->
value;
1138 memset(&new_val, 0,
sizeof(new_val));
1144 if (old_item != NULL && old_item != new_item) {
1145 old_val.type = old_item->
type;
1147 old_val.data = old_item->
value;
1149 memset(&old_val, 0,
sizeof(old_val));
1160 const char *key_name,
1182 if (key_name != NULL) {
1183 (*icmap_track)->key_name = strdup(key_name);
1186 (*icmap_track)->track_type = track_type;
1187 (*icmap_track)->notify_fn = notify_fn;
1190 if ((err = qb_map_notify_add(icmap_global_map->
qb_map, (*icmap_track)->key_name, icmap_notify_fn,
1192 free((*icmap_track)->key_name);
1198 qb_list_init(&(*icmap_track)->list);
1199 qb_list_add (&(*icmap_track)->list, &icmap_track_list_head);
1227 struct qb_list_head *iter, *tmp_iter;
1230 qb_list_for_each_safe(iter, tmp_iter, &icmap_ro_access_item_list_head) {
1240 qb_list_del(&icmap_ro_ai->
list);
1253 icmap_ro_ai = malloc(
sizeof(*icmap_ro_ai));
1254 if (icmap_ro_ai == NULL) {
1258 memset(icmap_ro_ai, 0,
sizeof(*icmap_ro_ai));
1260 if (icmap_ro_ai->
key_name == NULL) {
1266 qb_list_init(&icmap_ro_ai->
list);
1267 qb_list_add (&icmap_ro_ai->
list, &icmap_ro_access_item_list_head);
1274 struct qb_list_head *iter;
1277 qb_list_for_each(iter, &icmap_ro_access_item_list_head) {
1280 if (icmap_ro_ai->
prefix) {
1315 err = icmap_get_ref_r(src_map,
key_name, &
value, &value_len, &value_type);
1317 goto exit_iter_finalize;
1322 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