struct mi_root* mt_mi_list(struct mi_root* cmd_tree, void* param) { str tname = {0, 0}; m_tree_t *pt; struct mi_node* node = NULL; struct mi_root* rpl_tree = NULL; struct mi_node* rpl = NULL; static char code_buf[MT_MAX_DEPTH+1]; int len; if(!mt_defined_trees()) { LM_ERR("empty tree list\n"); return init_mi_tree( 500, MI_INTERNAL_ERR_S, MI_INTERNAL_ERR_LEN); } /* read tree name */ node = cmd_tree->node.kids; if(node != NULL) { tname = node->value; if(tname.s == NULL || tname.len== 0) return init_mi_tree( 404, "domain not found", 16); if(*tname.s=='.') { tname.s = 0; tname.len = 0; } } rpl_tree = init_mi_tree(200, MI_OK_S, MI_OK_LEN); if(rpl_tree == NULL) return 0; rpl = &rpl_tree->node; pt = mt_get_first_tree(); while(pt!=NULL) { if(tname.s==NULL || (tname.s!=NULL && pt->tname.len>=tname.len && strncmp(pt->tname.s, tname.s, tname.len)==0)) { len = 0; if(mt_print_mi_node(pt, pt->head, rpl, code_buf, len)<0) goto error; } pt = pt->next; } return rpl_tree; error: free_mi_tree(rpl_tree); return 0; }
int mt_print_mi_node(m_tree_t *tree, mt_node_t *pt, struct mi_node* rpl, char *code, int len) { int i; struct mi_node* node = NULL; struct mi_attr* attr= NULL; mt_is_t *tvalues; str val; if(pt==NULL || len>=MT_MAX_DEPTH) return 0; for(i=0; i<MT_NODE_SIZE; i++) { code[len]=mt_char_list.s[i]; tvalues = pt[i].tvalues; if (tvalues != NULL) { node = add_mi_node_child(rpl, 0, "MT", 2, 0, 0); if(node == NULL) goto error; attr = add_mi_attr(node, MI_DUP_VALUE, "TNAME", 5, tree->tname.s, tree->tname.len); if(attr == NULL) goto error; attr = add_mi_attr(node, MI_DUP_VALUE, "TPREFIX", 7, code, len+1); if(attr == NULL) goto error; while (tvalues != NULL) { if (tree->type == MT_TREE_IVAL) { val.s = int2str(tvalues->tvalue.n, &val.len); attr = add_mi_attr(node, MI_DUP_VALUE, "TVALUE", 6, val.s, val.len); } else { attr = add_mi_attr(node, MI_DUP_VALUE, "TVALUE", 6, tvalues->tvalue.s.s, tvalues->tvalue.s.len); } if(attr == NULL) goto error; tvalues = tvalues->next; } } if(mt_print_mi_node(tree, pt[i].child, rpl, code, len+1)<0) goto error; } return 0; error: return -1; }
int mt_print_mi_node(m_tree_t *tree, mt_node_t *pt, struct mi_node* rpl, char *code, int len) { int i; struct mi_node* node = NULL; struct mi_attr* attr= NULL; if(pt==NULL || len>=MT_MAX_DEPTH) return 0; for(i=0; i<MT_NODE_SIZE; i++) { code[len]=mt_char_list.s[i]; if(pt[i].tvalue.s!=NULL) { node = add_mi_node_child(rpl, 0, "MT", 2, 0, 0); if(node == NULL) goto error; attr = add_mi_attr(node, MI_DUP_VALUE, "TNAME", 5, tree->tname.s, tree->tname.len); if(attr == NULL) goto error; attr = add_mi_attr(node, MI_DUP_VALUE, "TPREFIX", 7, code, len+1); if(attr == NULL) goto error; attr = add_mi_attr(node, MI_DUP_VALUE, "TVALUE", 6, pt[i].tvalue.s, pt[i].tvalue.len); if(attr == NULL) goto error; } if(mt_print_mi_node(tree, pt[i].child, rpl, code, len+1)<0) goto error; } return 0; error: return -1; }