static mi_response_t *mi_list_root_path(const mi_params_t *params, struct mi_handler *async_hdl) { mi_response_t *resp; mi_item_t *resp_arr; mi_item_t *root_item; struct httpd_cb *cb = httpd_cb_list; resp = init_mi_result_array(&resp_arr); if (!resp) return 0; while(cb) { root_item = add_mi_object(resp_arr, 0, 0); if (!root_item) goto error; if (add_mi_string(root_item, MI_SSTR("http_root"), cb->http_root->s, cb->http_root->len) < 0) goto error; if (add_mi_string(root_item, MI_SSTR("module"), (char*)cb->module, strlen(cb->module)) < 0) goto error; cb = cb->next; } return resp; error: free_mi_response(resp); return 0; }
static int rl_map_print(void *param, str key, void *value) { rl_pipe_t *pipe = (rl_pipe_t *) value; str *alg; mi_item_t *pipe_item = (mi_item_t *)param; if (!pipe) { LM_ERR("invalid pipe value\n"); return -1; } if (!pipe_item) { LM_ERR("no mi item\n"); return -1; } if (!key.len || !key.s) { LM_ERR("no key found\n"); return -1; } /* skip if no algo */ if (pipe->algo == PIPE_ALGO_NOP) return 0; if (add_mi_string(pipe_item, MI_SSTR("id"), key.s, key.len) < 0) return -1; if (!(alg = get_rl_algo_name(pipe->algo))) { LM_ERR("[BUG] unknown algorithm %d\n", pipe->algo); return -1; } if (add_mi_string(pipe_item, MI_SSTR("algorithm"), alg->s, alg->len) < 0) return -1; if (add_mi_number(pipe_item, MI_SSTR("limit"), pipe->limit) < 0) return -1; if (add_mi_number(pipe_item, MI_SSTR("counter"), pipe->last_counter) < 0) return -1; return 0; }
static inline int internal_mi_print_b2bl_entity_id(mi_item_t *item, b2bl_entity_id_t *c) { if (c->scenario_id.s && c->scenario_id.len != 0) if (add_mi_string(item, MI_SSTR("scenario_id"), c->scenario_id.s, c->scenario_id.len) < 0) goto error; if (c->key.s && c->key.len != 0) if (add_mi_string(item, MI_SSTR("key"), c->key.s, c->key.len) < 0) goto error; if (add_mi_number(item, MI_SSTR("disconnected"), c->disconnected) < 0) goto error; if (add_mi_number(item, MI_SSTR("state"), c->state) < 0) goto error; if (add_mi_number(item, MI_SSTR("no"), c->no) < 0) goto error; if (add_mi_number(item, MI_SSTR("type"), c->type) < 0) goto error; if (c->peer) { if (c->peer->key.s && c->peer->key.len != 0) if (add_mi_string(item, MI_SSTR("peer"), c->peer->key.s, c->peer->key.len) < 0) goto error; } if (c->to_uri.s && c->to_uri.len != 0) if (add_mi_string(item, MI_SSTR("to_uri"), c->to_uri.s, c->to_uri.len) < 0) goto error; if (c->from_uri.s && c->from_uri.len != 0) if (add_mi_string(item, MI_SSTR("from_uri"), c->from_uri.s, c->from_uri.len) < 0) goto error; if (c->from_dname.s && c->from_dname.len != 0) if (add_mi_string(item, MI_SSTR("from_dname"), c->from_dname.s, c->from_dname.len) < 0) goto error; return 0; error: LM_ERR("failed to add mi item\n"); return -1; }
mi_response_t *mi_sca_list(const mi_params_t *params, struct mi_handler *async_hdl) { int i, index; b2b_sca_record_t *rec; b2b_sca_call_t *call; str_lst_t *watcher; mi_response_t *resp; mi_item_t *resp_arr; mi_item_t *resp_item, *watchers_arr, *apps_arr, *app_item; resp = init_mi_result_array(&resp_arr); if (!resp) return 0; for(index = 0; index<b2b_sca_hsize; index++) { lock_get(&b2b_sca_htable[index].lock); rec = b2b_sca_htable[index].first; while(rec) { resp_item = add_mi_object(resp_arr, NULL, 0); if (!resp_item) goto error; if (add_mi_string(resp_item, MI_SSTR("shared_line"), rec->shared_line.s, rec->shared_line.len) < 0) goto error; watchers_arr = add_mi_array(resp_item, MI_SSTR("watchers")); if (!watchers_arr) goto error; watcher = rec->watchers; while (watcher) { if (add_mi_string(watchers_arr, 0, 0, watcher->watcher.s, watcher->watcher.len) < 0) goto error; watcher = watcher->next; } apps_arr = add_mi_array(resp_item, MI_SSTR("appearances")); if (!apps_arr) goto error; for (i=0; i<MAX_APPEARANCE_INDEX; i++) { if (rec->call[i]) { call = rec->call[i]; app_item = add_mi_object(apps_arr, NULL, 0); if (!app_item) goto error; if (add_mi_string(app_item, MI_SSTR("index"), call->appearance_index_str.s, call->appearance_index_str.len) < 0) goto error; if (add_mi_string(app_item, MI_SSTR("state"), app_state[call->call_state].s, app_state[call->call_state].len) < 0) goto error; if (add_mi_string(app_item, MI_SSTR("b2b_key"), call->b2bl_key.s, call->b2bl_key.len) < 0) goto error; if (add_mi_string(app_item, MI_SSTR("app_uri"), call->call_info_apperance_uri.s, call->call_info_apperance_uri.len) < 0) goto error; } } rec = rec->next; } lock_release(&b2b_sca_htable[index].lock); } return resp; error: lock_release(&b2b_sca_htable[index].lock); LM_ERR("Unable to create reply\n"); free_mi_response(resp); return NULL; }
static mi_response_t *clusterer_list_cap(const mi_params_t *params, struct mi_handler *async_hdl) { mi_response_t *resp = NULL; mi_item_t *resp_obj; mi_item_t *clusters_arr, *cluster_item; mi_item_t *cap_arr, *cap_item; cluster_info_t *cl; struct local_cap *cap; static str str_ok = str_init("Ok"); static str str_not_synced = str_init("not synced"); resp = init_mi_result_object(&resp_obj); if (!resp) return 0; clusters_arr = add_mi_array(resp_obj, MI_SSTR("Clusters")); if (!clusters_arr) { free_mi_response(resp); return 0; } lock_start_read(cl_list_lock); for (cl = *cluster_list; cl; cl = cl->next) { cluster_item = add_mi_object(clusters_arr, NULL, 0); if (!cluster_item) goto error; if (add_mi_number(cluster_item, MI_SSTR("cluster_id"), cl->cluster_id) < 0) goto error; cap_arr = add_mi_array(cluster_item, MI_SSTR("Capabilities")); if (!cap_arr) goto error; for (cap = cl->capabilities; cap; cap = cap->next) { cap_item = add_mi_object(cap_arr, NULL, 0); if (!cap_item) goto error; if (add_mi_string(cap_item, MI_SSTR("name"), cap->reg.name.s, cap->reg.name.len) < 0) goto error; lock_get(cl->lock); if (add_mi_string(cap_item, MI_SSTR("state"), (cap->flags & CAP_STATE_OK) ? str_ok.s : str_not_synced.s, (cap->flags & CAP_STATE_OK) ? str_ok.len : str_not_synced.len) < 0) { lock_release(cl->lock); goto error; } lock_release(cl->lock); } } lock_stop_read(cl_list_lock); return resp; error: lock_stop_read(cl_list_lock); if (resp) free_mi_response(resp); return NULL; }
static mi_response_t *clusterer_list(const mi_params_t *params, struct mi_handler *async_hdl) { cluster_info_t *cl; node_info_t *n_info; str val; mi_response_t *resp = NULL; mi_item_t *resp_obj; mi_item_t *clusters_arr, *cluster_item, *nodes_arr, *node_item; static str str_up = str_init("Up"); static str str_prob = str_init("Probe"); static str str_down = str_init("Down"); static str str_none = str_init("none"); int n_hop; resp = init_mi_result_object(&resp_obj); if (!resp) return 0; clusters_arr = add_mi_array(resp_obj, MI_SSTR("Clusters")); if (!clusters_arr) { free_mi_response(resp); return 0; } lock_start_read(cl_list_lock); /* iterate through clusters */ for (cl = *cluster_list; cl; cl = cl->next) { cluster_item = add_mi_object(clusters_arr, NULL, 0); if (!cluster_item) goto error; if (add_mi_number(cluster_item, MI_SSTR("cluster_id"), cl->cluster_id) < 0) goto error; nodes_arr = add_mi_array(cluster_item, MI_SSTR("Nodes")); if (!nodes_arr) goto error; /* iterate through nodes */ for (n_info = cl->node_list; n_info; n_info = n_info->next) { node_item = add_mi_object(nodes_arr, NULL, 0); if (!node_item) goto error; if (add_mi_number(node_item, MI_SSTR("node_id"), n_info->node_id) < 0) goto error; if (add_mi_number(node_item, MI_SSTR("db_id"), n_info->id) < 0) goto error; if (add_mi_string(node_item, MI_SSTR("url"), n_info->url.s, n_info->url.len) < 0) goto error; lock_get(n_info->lock); if (n_info->link_state == LS_UP) val = str_up; else if (n_info->link_state == LS_DOWN) val = str_down; else val = str_prob; if (add_mi_string(node_item, MI_SSTR("link_state"), val.s, val.len) < 0) { lock_release(n_info->lock); goto error; } lock_release(n_info->lock); n_hop = get_next_hop(n_info); if (n_hop <= 0) val = str_none; else val.s = int2str(n_hop, &val.len); if (add_mi_string(node_item, MI_SSTR("next_hop"), val.s, val.len) < 0) goto error; if (n_info->description.s) { if (add_mi_string(node_item, MI_SSTR("description"), n_info->description.s, n_info->description.len) < 0) goto error; } else if (add_mi_string(node_item, MI_SSTR("description"), MI_SSTR("none")) < 0) goto error; } } lock_stop_read(cl_list_lock); return resp; error: lock_stop_read(cl_list_lock); if (resp) free_mi_response(resp); 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; }
static inline int mi_print_b2be_dlg(mi_item_t *resp_arr, b2b_table htable, unsigned int hsize) { int i; b2b_dlg_t* dlg; dlg_leg_t* leg; mi_item_t *arr_item, *cseq_item, *rs_item, *ct_item, *legs_arr, *leg_item; for(i = 0; i< hsize; i++) { lock_get(&htable[i].lock); dlg = htable[i].first; while(dlg) { arr_item = add_mi_object(resp_arr, NULL, 0); if (!arr_item) goto error; if (add_mi_number(arr_item, MI_SSTR("dlg"), dlg->id) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("param"), dlg->param.s, dlg->param.len) < 0) goto error; if (add_mi_number(arr_item, MI_SSTR("state"), dlg->state) < 0) goto error; if (add_mi_number(arr_item, MI_SSTR("last_invite_cseq"), dlg->last_invite_cseq) < 0) goto error; if (add_mi_number(arr_item, MI_SSTR("last_method"), dlg->last_method) < 0) goto error; if (dlg->last_reply_code) if (add_mi_number(arr_item, MI_SSTR("last_reply_code"), dlg->last_reply_code) < 0) goto error; if (add_mi_number(arr_item, MI_SSTR("db_flag"), dlg->db_flag) < 0) goto error; if (dlg->ruri.len) if (add_mi_string(arr_item, MI_SSTR("ruri"), dlg->ruri.s, dlg->ruri.len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("callid"), dlg->callid.s, dlg->callid.len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("from"), dlg->from_dname.s, dlg->from_dname.len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("from_uri"), dlg->from_uri.s, dlg->from_uri.len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("from_tag"), dlg->tag[0].s, dlg->tag[0].len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("to"), dlg->to_dname.s, dlg->to_dname.len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("to_uri"), dlg->to_uri.s, dlg->to_uri.len) < 0) goto error; if (add_mi_string(arr_item, MI_SSTR("to_tag"), dlg->tag[1].s, dlg->tag[1].len) < 0) goto error; cseq_item = add_mi_object(arr_item, MI_SSTR("cseq") < 0); if (!cseq_item) goto error; if (add_mi_number(cseq_item, MI_SSTR("caller"), dlg->cseq[0]) < 0) goto error; if (add_mi_number(cseq_item, MI_SSTR("callee"), dlg->cseq[1]) < 0) goto error; if (dlg->route_set[0].len||dlg->route_set[1].len) { rs_item = add_mi_object(arr_item, MI_SSTR("route_set") < 0); if (!rs_item) goto error; if (dlg->route_set[0].len) if (add_mi_string(rs_item, MI_SSTR("caller"), dlg->route_set[0].s, dlg->route_set[0].len) < 0) goto error; if (dlg->route_set[1].len) if (add_mi_string(rs_item, MI_SSTR("callee"), dlg->route_set[1].s, dlg->route_set[1].len) < 0) goto error; } ct_item = add_mi_object(arr_item, MI_SSTR("contact") < 0); if (!ct_item) goto error; if (add_mi_string(ct_item, MI_SSTR("caller"), dlg->contact[0].s, dlg->contact[0].len) < 0) goto error; if (add_mi_string(ct_item, MI_SSTR("callee"), dlg->contact[1].s, dlg->contact[1].len) < 0) goto error; if (dlg->send_sock) if (add_mi_string(arr_item, MI_SSTR("send_sock"), dlg->send_sock->name.s, dlg->send_sock->name.len) < 0) goto error; if(dlg->uac_tran||dlg->uas_tran||dlg->update_tran||dlg->cancel_tm_tran) { if(dlg->uac_tran) if (add_mi_string(arr_item, MI_SSTR("tm_tran"), MI_SSTR("uac")) < 0) goto error; if(dlg->uas_tran) if (add_mi_string(arr_item, MI_SSTR("tm_tran"), MI_SSTR("uas")) < 0) goto error; if(dlg->update_tran) if (add_mi_string(arr_item, MI_SSTR("tm_tran"), MI_SSTR("update")) < 0) goto error; if(dlg->cancel_tm_tran) if (add_mi_string(arr_item, MI_SSTR("tm_tran"), MI_SSTR("cancel_tm")) < 0) goto error; } if ( (leg=dlg->legs)!=NULL ) { legs_arr = add_mi_array(arr_item, MI_SSTR("LEGS")); if (!legs_arr) goto error; while(leg) { leg_item = add_mi_object(legs_arr, NULL, 0); if (!leg_item) goto error; if (add_mi_number(leg_item, MI_SSTR("id"), leg->id) < 0) goto error; if (add_mi_string(leg_item, MI_SSTR("tag"), leg->tag.s, leg->tag.len) < 0) goto error; if (add_mi_number(leg_item, MI_SSTR("cseq"), leg->cseq) < 0) goto error; if (add_mi_string(leg_item, MI_SSTR("contact"), leg->contact.s, leg->contact.len) < 0) goto error; if(leg->route_set.len) if (add_mi_string(leg_item, MI_SSTR("route_set"), leg->route_set.s, leg->route_set.len) < 0) goto error; leg=leg->next; } } dlg = dlg->next; } lock_release(&htable[i].lock); } return 0; error: lock_release(&htable[i].lock); LM_ERR("failed to add node\n"); return -1; }