void rpc_shv_set(rpc_t* rpc, void* c) { str varname, type, value; int ival = 0; int_str isv; sh_var_t *shv = NULL; int flags = 0; LM_DBG("Entering SHV_set\n"); if (rpc->scan(c, "S", &varname) != 1) { rpc->fault(c, 500, "Missing parameter varname (Parameters: varname type value)"); return; } LM_DBG("SHV_set Varname %.*s \n", varname.len, varname.s); if (rpc->scan(c, "S", &type) != 1) { rpc->fault(c, 500, "Missing parameter type (Parameters: varname type value)"); return; } if (strcasecmp(type.s, "int") == 0 ) { if (rpc->scan(c, "d", &ival) != 1) { rpc->fault(c, 500, "Missing integer parameter value (Parameters: varname type value)"); return; } isv.n = ival; } else if (strcasecmp(type.s, "str") == 0 ) { /* String value */ if (rpc->scan(c, "S", &value) != 1) { rpc->fault(c, 500, "Missing parameter value (Parameters: varname type value)"); return; } isv.s = value; flags = VAR_VAL_STR; } else { rpc->fault(c, 500, "Unknown parameter type (Types: int or str)"); return; } shv = get_shvar_by_name(&varname); if(shv==NULL) { rpc->fault(c, 404, "Variable not found"); return; } lock_shvar(shv); if(set_shvar_value(shv, &isv, flags)==NULL) { rpc->fault(c, 500, "Cannot set shared variable value"); LM_ERR("cannot set shv value\n"); } else { rpc->rpl_printf(c, "Ok. Variable set to new value."); } unlock_shvar(shv); return; }
struct mi_root* mi_shvar_get(struct mi_root* cmd_tree, void* param) { struct mi_root* rpl_tree = NULL; struct mi_node* node; struct mi_attr* attr = NULL; str name; int ival; sh_var_t *shv = NULL; node = cmd_tree->node.kids; if(node != NULL) { name = node->value; if(name.len<=0 || name.s==NULL) { LM_ERR("bad shv name\n"); return init_mi_tree( 500, MI_SSTR("bad shv name")); } shv = get_shvar_by_name(&name); if(shv==NULL) return init_mi_tree(404, MI_SSTR("Not found")); rpl_tree = init_mi_tree(200, MI_OK_S, MI_OK_LEN); if (rpl_tree==NULL) return NULL; node = add_mi_node_child(&rpl_tree->node, MI_DUP_VALUE, "VAR",3, name.s, name.len); if(node == NULL) goto error; lock_shvar(shv); if(shv->v.flags&VAR_VAL_STR) { attr = add_mi_attr (node, MI_DUP_VALUE, "type", 4, "string", 6); if(attr == 0) { unlock_shvar(shv); goto error; } attr = add_mi_attr (node, MI_DUP_VALUE, "value", 5, shv->v.value.s.s, shv->v.value.s.len); if(attr == 0) { unlock_shvar(shv); goto error; } unlock_shvar(shv); } else { ival = shv->v.value.n; unlock_shvar(shv); attr = add_mi_attr (node, MI_DUP_VALUE, "type",4, "integer", 7); if(attr == 0) goto error; name.s = sint2str(ival, &name.len); attr = add_mi_attr (node, MI_DUP_VALUE, "value",5, name.s, name.len); if(attr == 0) goto error; } goto done; } rpl_tree = init_mi_tree(200, MI_OK_S, MI_OK_LEN); if (rpl_tree==NULL) return NULL; for(shv=sh_vars; shv; shv=shv->next) { node = add_mi_node_child(&rpl_tree->node, MI_DUP_VALUE, "VAR", 3, shv->name.s, shv->name.len); if(node == NULL) goto error; lock_shvar(shv); if(shv->v.flags&VAR_VAL_STR) { attr = add_mi_attr (node, MI_DUP_VALUE, "type", 4, "string", 6); if(attr == 0) { unlock_shvar(shv); goto error; } attr = add_mi_attr (node, MI_DUP_VALUE, "value", 5, shv->v.value.s.s, shv->v.value.s.len); if(attr == 0) { unlock_shvar(shv); goto error; } unlock_shvar(shv); } else { ival = shv->v.value.n; unlock_shvar(shv); attr = add_mi_attr (node, MI_DUP_VALUE, "type",4, "integer", 7); if(attr == 0) goto error; name.s = sint2str(ival, &name.len); attr = add_mi_attr (node, MI_DUP_VALUE, "value",5, name.s, name.len); if(attr == 0) goto error; } } done: return rpl_tree; error: if(rpl_tree!=NULL) free_mi_tree(rpl_tree); return NULL; }
struct mi_root* mi_shvar_set(struct mi_root* cmd_tree, void* param) { str sp; str name; int ival; int_str isv; int flags; struct mi_node* node; sh_var_t *shv = NULL; node = cmd_tree->node.kids; if(node == NULL) return init_mi_tree( 400, MI_SSTR(MI_MISSING_PARM_S)); name = node->value; if(name.len<=0 || name.s==NULL) { LM_ERR("bad shv name\n"); return init_mi_tree( 500, MI_SSTR("bad shv name")); } shv = get_shvar_by_name(&name); if(shv==NULL) return init_mi_tree(404, MI_SSTR("Not found")); node = node->next; if(node == NULL) return init_mi_tree(400, MI_SSTR(MI_MISSING_PARM_S)); sp = node->value; if(sp.s == NULL) return init_mi_tree(500, MI_SSTR("type not found")); flags = 0; if(sp.s[0]=='s' || sp.s[0]=='S') flags = VAR_VAL_STR; node= node->next; if(node == NULL) return init_mi_tree(400, MI_SSTR(MI_MISSING_PARM_S)); sp = node->value; if(sp.s == NULL) { return init_mi_tree(500, MI_SSTR("value not found")); } if(flags == 0) { if(str2sint(&sp, &ival)) { LM_ERR("bad integer value\n"); return init_mi_tree( 500, MI_SSTR("bad integer value")); } isv.n = ival; } else { isv.s = sp; } lock_shvar(shv); if(set_shvar_value(shv, &isv, flags)==NULL) { unlock_shvar(shv); LM_ERR("cannot set shv value\n"); return init_mi_tree( 500, MI_SSTR("cannot set shv value")); } unlock_shvar(shv); LM_DBG("$shv(%.*s) updated\n", name.len, name.s); return init_mi_tree( 200, MI_OK_S, MI_OK_LEN); }
void rpc_shv_get(rpc_t* rpc, void* c) { str varname; int allvars = 0; sh_var_t *shv = NULL; void* th; void* ih; void* vh; if (rpc->scan(c, "S", &varname) != 1) { allvars = 1; } if (!allvars) { /* Get one variable value */ shv = get_shvar_by_name(&varname); if(shv==NULL) { rpc->fault(c, 404, "Variable not found"); return; } if (rpc->add(c, "{", &ih) < 0) { rpc->fault(c, 500, "Internal error creating rpc"); return; } lock_shvar(shv); if(shv->v.flags&VAR_VAL_STR) { if(rpc->struct_add(ih, "sss", "name", varname.s, "type", "string", "value", shv->v.value.s.s) < 0) { rpc->fault(c, 500, "Internal error creating rpc data (str)"); unlock_shvar(shv); return; } } else { if(rpc->struct_add(ih, "ssd", "name", varname.s, "type", "int", "value", shv->v.value.n) < 0) { rpc->fault(c, 500, "Internal error creating rpc data (int)"); unlock_shvar(shv); return; } } unlock_shvar(shv); return; } if (rpc->add(c, "{", &th) < 0) { rpc->fault(c, 500, "Internal error creating rpc"); return; } if(rpc->struct_add(th, "{", "items", &ih) < 0) { rpc->fault(c, 500, "Internal error creating rpc th"); return; } for(shv=sh_vars; shv; shv=shv->next) { lock_shvar(shv); if(rpc->struct_add(ih, "{", "shv", &vh) < 0) { rpc->fault(c, 500, "Internal error creating rpc th"); return; } if(shv->v.flags&VAR_VAL_STR) { if(rpc->struct_add(vh, "sss", "name", shv->name.s, "type", "string", "value", shv->v.value.s.s) < 0) { rpc->fault(c, 500, "Internal error creating rpc data"); unlock_shvar(shv); return; } } else { if(rpc->struct_add(vh, "ssd", "name", shv->name.s, "type", "int", "value", shv->v.value.n) < 0) { rpc->fault(c, 500, "Internal error creating rpc data"); unlock_shvar(shv); return; } } unlock_shvar(shv); } return ; }