static struct mi_root* ds_mi_set(struct mi_root* cmd_tree, void* param) { str sp; int ret; unsigned int group; int state; struct mi_node* node; node = cmd_tree->node.kids; if(node == NULL) return init_mi_tree(400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); sp = node->value; if(sp.len<=0 || !sp.s) { LM_ERR("bad state value\n"); return init_mi_tree(500, "bad state value", 15); } state = ds_parse_flags(sp.s, sp.len); if( state < 0 ) { LM_ERR("unknow state value\n"); return init_mi_tree(500, "unknown state value", 19); } node = node->next; if(node == NULL) return init_mi_tree(400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); sp = node->value; if(sp.s == NULL) { return init_mi_tree(500, "group not found", 15); } if(str2int(&sp, &group)) { LM_ERR("bad group value\n"); return init_mi_tree( 500, "bad group value", 16); } node= node->next; if(node == NULL) return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); sp = node->value; if(sp.s == NULL) { return init_mi_tree(500,"address not found", 18 ); } ret = ds_reinit_state(group, &sp, state); if(ret!=0) { return init_mi_tree(404, "destination not found", 21); } return init_mi_tree( 200, MI_OK_S, MI_OK_LEN); }
/* * RPC command to set the state of a destination address */ static void dispatcher_rpc_set_state(rpc_t* rpc, void* ctx) { int group; str dest; str state; int stval; if(rpc->scan(ctx, ".SdS", &state, &group, &dest)<3) { rpc->fault(ctx, 500, "Invalid Parameters"); return; } if(state.len<=0 || state.s==NULL) { LM_ERR("bad state value\n"); rpc->fault(ctx, 500, "Invalid State Parameter"); return; } stval = 0; if(state.s[0]=='0' || state.s[0]=='I' || state.s[0]=='i') { /* set inactive */ stval |= DS_INACTIVE_DST; if((state.len>1) && (state.s[1]=='P' || state.s[1]=='p')) stval |= DS_PROBING_DST; } else if(state.s[0]=='1' || state.s[0]=='A' || state.s[0]=='a') { /* set active */ if((state.len>1) && (state.s[1]=='P' || state.s[1]=='p')) stval |= DS_PROBING_DST; } else if(state.s[0]=='2' || state.s[0]=='D' || state.s[0]=='d') { /* set disabled */ stval |= DS_DISABLED_DST; } else if(state.s[0]=='3' || state.s[0]=='T' || state.s[0]=='t') { /* set trying */ stval |= DS_TRYING_DST; if((state.len>1) && (state.s[1]=='P' || state.s[1]=='p')) stval |= DS_PROBING_DST; } else { LM_ERR("unknow state value\n"); rpc->fault(ctx, 500, "Unknown State Value"); return; } if(ds_reinit_state(group, &dest, stval)<0) { rpc->fault(ctx, 500, "State Update Failed"); return; } return; }
static struct mi_root* ds_mi_set(struct mi_root* cmd_tree, void* param) { str sp; int ret; unsigned int group, state; struct mi_node* node; node = cmd_tree->node.kids; if(node == NULL) return init_mi_tree(400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); sp = node->value; if(sp.len<=0 || !sp.s) { LM_ERR("bad state value\n"); return init_mi_tree(500, "bad state value", 15); } state = 0; if(sp.s[0]=='0' || sp.s[0]=='I' || sp.s[0]=='i') { /* set inactive */ state |= DS_INACTIVE_DST; if((sp.len>1) && (sp.s[1]=='P' || sp.s[1]=='p')) state |= DS_PROBING_DST; } else if(sp.s[0]=='1' || sp.s[0]=='A' || sp.s[0]=='a') { /* set active */ if((sp.len>1) && (sp.s[1]=='P' || sp.s[1]=='p')) state |= DS_PROBING_DST; } else if(sp.s[0]=='2' || sp.s[0]=='D' || sp.s[0]=='d') { /* set disabled */ state |= DS_DISABLED_DST; } else if(sp.s[0]=='3' || sp.s[0]=='T' || sp.s[0]=='t') { /* set trying */ state |= DS_TRYING_DST; if((sp.len>1) && (sp.s[1]=='P' || sp.s[1]=='p')) state |= DS_PROBING_DST; } else { LM_ERR("unknow state value\n"); return init_mi_tree(500, "unknown state value", 19); } node = node->next; if(node == NULL) return init_mi_tree(400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); sp = node->value; if(sp.s == NULL) { return init_mi_tree(500, "group not found", 15); } if(str2int(&sp, &group)) { LM_ERR("bad group value\n"); return init_mi_tree( 500, "bad group value", 16); } node= node->next; if(node == NULL) return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); sp = node->value; if(sp.s == NULL) { return init_mi_tree(500,"address not found", 18 ); } ret = ds_reinit_state(group, &sp, state); if(ret!=0) { return init_mi_tree(404, "destination not found", 21); } return init_mi_tree( 200, MI_OK_S, MI_OK_LEN); }