예제 #1
0
파일: shvar.c 프로젝트: GeorgeShaw/opensips
int pv_get_shvar(struct sip_msg *msg,  pv_param_t *param,
		pv_value_t *res)
{
	int len = 0;
	char *sval = NULL;
	sh_var_t *shv=NULL;

	if(msg==NULL || res==NULL)
		return -1;

	if(param==NULL || param->pvn.u.dname==0)
		return pv_get_null(msg, param, res);

	shv= (sh_var_t*)param->pvn.u.dname;

	lock_shvar(shv);
	if(shv->v.flags&VAR_VAL_STR)
	{
		if(param->pvv.s==NULL || param->pvv.len < shv->v.value.s.len)
		{
			if(param->pvv.s!=NULL)
				pkg_free(param->pvv.s);
			param->pvv.s = (char*)pkg_malloc(shv->v.value.s.len*sizeof(char));
			if(param->pvv.s==NULL)
			{
				unlock_shvar(shv);
				LM_ERR("no more pkg mem\n");
				return pv_get_null(msg, param, res);
			}
		}
		strncpy(param->pvv.s, shv->v.value.s.s, shv->v.value.s.len);
		param->pvv.len = shv->v.value.s.len;

		unlock_shvar(shv);

		res->rs = param->pvv;
		res->flags = PV_VAL_STR;
	} else {
		res->ri = shv->v.value.n;

		unlock_shvar(shv);

		sval = sint2str(res->ri, &len);
		res->rs.s = sval;
		res->rs.len = len;
		res->flags = PV_VAL_STR|PV_VAL_INT|PV_TYPE_INT;
	}
	return 0;
}
예제 #2
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;
}
예제 #3
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;
}
예제 #4
0
파일: shvar.c 프로젝트: GeorgeShaw/opensips
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;
}
예제 #5
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);
}
예제 #6
0
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 ;
}