static struct mi_root* mi_b2b_list(struct mi_root* cmd, void* param) { int i, len, index; char* p; b2bl_tuple_t* tuple; struct mi_root *rpl_tree; struct mi_node *node=NULL, *node1=NULL, *rpl=NULL, *node_a=NULL; struct mi_attr* attr; rpl_tree = init_mi_tree( 200, MI_OK_S, MI_OK_LEN); if (rpl_tree==NULL) return NULL; rpl = &rpl_tree->node; rpl->flags |= MI_IS_ARRAY; for(i = 0; i< b2bl_hsize; i++) { lock_get(&b2bl_htable[i].lock); tuple = b2bl_htable[i].first; while(tuple) { p = int2str((unsigned long)(tuple->id), &len); node = add_mi_node_child(rpl, MI_DUP_VALUE, "tuple", 5, p, len); if(node == NULL) goto error; attr = add_mi_attr(node, MI_DUP_VALUE, "key", 3, tuple->key->s, tuple->key->len); if(attr == NULL) goto error; p = int2str((unsigned long)(tuple->scenario_state), &len); attr = add_mi_attr(node, MI_DUP_VALUE, "scenario_state", 14, p, len); if(attr == NULL) goto error; p = int2str((unsigned long)(tuple->lifetime), &len); attr = add_mi_attr(node, MI_DUP_VALUE, "lifetime", 8, p, len); if(attr == NULL) goto error; p = int2str((unsigned long)(tuple->db_flag), &len); attr = add_mi_attr(node, MI_DUP_VALUE, "db_flag", 7, p, len); if(attr == NULL) goto error; if (tuple->scenario) { attr = add_mi_attr(node, MI_DUP_VALUE, "scenario", 8, tuple->scenario->id.s, tuple->scenario->id.len); if(attr == NULL) goto error; p = int2str((unsigned long)(tuple->next_scenario_state), &len); attr = add_mi_attr(node, MI_DUP_VALUE, "next_scenario_state", 19, p, len); if(attr == NULL) goto error; } for (node_a=NULL,index=0; index < MAX_B2BL_ENT; index++) { if (tuple->servers[index] != NULL) { if (node_a==NULL) { node_a = add_mi_node_child(node, MI_IS_ARRAY, "SERVERS", 7, NULL, 0); if (node_a==NULL) goto error; } p = int2str((unsigned long)(index), &len); node1 = add_mi_node_child(node_a, MI_DUP_VALUE, "server", 6, p, len); if(node1 == NULL) goto error; if (internal_mi_print_b2bl_entity_id(node1, tuple->servers[index])!=0) goto error; } } for (node_a=NULL,index=0; index < MAX_B2BL_ENT; index++) { if (tuple->clients[index] != NULL) { if (node_a==NULL) { node_a = add_mi_node_child(node, MI_IS_ARRAY, "CLIENTS", 7, NULL, 0); if (node_a==NULL) goto error; } p = int2str((unsigned long)(index), &len); node1 = add_mi_node_child(node_a, MI_DUP_VALUE, "client", 6, p, len); if(node1 == NULL) goto error; if (internal_mi_print_b2bl_entity_id(node1, tuple->clients[index])!=0) goto error; } } for (node_a=NULL,index=0; index < MAX_BRIDGE_ENT; index++) { if (tuple->bridge_entities[index] != NULL) { if (node_a==NULL) { node_a = add_mi_node_child(node, MI_IS_ARRAY, "BRIDGE_ENTITIES", 15, NULL, 0); if (node_a==NULL) goto error; } p = int2str((unsigned long)(index), &len); node1 = add_mi_node_child(node_a, MI_DUP_VALUE, "bridge_entitie", 14, p, len); if(node1 == NULL) goto error; if (internal_mi_print_b2bl_entity_id(node1, tuple->bridge_entities[index])!=0) goto error; } } tuple = tuple->next; } lock_release(&b2bl_htable[i].lock); } return rpl_tree; error: lock_release(&b2bl_htable[i].lock); LM_ERR("Unable to create reply\n"); free_mi_tree(rpl_tree); return NULL; }
static mi_response_t *mi_b2b_list(const mi_params_t *params, struct mi_handler *async_hdl) { int i, index; b2bl_tuple_t* tuple; mi_response_t *resp; mi_item_t *resp_obj; mi_item_t *tuples_arr, *tuple_item; mi_item_t *servers_arr, *server_item; mi_item_t *clients_arr, *clients_item; mi_item_t *b_entities_arr, *b_entities_item; resp = init_mi_result_object(&resp_obj); if (!resp) return 0; tuples_arr = add_mi_array(resp_obj, MI_SSTR("Tuples")); if (!tuples_arr) { free_mi_response(resp); return 0; } for(i = 0; i< b2bl_hsize; i++) { lock_get(&b2bl_htable[i].lock); tuple = b2bl_htable[i].first; while(tuple) { tuple_item = add_mi_object(tuples_arr, NULL, 0); if (!tuple_item) goto error; if (add_mi_number(tuple_item, MI_SSTR("id"), tuple->id) < 0) goto error; if (add_mi_string(tuple_item, MI_SSTR("key"), tuple->key->s, tuple->key->len) < 0) goto error; if (add_mi_number(tuple_item, MI_SSTR("scenario_state"), tuple->scenario_state) < 0) goto error; if (add_mi_number(tuple_item, MI_SSTR("lifetime"), tuple->lifetime) < 0) goto error; if (add_mi_number(tuple_item, MI_SSTR("db_flag"), tuple->db_flag) < 0) goto error; if (tuple->scenario) { if (add_mi_string(tuple_item, MI_SSTR("scenario"), tuple->scenario->id.s, tuple->scenario->id.len) < 0) goto error; if (add_mi_number(tuple_item, MI_SSTR("next_scenario_state"), tuple->next_scenario_state) < 0) goto error; } servers_arr = add_mi_array(tuple_item, MI_SSTR("SERVERS")); if (!servers_arr) goto error; for (index=0; index < MAX_B2BL_ENT; index++) { if (tuple->servers[index] != NULL) { server_item = add_mi_object(servers_arr, NULL, 0); if (!server_item) goto error; if (add_mi_number(server_item, MI_SSTR("index"), index) < 0) goto error; if (internal_mi_print_b2bl_entity_id(server_item, tuple->servers[index])!=0) goto error; } } clients_arr = add_mi_array(tuple_item, MI_SSTR("CLIENTS")); if (!clients_arr) goto error; for (index=0; index < MAX_B2BL_ENT; index++) { if (tuple->clients[index] != NULL) { clients_item = add_mi_object(clients_arr, NULL, 0); if (!clients_item) goto error; if (add_mi_number(clients_item, MI_SSTR("index"), index) < 0) goto error; if (internal_mi_print_b2bl_entity_id(clients_item, tuple->clients[index])!=0) goto error; } } b_entities_arr = add_mi_array(tuple_item, MI_SSTR("BRIDGE_ENTITIES")); if (!b_entities_arr) goto error; for (index=0; index < MAX_BRIDGE_ENT; index++) { if (tuple->bridge_entities[index] != NULL) { b_entities_item = add_mi_object(b_entities_arr, NULL, 0); if (!b_entities_item) goto error; if (add_mi_number(b_entities_item, MI_SSTR("index"), index) < 0) goto error; if (internal_mi_print_b2bl_entity_id(b_entities_item, tuple->bridge_entities[index])!=0) goto error; } } tuple = tuple->next; } lock_release(&b2bl_htable[i].lock); } return resp; error: lock_release(&b2bl_htable[i].lock); LM_ERR("Unable to create reply\n"); free_mi_response(resp); return NULL; }