예제 #1
0
파일: shvar.c 프로젝트: GeorgeShaw/opensips
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: shvar.c 프로젝트: GeorgeShaw/opensips
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);
}
예제 #4
0
파일: shvar.c 프로젝트: GeorgeShaw/opensips
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;
}
예제 #5
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;
}