int pv_set_shvar(struct sip_msg* msg, pv_param_t *param, int op, pv_value_t *val) { int_str isv; int flags; if(param==NULL) { LM_ERR("bad parameters\n"); return -1; } if(param->pvn.u.dname==0) { LM_ERR("error - cannot find shvar\n"); goto error; } lock_shvar((sh_var_t*)param->pvn.u.dname); if(val == NULL) { isv.n = 0; set_shvar_value((sh_var_t*)param->pvn.u.dname, &isv, 0); goto done; } flags = 0; if(val->flags&PV_TYPE_INT) { isv.n = val->ri; } else { isv.s = val->rs; flags |= VAR_VAL_STR; } if(set_shvar_value((sh_var_t*)param->pvn.u.dname, &isv, flags)==NULL) { LM_ERR("error - cannot set shvar [%.*s] \n", ((sh_var_t*)param->pvn.u.dname)->name.len, ((sh_var_t*)param->pvn.u.dname)->name.s); goto error; } done: unlock_shvar((sh_var_t*)param->pvn.u.dname); return 0; error: unlock_shvar((sh_var_t*)param->pvn.u.dname); return -1; }
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_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); }
int init_shvars(void) { script_var_t *lit = 0; sh_var_t *sit = 0; pv_spec_list_t *pvi = 0; pv_spec_list_t *pvi0 = 0; if(shvar_init_locks()!=0) return -1; LM_DBG("moving shvars in share memory\n"); for(lit=sh_local_vars; lit; lit=lit->next) { sit = (sh_var_t*)shm_malloc(sizeof(sh_var_t)); if(sit==0) { LM_ERR("out of sh mem\n"); return -1; } memset(sit, 0, sizeof(sh_var_t)); sit->name.s = (char*)shm_malloc((lit->name.len+1)*sizeof(char)); if(sit->name.s==0) { LM_ERR("out of pkg mem!\n"); shm_free(sit); return -1; } sit->name.len = lit->name.len; strncpy(sit->name.s, lit->name.s, lit->name.len); sit->name.s[sit->name.len] = '\0'; if(sh_vars!=0) sit->n = sh_vars->n + 1; else sit->n = 1; #ifdef GEN_LOCK_T_PREFERED sit->lock = &shvar_locks->locks[sit->n%shvar_locks_no]; #else sit->lockidx = sit->n%shvar_locks_no; #endif if(set_shvar_value(sit, &lit->v.value, lit->v.flags)==NULL) { shm_free(sit->name.s); shm_free(sit); return -1; } pvi0 = 0; pvi = sh_pv_list; while(pvi!=NULL) { if(pvi->spec->pvp.pvn.u.dname == lit) { pvi->spec->pvp.pvn.u.dname = (void*)sit; if(pvi0!=NULL) { pvi0->next = pvi->next; pkg_free(pvi); pvi = pvi0->next; } else { sh_pv_list = pvi->next; pkg_free(pvi); pvi = sh_pv_list; } } else { pvi0 = pvi; pvi = pvi->next; } } sit->next = sh_vars; sh_vars = sit; } destroy_vars_list(sh_local_vars); if(sh_pv_list != NULL) { LM_ERR("sh_pv_list not null!\n"); return -1; } shvar_initialized = 1; return 0; }
int param_set_xvar( modparam_t type, void* val, int mode) { str s; char *p; int_str isv; int flags; int ival; script_var_t *pkv; sh_var_t *shv; if(!shm_initialized()) { LM_ERR("shm not initialized - cannot set value for PVs\n"); return -1; } s.s = (char*)val; if(s.s == NULL || s.s[0] == '\0') goto error; p = s.s; while(*p && *p!='=') p++; if(*p!='=') goto error; s.len = p - s.s; if(s.len == 0) goto error; p++; flags = 0; if(*p!='s' && *p!='S' && *p!='i' && *p!='I') goto error; if(*p=='s' || *p=='S') flags = VAR_VAL_STR; p++; if(*p!=':') goto error; p++; isv.s.s = p; isv.s.len = strlen(p); if(flags != VAR_VAL_STR) { if(str2sint(&isv.s, &ival)<0) goto error; isv.n = ival; } if(mode==0) { pkv = add_var(&s, VAR_TYPE_ZERO); if(pkv==NULL) goto error; if(set_var_value(pkv, &isv, flags)==NULL) goto error; } else { shv = add_shvar(&s); if(shv==NULL) goto error; if(set_shvar_value(shv, &isv, flags)==NULL) goto error; } return 0; error: LM_ERR("unable to set shv parame [%s]\n", s.s); return -1; }