本文整理汇总了C++中set_dst_uri函数的典型用法代码示例。如果您正苦于以下问题:C++ set_dst_uri函数的具体用法?C++ set_dst_uri怎么用?C++ set_dst_uri使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了set_dst_uri函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: set_destination
static int set_destination(struct sip_msg* msg, str* dest)
{
name_addr_t nameaddr;
if (!parse_nameaddr(dest, &nameaddr)) {
return set_dst_uri(msg, &nameaddr.uri);
} else {
/* it is just URI, pass it through */
return set_dst_uri(msg, dest);
}
}
开发者ID:2pac,项目名称:kamailio,代码行数:11,代码来源:avp.c
示例2: dst_to_msg
static int dst_to_msg(struct sip_msg *s_msg, struct sip_msg *d_msg)
{
/* move RURI */
if (set_ruri( d_msg, GET_RURI(s_msg))<0) {
LM_ERR("failed to set new RURI\n");
return -1;
}
/* move DURI (empty is accepted as reset) */
if (set_dst_uri( d_msg, &s_msg->dst_uri)<0) {
LM_ERR("failed to set DST URI\n");
return -1;
}
/* move PATH (empty is accepted as reset) */
if (set_path_vector( d_msg, & s_msg->path_vec)<0) {
LM_ERR("failed to set PATH\n");
return -1;
}
/* Qval */
set_ruri_q( d_msg, get_ruri_q(s_msg) );
/* BFLAGS */
setb0flags( d_msg, getb0flags(s_msg) );
/* socket info */
d_msg->force_send_socket = s_msg->force_send_socket;
return 0;
}
开发者ID:rrb3942,项目名称:opensips,代码行数:31,代码来源:t_fwd.c
示例3: ds_update_dst
static inline int ds_update_dst(struct sip_msg *msg, str *uri,
struct socket_info *sock, int mode)
{
struct action act;
switch(mode)
{
case 1:
act.type = SET_HOSTPORT_T;
act.elem[0].type = STR_ST;
act.elem[0].u.s = *uri;
if (uri->len>4 && strncasecmp(uri->s,"sip:",4)==0) {
act.elem[0].u.s.s += 4;
act.elem[0].u.s.len -= 4;
}
act.next = 0;
if (do_action(&act, msg) < 0) {
LM_ERR("error while setting host\n");
return -1;
}
break;
default:
if (set_dst_uri(msg, uri) < 0) {
LM_ERR("error while setting dst uri\n");
return -1;
}
break;
}
if (sock)
msg->force_send_socket = sock;
return 0;
}
开发者ID:MayamaTakeshi,项目名称:opensips,代码行数:32,代码来源:dispatch.c
示例4: lua_sr_setdsturi
static int lua_sr_setdsturi (lua_State *L)
{
str uri;
sr_lua_env_t *env_L;
env_L = sr_lua_env_get();
uri.s = (char*)lua_tostring(L, -1);
if(uri.s==NULL)
{
LM_ERR("invalid uri parameter\n");
return app_lua_return_false(L);
}
uri.len = strlen(uri.s);
if(env_L->msg==NULL)
{
LM_WARN("invalid parameters from Lua env\n");
return app_lua_return_false(L);
}
if (set_dst_uri(env_L->msg, &uri)<0)
{
LM_ERR("setting dst uri failed\n");
return app_lua_return_false(L);
}
return app_lua_return_true(L);
}
开发者ID:aphistic,项目名称:kamailio,代码行数:27,代码来源:app_lua_sr.c
示例5: msg_set_dst_uri
static PyObject *
msg_set_dst_uri(msgobject *self, PyObject *args)
{
str ruri;
if (self->msg == NULL) {
PyErr_SetString(PyExc_RuntimeError, "self->msg is NULL");
Py_INCREF(Py_None);
return Py_None;
}
if ((self->msg->first_line).type != SIP_REQUEST) {
PyErr_SetString(PyExc_RuntimeError, "Not a request message - "
"set destination is not possible.\n");
Py_INCREF(Py_None);
return Py_None;
}
if(!PyArg_ParseTuple(args, "s:set_dst_uri", &ruri.s))
return NULL;
ruri.len = strlen(ruri.s);
if (set_dst_uri(self->msg, &ruri) < 0) {
LM_ERR("Error in set_dst_uri\n");
PyErr_SetString(PyExc_RuntimeError, "Error in set_dst_uri\n");
}
Py_INCREF(Py_None);
return Py_None;
}
开发者ID:rrb3942,项目名称:opensips,代码行数:31,代码来源:python_msgobj.c
示例6: lookup_transport
/*! \brief
* Lookup contact in the database and rewrite Request-URI
* \return: 1 : contacts found and returned
* -1 : not found
* -2 : error
*/
int lookup_transport(struct sip_msg* _m, udomain_t* _d, str* _uri) {
str uri;
pcontact_t* pcontact;
char tmp[MAX_URI_SIZE];
char srcip[20];
str received_host;
str tmp_s;
int ret = 1;
if (_m->new_uri.s) uri = _m->new_uri;
else uri = _m->first_line.u.request.uri;
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
//now lookup in usrloc
ul.lock_udomain(_d, &uri, &received_host, _m->rcv.src_port);
if (ul.get_pcontact(_d, &uri, &received_host, _m->rcv.src_port, &pcontact) != 0) { //need to insert new contact
LM_WARN("received request for contact that we don't know about\n");
ret = -1;
goto done;
}
if (pcontact->received_proto != _m->rcv.proto) {
reset_dst_uri(_m);
memset(tmp, 0, MAX_URI_SIZE);
switch (pcontact->received_proto) {
case PROTO_TCP:
snprintf(tmp, MAX_URI_SIZE, "%.*s;transport=tcp", pcontact->aor.len, pcontact->aor.s);
break;
case PROTO_UDP:
snprintf(tmp, MAX_URI_SIZE, "%.*s;transport=udp", pcontact->aor.len, pcontact->aor.s);
break;
default:
LM_WARN("unsupported transport [%d]\n", pcontact->received_proto);
ret = -2;
goto done;
}
tmp_s.s = tmp;
tmp_s.len = strlen(tmp);
if (set_dst_uri(_m, &tmp_s) < 0) {
LM_ERR("failed to set dst_uri for terminating UE\n");
ret = -2;
goto done;
}
LM_DBG("Changed dst URI transport for UE to [%.*s]\n", tmp_s.len, tmp_s.s);
}
done:
ul.unlock_udomain(_d, &uri, &received_host, _m->rcv.src_port);
return ret;
}
开发者ID:AndreyRybkin,项目名称:kamailio,代码行数:59,代码来源:lookup.c
示例7: w_setdsturi
int w_setdsturi(struct sip_msg *msg, char *uri, str *s2)
{
str s;
/* todo: fixup */
s.s = uri;
s.len = strlen(uri);
if(set_dst_uri(msg, &s)!=0)
return -1;
/* dst_uri changes, so it makes sense to re-use the current uri for
forking */
ruri_mark_new(); /* re-use uri for serial forking */
return 1;
}
开发者ID:SipSeb,项目名称:kamailio,代码行数:16,代码来源:km_core.c
示例8: t_replicate
int t_replicate(struct sip_msg *p_msg, str *dst, int flags)
{
/* this is a quite horrible hack -- we just take the message
as is, including Route-s, Record-route-s, and Vias ,
forward it downstream and prevent replies received
from relaying by setting the replication/local_trans bit;
nevertheless, it should be good enough for the primary
customer of this function, REGISTER replication
if we want later to make it thoroughly, we need to
introduce delete lumps for all the header fields above
*/
struct cell *t;
if ( set_dst_uri( p_msg, dst)!=0 ) {
LM_ERR("failed to set dst uri\n");
return -1;
}
if ( branch_uri2dset( GET_RURI(p_msg) )!=0 ) {
LM_ERR("failed to convert uri to dst\n");
return -1;
}
t=get_t();
if (!t || t==T_UNDEFINED) {
/* no transaction yet */
if (route_type==FAILURE_ROUTE) {
LM_CRIT("BUG - undefined transaction in failure route\n");
return -1;
}
return t_relay_to( p_msg, NULL, flags|TM_T_RELAY_repl_FLAG);
} else {
/* transaction already created */
if (p_msg->REQ_METHOD==METHOD_ACK)
/* local ACK */
return -1;
t->flags|=T_IS_LOCAL_FLAG;
return t_forward_nonack( t, p_msg, NULL, 1/*reset*/, 0/*unlocked*/);
}
}
开发者ID:rrb3942,项目名称:opensips,代码行数:45,代码来源:t_fwd.c
示例9: lookup_path_to_contact
int lookup_path_to_contact(struct sip_msg* _m, char* contact_uri) {
ucontact_t* contact;
str s_contact_uri;
str path_dst;
get_act_time();
if (get_str_fparam(&s_contact_uri, _m, (fparam_t*) contact_uri) < 0) {
LM_ERR("failed to get RURI\n");
return -1;
}
LM_DBG("Looking up contact [%.*s]\n", s_contact_uri.len, s_contact_uri.s);
if (ul.get_ucontact(NULL, &s_contact_uri, 0, 0, 0, &contact) == 0) { //get_contact returns with lock
if (!VALID_CONTACT(contact, act_time)) {
LM_DBG("Contact is not valid...ignoring\n");
ul.release_ucontact(contact);
} else {
LM_DBG("CONTACT FOUND and path is [%.*s]\n", contact->path.len, contact->path.s);
if (get_path_dst_uri(&contact->path, &path_dst) < 0) {
LM_ERR("failed to get dst_uri for Path\n");
ul.release_ucontact(contact);
return -1;
}
if (set_path_vector(_m, &contact->path) < 0) {
LM_ERR("failed to set path vector\n");
ul.release_ucontact(contact);
return -1;
}
if (set_dst_uri(_m, &path_dst) < 0) {
LM_ERR("failed to set dst_uri of Path\n");
ul.release_ucontact(contact);
return -1;
}
ul.release_ucontact(contact);
return 1;
}
}
LM_DBG("no contact found for [%.*s]\n", s_contact_uri.len, s_contact_uri.s);
return -1;
}
开发者ID:olegagafonov,项目名称:kamailio,代码行数:43,代码来源:lookup.c
示例10: path_rr_callback
/*! \brief
* rr callback
*/
void path_rr_callback(struct sip_msg *_m, str *r_param, void *cb_param)
{
param_hooks_t hooks;
param_t *params;
if (parse_params(r_param, CLASS_CONTACT, &hooks, ¶ms) != 0) {
LM_ERR("failed to parse route parameters\n");
return;
}
if (hooks.contact.received) {
if (set_dst_uri(_m, &hooks.contact.received->body) != 0) {
LM_ERR("failed to set dst-uri\n");
free_params(params);
return;
}
/* dst_uri changed, so it makes sense to re-use the current uri for
forking */
ruri_mark_new(); /* re-use uri for serial forking */
}
free_params(params);
}
开发者ID:halan,项目名称:kamailio,代码行数:25,代码来源:path.c
示例11: lookup
/*! \brief
* Lookup contact in the database and rewrite Request-URI
* \return: -1 : not found
* -2 : found but method not allowed
* -3 : error
*/
int lookup(struct sip_msg* _m, udomain_t* _d) {
impurecord_t* r;
str aor, uri;
ucontact_t* ptr;
int res;
int ret;
str path_dst;
flag_t old_bflags;
int i = 0;
if (_m->new_uri.s) uri = _m->new_uri;
else uri = _m->first_line.u.request.uri;
if (extract_aor(&uri, &aor) < 0) {
LM_ERR("failed to extract address of record\n");
return -3;
}
get_act_time();
ul.lock_udomain(_d, &aor);
res = ul.get_impurecord(_d, &aor, &r);
if (res > 0) {
LM_DBG("'%.*s' Not found in usrloc\n", aor.len, ZSW(aor.s));
ul.unlock_udomain(_d, &aor);
return -1;
}
ret = -1;
while (i < MAX_CONTACTS_PER_IMPU && (ptr = r->newcontacts[i])) {
if (VALID_CONTACT(ptr, act_time) && allowed_method(_m, ptr)) {
LM_DBG("Found a valid contact [%.*s]\n", ptr->c.len, ptr->c.s);
i++;
break;
}
i++;
}
/* look first for an un-expired and suported contact */
if (ptr == 0) {
/* nothing found */
goto done;
}
ret = 1;
if (ptr) {
if (rewrite_uri(_m, &ptr->c) < 0) {
LM_ERR("unable to rewrite Request-URI\n");
ret = -3;
goto done;
}
/* reset next hop address */
reset_dst_uri(_m);
/* If a Path is present, use first path-uri in favour of
* received-uri because in that case the last hop towards the uac
* has to handle NAT. - agranig */
if (ptr->path.s && ptr->path.len) {
if (get_path_dst_uri(&ptr->path, &path_dst) < 0) {
LM_ERR("failed to get dst_uri for Path\n");
ret = -3;
goto done;
}
if (set_path_vector(_m, &ptr->path) < 0) {
LM_ERR("failed to set path vector\n");
ret = -3;
goto done;
}
if (set_dst_uri(_m, &path_dst) < 0) {
LM_ERR("failed to set dst_uri of Path\n");
ret = -3;
goto done;
}
} else if (ptr->received.s && ptr->received.len) {
if (set_dst_uri(_m, &ptr->received) < 0) {
ret = -3;
goto done;
}
}
set_ruri_q(ptr->q);
old_bflags = 0;
getbflagsval(0, &old_bflags);
setbflagsval(0, old_bflags | ptr->cflags);
if (ptr->sock)
set_force_socket(_m, ptr->sock);
ptr = ptr->next;
}
//.........这里部分代码省略.........
开发者ID:AndreyRybkin,项目名称:kamailio,代码行数:101,代码来源:lookup.c
示例12: force_service_routes
/**
* Force Service routes (upon request)
*/
int force_service_routes(struct sip_msg* _m, udomain_t* _d) {
struct hdr_field *it;
int i;
str new_route_header;
struct lump* lmp = NULL;
char * buf;
pcontact_t * c = getContactP(_m, _d, PCONTACT_REGISTERED,0 ,0);
// char srcip[20];
// str received_host;
struct via_body* vb;
unsigned short port;
unsigned short proto;
// Contact not found => not following service-routes
if (c == NULL) return -1;
/* we need to be sure we have seen all HFs */
parse_headers(_m, HDR_EOH_F, 0);
vb = cscf_get_ue_via(_m);
port = vb->port?vb->port:5060;
proto = vb->proto;
/* Save current buffer */
buf = _m->buf;
// Delete old Route headers:
if (_m->route) {
for (it = _m->route; it; it = it->next) {
if (it->type == HDR_ROUTE_T) {
if ((lmp = del_lump(_m, it->name.s - buf, it->len, HDR_ROUTE_T)) == 0) {
LM_ERR("del_lump failed \n");
return -1;
}
}
}
}
/* Reset dst_uri if previously set either by loose route or manually */
if (_m->dst_uri.s && _m->dst_uri.len) {
pkg_free(_m->dst_uri.s);
_m->dst_uri.s = NULL;
_m->dst_uri.len = 0;
}
// received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
// received_host.s = srcip;
/* Lock this record while working with the data: */
ul.lock_udomain(_d, &vb->host, port, proto);
if (c->num_service_routes > 0) {
/* Create anchor for new Route-Header: */
lmp = anchor_lump(_m, _m->headers->name.s - buf,0,0);
if (lmp == 0) {
LM_ERR("Failed to get anchor lump\n");
goto error;
}
/* Calculate the length: */
new_route_header.len = route_start.len +
route_end.len + (c->num_service_routes-1) * route_sep.len;
for(i=0; i< c->num_service_routes; i++)
new_route_header.len+=c->service_routes[i].len;
/* Allocate the memory for this new header: */
new_route_header.s = pkg_malloc(new_route_header.len);
if (!new_route_header.s) {
LM_ERR("Error allocating %d bytes\n", new_route_header.len);
goto error;
}
/* Construct new header */
new_route_header.len = 0;
STR_APPEND(new_route_header, route_start);
for(i=0; i < c->num_service_routes; i++) {
if (i) STR_APPEND(new_route_header, route_sep);
STR_APPEND(new_route_header, c->service_routes[i]);
}
STR_APPEND(new_route_header, route_end);
LM_DBG("Setting route header to <%.*s> \n", new_route_header.len, new_route_header.s);
if ((lmp = insert_new_lump_after(lmp, new_route_header.s, new_route_header.len, HDR_ROUTE_T)) == 0) {
LM_ERR("Error inserting new route set\n");
pkg_free(new_route_header.s);
goto error;
}
LM_DBG("Setting dst_uri to <%.*s> \n", c->service_routes[0].len,
c->service_routes[0].s);
if (set_dst_uri(_m, &c->service_routes[0]) !=0 ) {
LM_ERR("Error setting new dst uri\n");
goto error;
}
}
/* Unlock domain */
//.........这里部分代码省略.........
开发者ID:TheGrandWazoo,项目名称:kamailio,代码行数:101,代码来源:service_routes.c
示例13: lookup
/*
* Lookup contact in the database and rewrite Request-URI
*/
int lookup(struct sip_msg* _m, char* _t, char* _s)
{
urecord_t* r;
str uid;
ucontact_t* ptr;
int res;
unsigned int nat;
str new_uri;
nat = 0;
if (get_to_uid(&uid, _m) < 0) return -1;
get_act_time();
ul.lock_udomain((udomain_t*)_t);
res = ul.get_urecord((udomain_t*)_t, &uid, &r);
if (res < 0) {
LOG(L_ERR, "lookup(): Error while querying usrloc\n");
ul.unlock_udomain((udomain_t*)_t);
return -2;
}
if (res > 0) {
DBG("lookup(): '%.*s' Not found in usrloc\n", uid.len, ZSW(uid.s));
ul.unlock_udomain((udomain_t*)_t);
return -3;
}
ptr = r->contacts;
while ((ptr) && !VALID_CONTACT(ptr, act_time))
ptr = ptr->next;
if (ptr) {
if (ptr->received.s && ptr->received.len) {
if (received_to_uri){
if (add_received(&new_uri, &ptr->c, &ptr->received)<0){
LOG(L_ERR, "ERROR: lookup(): out of memory\n");
return -4;
}
/* replace the msg uri */
if (_m->new_uri.s) pkg_free(_m->new_uri.s);
_m->new_uri=new_uri;
_m->parsed_uri_ok=0;
ruri_mark_new();
goto skip_rewrite_uri;
}else if (set_dst_uri(_m, &ptr->received) < 0) {
ul.unlock_udomain((udomain_t*)_t);
return -4;
}
}
if (rewrite_uri(_m, &ptr->c) < 0) {
LOG(L_ERR, "lookup(): Unable to rewrite Request-URI\n");
ul.unlock_udomain((udomain_t*)_t);
return -4;
}
if (ptr->sock) {
set_force_socket(_m, ptr->sock);
}
skip_rewrite_uri:
set_ruri_q(ptr->q);
nat |= ptr->flags & FL_NAT;
ptr = ptr->next;
} else {
/* All contacts expired */
ul.unlock_udomain((udomain_t*)_t);
return -5;
}
/* Append branches if enabled */
if (!append_branches) goto skip;
while(ptr) {
if (VALID_CONTACT(ptr, act_time)) {
if (received_to_uri && ptr->received.s && ptr->received.len){
if (add_received(&new_uri, &ptr->c, &ptr->received)<0){
LOG(L_ERR, "ERROR: lookup(): branch: out of memory\n");
goto cont; /* try to continue */
}
if (append_branch(_m, &new_uri, 0, 0, ptr->q, 0, 0) == -1) {
LOG(L_ERR, "lookup(): Error while appending a branch\n");
pkg_free(new_uri.s);
if (ser_error==E_TOO_MANY_BRANCHES) goto skip;
else goto cont; /* try to continue, maybe we have an
oversized contact */
}
pkg_free(new_uri.s); /* append_branch doesn't free it */
}else{
if (append_branch(_m, &ptr->c, &ptr->received, 0 /* path */,
ptr->q, 0 /* brflags*/, ptr->sock) == -1) {
LOG(L_ERR, "lookup(): Error while appending a branch\n");
goto skip; /* Return OK here so the function succeeds */
//.........这里部分代码省略.........
开发者ID:kiryu,项目名称:kamailio,代码行数:101,代码来源:lookup.c
示例14: do_action
//.........这里部分代码省略.........
(a->type==SET_HOSTPORT_T || a->type==SET_HOST_T)) {
memcpy(crt,tmp,uri.maddr.s-tmp-1);
crt+=uri.maddr.s-tmp-1;
memcpy(crt,uri.maddr_val.s+uri.maddr_val.len,
tmp+len-uri.maddr_val.s-uri.maddr_val.len);
crt+=tmp+len-uri.maddr_val.s-uri.maddr_val.len;
} else {
memcpy(crt,tmp,len);crt+=len;
}
}
/* headers */
tmp=uri.headers.s;
if (tmp){
len=uri.headers.len; if(crt+len+1>end) goto error_uri;
*crt='?'; crt++;
memcpy(crt,tmp,len);crt+=len;
}
*crt=0; /* null terminate the thing */
/* copy it to the msg */
if (msg->new_uri.s) pkg_free(msg->new_uri.s);
msg->new_uri.s=new_uri;
msg->new_uri.len=crt-new_uri;
msg->parsed_uri_ok=0;
ret=1;
break;
case SET_DSTURI_T:
script_trace("core", "set_dsturi", msg, a->line) ;
if (a->elem[0].type!=STR_ST){
LM_ALERT("BUG in setdsturi() type %d\n",
a->elem[0].type);
ret=E_BUG;
break;
}
if(set_dst_uri(msg, &a->elem[0].u.s)!=0)
ret = -1;
else
ret = 1;
break;
case SET_DSTHOST_T:
case SET_DSTPORT_T:
script_trace("core", (unsigned char) a->type == SET_DSTHOST_T ?
"set_dsturi" : "set_dstport", msg, a->line);
if (a->elem[0].type!=STR_ST){
LM_ALERT("BUG in domain setting type %d\n",
a->elem[0].type);
ret=E_BUG;
break;
}
tmp = msg->dst_uri.s;
len = msg->dst_uri.len;
if (tmp == NULL || len == 0) {
LM_ERR("failure - null uri\n");
ret = E_UNSPEC;
break;
}
if (a->type == SET_DSTHOST_T &&
(a->elem[0].u.s.s == NULL || a->elem[0].u.s.len == 0)) {
LM_ERR("cannot set a null uri domain\n");
break;
}
if (parse_uri(tmp, len, &uri)<0) {
LM_ERR("bad uri <%.*s>, dropping packet\n", len, tmp);
break;
}
开发者ID:MayamaTakeshi,项目名称:opensips,代码行数:67,代码来源:action.c
示例15: lb_route
//.........这里部分代码省略.........
if( dst != NULL ) {
LM_DBG("%s call of LB - winning destination %d <%.*s> selected "
"for LB set with free=%d\n",
(reuse ? "sequential" : "initial"),
dst->id, dst->uri.len, dst->uri.s, load );
/* add to the profiles */
for( i=0 ; i<res_cur_n ; i++ ) {
if( lb_dlg_binds.set_profile(dlg, &dst->profile_id,
res_cur[i]->profile, 0) != 0 )
LM_ERR("%s call of LB - failed to add to profile [%.*s]->"
"[%.*s]\n", (reuse ? "sequential" : "initial"),
res_cur[i]->profile->name.len, res_cur[i]->profile->name.s,
dst->profile_id.len, dst->profile_id.s);
}
/* set dst as used (not selected) */
for( it_d=data->dsts,i=0,j=0 ; it_d ; it_d=it_d->next ) {
if( it_d == dst ) { dst_bitmap_cur[i] &= ~(1 << j); break; }
if( ++j == (8 * sizeof(unsigned int)) ) { i++; j=0; }
}
} else {
LM_DBG("%s call of LB - no destination found\n",
(reuse ? "sequential" : "initial"));
}
/* unlock resources */
for( i=0 ; i<res_cur_n ; i++ )
lock_release(res_cur[i]->lock);
/* we're done with load-balancing, now save state */
/* save state - group */
if( group_avp == NULL ) {
group_val.n = group;
if( add_avp(0, group_avp_name, group_val) != 0 ) {
LM_ERR("failed to add GROUP AVP\n");
}
} else if( group_val.n != group ) {
group_avp->data = (void *)(long)group;
}
/* save state - flags, save only if they are set */
if( flags_avp == NULL ) {
if( flags != LB_FLAGS_DEFAULT ) {
flags_val.n = flags;
if( add_avp(0, flags_avp_name, flags_val) != 0 ) {
LM_ERR("failed to add FLAGS AVP\n");
}
}
} else if( flags_val.n != flags ) {
flags_avp->data = (void *)(long)flags;
}
/* save state - dst_bitmap mask */
if( (mask_avp!=NULL) && (dst_bitmap_cur!=(unsigned int *)mask_val.s.s) ) {
destroy_avp(mask_avp);
mask_avp = NULL;
}
if( mask_avp == NULL ) {
mask_val.s.s = (char *)dst_bitmap_cur;
mask_val.s.len = bitmap_size_cur * sizeof(unsigned int);
if( add_avp(AVP_VAL_STR, mask_avp_name, mask_val) != 0 ) {
LM_ERR("failed to add MASK AVP\n");
}
}
/* save state - dst, save only if we have one */
if( id_avp == NULL ) {
if( dst != NULL ) {
id_val.n = dst->id;
if( add_avp(0, id_avp_name, id_val) != 0 ) {
LM_ERR("failed to add ID AVP\n");
}
}
} else {
if( dst != NULL ) {
id_avp->data = (void *)(long)dst->id;
} else {
destroy_avp(id_avp);
id_avp = NULL;
}
}
/* save state - res */
/* iterate AVPs once and delete old resources */
destroy_avps(0, res_avp_name, 1 /*all*/);
/* add new resources */
for( i=0 ; i<res_cur_n ; i++ ) {
res_val.s = res_cur[i]->name;
if( add_avp(AVP_VAL_STR, res_avp_name, res_val) != 0 )
LM_ERR("failed to add RES AVP\n");
}
/* outcome: set dst uri */
if( (dst != NULL) && (set_dst_uri(req, &dst->uri) != 0) ) {
LM_ERR("failed to set duri\n");
return -2;
}
return dst ? 0 : -2;
}
开发者ID:Danfx,项目名称:opensips,代码行数:101,代码来源:lb_data.c
示例16: ul_contact_event_to_msg
static int ul_contact_event_to_msg(struct sip_msg *req)
{
static enum ul_attrs { UL_URI, UL_RECEIVED, UL_PATH, UL_QVAL,
UL_SOCKET, UL_BFLAGS, UL_ATTR, UL_MAX } ul_attr;
/* keep the names of the AVPs aligned with the contact-related events
* from USRLOC module !!!! */
static str ul_names[UL_MAX]= {str_init("uri"),str_init("received"),
str_init("path"),str_init("qval"),
str_init("socket"),str_init("bflags"),
str_init("attr") };
static int avp_ids[UL_MAX] = { -1, -1, -1, -1, -1, -1, -1};
int_str vals[UL_MAX];
int proto, port;
str host;
str path_dst;
if (avp_ids[0]==-1) {
/* init the avp IDs mapping us on the UL event */
for( ul_attr=0 ; ul_attr<UL_MAX ; ul_attr++ ){
if (parse_avp_spec( &ul_names[ul_attr], &avp_ids[ul_attr])<0) {
LM_ERR("failed to init UL AVP %d/%s\n",
ul_attr,ul_names[ul_attr].s);
avp_ids[0] = -1;
return -1;
}
}
}
/* fetch the AVP values one by one */
for( ul_attr=0 ; ul_attr<UL_MAX ; ul_attr++ ) {
if (search_first_avp(0, avp_ids[ul_attr], &vals[ul_attr], NULL)==NULL){
LM_ERR("cannot find AVP(%d) for event attr %d/%s\n",
avp_ids[ul_attr], ul_attr, ul_names[ul_attr].s);
return -1;
}
}
/* OK, we have the values, lets inject them into the SIP msg */
LM_DBG("injecting new branch: uri=<%.*s>, received=<%.*s>,"
"path=<%.*s>, qval=%d, socket=<%.*s>, bflags=%X, attr=<%.*s>\n",
vals[UL_URI].s.len, vals[UL_URI].s.s,
vals[UL_RECEIVED].s.len, vals[UL_RECEIVED].s.s,
vals[UL_PATH].s.len, vals[UL_PATH].s.s,
vals[UL_QVAL].n,
vals[UL_SOCKET].s.len, vals[UL_SOCKET].s.s,
vals[UL_BFLAGS].n,
vals[UL_ATTR].s.len, vals[UL_ATTR].s.s);
/* contact URI goes as RURI */
if (set_ruri( req, &vals[UL_URI].s)<0) {
LM_ERR("failed to set new RURI\n");
return -1;
}
/* contact PATH goes as path */
if (vals[UL_PATH].s.len) {
if (get_path_dst_uri(&vals[UL_PATH].s, &path_dst) < 0) {
LM_ERR("failed to get dst_uri for Path\n");
return -1;
}
if (set_dst_uri( req, &path_dst) < 0) {
LM_ERR("failed to set dst_uri of Path\n");
return -1;
}
if (set_path_vector( req, &vals[UL_PATH].s)<0) {
LM_ERR("failed to set PATH\n");
return -1;
}
} else
/* contact RECEIVED goes as DURI */
if (vals[UL_RECEIVED].s.len) {
if (set_dst_uri( req, &vals[UL_RECEIVED].s)<0) {
LM_ERR("failed to set DST URI\n");
return -1;
}
}
/* contact Qval goes as RURI Qval */
set_ruri_q( req, vals[UL_QVAL].n);
/* contact BFLAGS goes as RURI bflags */
setb0flags( req, vals[UL_BFLAGS].n);
/* socket info */
if (vals[UL_SOCKET].s.len) {
if ( parse_phostport( vals[UL_SOCKET].s.s, vals[UL_SOCKET].s.len,
&host.s, &host.len, &port, &proto) < 0) {
LM_ERR("failed to parse socket from Event attr <%.*s>\n",
vals[UL_SOCKET].s.len, vals[UL_SOCKET].s.s);
} else {
req->force_send_socket = grep_sock_info( &host,
(unsigned short)port, (unsigned short)proto);
}
}
return 0;
}
开发者ID:rrb3942,项目名称:opensips,代码行数:98,代码来源:t_fwd.c
示例17: dp_apply_policy
//.........这里部分代码省略.........
LM_ERR("empty or non-string domain_suffix_avp,return with error .."
"\n");
return -1;
}
LM_DBG("domain_suffix_avp found = '%.*s'\n", val.s.len, ZSW(val.s.s));
if ( (len + val.s.len + 1) > MAX_URI_SIZE) {
LM_ERR("duri buffer to small to add domain suffix\n");
return -1;
}
*at = '.'; at = at + 1; /* add . as delimiter between domain and suffix */
memcpy(at, val.s.s, val.s.len); at = at + val.s.len;
didsomething = 1;
} else {
LM_DBG("domain_suffix_avp not found\n");
}
/* search for port override and add it to duri buffer */
avp = search_first_avp(port_override_avp_name_str, port_override_name, &val, 0);
if (avp) {
if ( !(avp->flags&AVP_VAL_STR) || !val.s.s || !val.s.len) {
LM_ERR("empty or non-string port_override_avp, return with error ...\n");
return -1;
}
LM_DBG("port_override_avp found = '%.*s'\n", val.s.len, ZSW(val.s.s));
/* We do not check if the port is valid */
if ( (len + val.s.len + 1) > MAX_URI_SIZE) {
LM_ERR("duri buffer to small to add domain suffix\n");
return -1;
}
*at = ':'; at = at + 1; /* add : as delimiter between domain and port */
memcpy(at, val.s.s, val.s.len); at = at + val.s.len;
didsomething = 1;
} else {
LM_DBG("port_override_avp not found, using original port\n");
if (_msg->parsed_uri.port.len) {
LM_DBG("port found in RURI, reusing it for DURI\n");
if ( (len + _msg->parsed_uri.port.len + 1) > MAX_URI_SIZE) {
LM_ERR("duri buffer to small to copy port\n");
return -1;
}
*at = ':'; at = at + 1;
/* add : as delimiter between domain and port */
memcpy(at, _msg->parsed_uri.port.s, _msg->parsed_uri.port.len);
at = at + _msg->parsed_uri.port.len;
} else {
LM_DBG("port not found in RURI, no need to copy it to DURI\n");
}
}
/* search for transport override and add it to duri buffer */
avp = search_first_avp(transport_override_avp_name_str, transport_override_name, &val, 0);
if (avp) {
if ( !(avp->flags&AVP_VAL_STR) || !val.s.s || !val.s.len) {
LM_ERR("empty or non-string transport_override_avp, "
"return with error ...\n");
return -1;
}
LM_DBG("transport_override_avp found='%.*s'\n",val.s.len, ZSW(val.s.s));
if ( (len + val.s.len + 11) > MAX_URI_SIZE) {
LM_ERR("duri buffer to small to add transport override\n");
return -1;
}
/* add : as transport parameter to duri; NOTE: no checks if transport parameter is valid */
memcpy(at, ";transport=", 11); at = at + 11;
memcpy(at, val.s.s, val.s.len); at = at + val.s.len;
didsomething = 1;
} else {
LM_DBG("transport_override_avp not found, using original transport\n");
if (_msg->parsed_uri.transport.len) {
LM_DBG("transport found in RURI, reusing it for DURI\n");
if ( (len + _msg->parsed_uri.transport.len + 1) > MAX_URI_SIZE) {
LM_ERR("duri buffer to small to copy transport\n");
return -1;
}
*at = ';'; at = at + 1; /* add : as delimiter between domain and port */
memcpy(at, _msg->parsed_uri.transport.s, _msg->parsed_uri.transport.len); at = at + _msg->parsed_uri.transport.len;
} else {
LM_DBG("transport not found in RURI, no need to copy it to DURI\n");
}
}
/* write new target DURI into DURI */
if (didsomething == 0) {
LM_DBG("no domainpolicy AVP set, no need to push new DURI\n");
return 2;
}
duri_str.s = (char *)&(duri[0]);
duri_str.len = at - duri_str.s;
LM_DBG("new DURI is '%.*s'\n",duri_str.len, ZSW(duri_str.s));
if(set_dst_uri(_msg, &duri_str)<0) {
LM_ERR("failed to se dst uri\n");
return -1;
}
/* dst_uri changes, so it makes sense to re-use the current uri for
forking */
ruri_mark_new(); /* re-use uri for serial forking */
return 1;
}
开发者ID:adubovikov,项目名称:kamailio,代码行数:101,代码来源:domainpolicy.c
示例18: after_strict
//.........这里部分代码省略.........
* is saved already. In fact, in this case we will behave exactly
* like a strict router. */
/* Note: when there is only one Route URI left (endpoint), it will
* always be a strict router because endpoints don't use ;lr parameter
* In this case we will simply put the URI in R-URI and forward it,
* which will work perfectly */
if(get_maddr_uri(&uri, &puri)!=0) {
LM_ERR("failed to check maddr\n");
return RR_ERROR;
}
if (rewrite_uri(_m, &uri) < 0) {
LM_ERR("failed to rewrite request URI\n");
return RR_ERROR;
}
if (rt->next) {
rem_off = hdr->body.s;
rem_len = rt->next->nameaddr.name.s - hdr->body.s;
} else {
rem_off = hdr->name.s;
rem_len = hdr->len;
}
if (!del_lump(_m, rem_off - _m->buf, rem_len, 0)) {
LM_ERR("failed to remove Route HF\n");
return RR_ERROR;
}
} else {
LM_DBG("Next hop: '%.*s' is loose router\n",
uri.len, ZSW(uri.s));
if(get_maddr_uri(&uri, &puri)!=0) {
LM_ERR("failed to check maddr\n");
return RR_ERROR;
}
if (set_dst_uri(_m, &uri) < 0) {
LM_ERR("failed to set dst_uri\n");
return RR_ERROR;
}
/* Next hop is a loose router - Which means that is is not endpoint yet
* In This case we have to recover from previous strict routing, that
* means we have to find the last Route URI and put in in R-URI and
* remove the last Route URI. */
if (rt != hdr->parsed) {
/* There is a previous route uri which was 2nd uri of mine
* and must be removed here */
rem_off = hdr->body.s;
rem_len = rt->nameaddr.name.s - hdr->body.s;
if (!del_lump(_m, rem_off - _m->buf, rem_len, 0)) {
LM_ERR("failed to remove Route HF\n");
return RR_ERROR;
}
}
res = find_rem_target(_m, &hdr, &rt, &prev);
if (res < 0) {
LM_ERR("searching for last Route URI failed\n");
return RR_ERROR;
} else if (res > 0) {
/* No remote target is an error */
return RR_ERROR;
}
uri = rt->nameaddr.uri;
if(get_maddr_uri(&uri, 0)!=0) {
LM_ERR("checking maddr failed\n");
return RR_ERROR;
}
if (rewrite_uri(_m, &uri) < 0) {
LM_ERR("failed to rewrite R-URI\n");
return RR_ERROR;
}
/* The first character if uri will be either '<' when it is the
* only URI in a Route header field or ',' if there is more than
* one URI in the header field */
LM_DBG("The last route URI: '%.*s'\n", rt->nameaddr.uri.len,
ZSW(rt->nameaddr.uri.s));
if (prev) {
rem_off = prev->nameaddr.name.s + prev->len;
rem_len = rt->nameaddr.name.s + rt->len - rem_off;
} else {
rem_off = hdr->name.s;
rem_len = hdr->len;
}
if (!del_lump(_m, rem_off - _m->buf, rem_len, 0)) {
LM_ERR("failed to remove Route HF\n");
return RR_ERROR;
}
}
/* run RR callbacks only if we have Route URI parameters */
if(routed_params.len > 0)
run_rr_callbacks( _m, &routed_params );
return RR_DRIVEN;
}
开发者ID:Jared-Prime,项目名称:kamailio,代码行数:101,代码来源:loose.c
示例19: lookup
//.........这里部分代码省略.........
}
if (it != NULL) {
ret = -1;
goto done;
}
}
LM_DBG("found a complete match\n");
ret = 1;
if (ptr) {
LM_DBG("setting as ruri <%.*s>\n",ptr->c.len,ptr->c.s);
if (set_ruri(_m, &ptr->c) < 0) {
LM_ERR("unable to rewrite Request-URI\n");
ret = -3;
goto done;
}
/* If a Path is present, use first path-uri in favour of
* received-uri because in that case the last hop towards the uac
* has to handle NAT. - agranig */
if (ptr->path.s && ptr->path.len) {
if (get_path_dst_uri(&ptr->path, &path_dst) < 0) {
LM_ERR("failed to get dst_uri for Path\n");
ret = -3;
goto done;
}
if (set_path_vector(_m, &ptr->path) < 0) {
LM_ERR("failed to set path vector\n");
ret = -3;
goto done;
}
if (set_dst_uri(_m, &path_dst) < 0) {
LM_ERR("failed to set dst_uri of Path\n");
ret = -3;
goto done;
}
} else if (ptr->received.s && ptr->received.len) {
if (set_dst_uri(_m, &ptr->received) < 0) {
ret = -3;
goto done;
}
}
set_ruri_q( _m, ptr->q);
setbflag( _m, 0, ptr->cflags);
if (ptr->sock)
_m->force_send_socket = ptr->sock;
/* populate the 'attributes' avp */
if (attr_avp_name != -1) {
istr.s = ptr->attr;
if (add_avp_last(AVP_VAL_STR, attr_avp_name, istr) != 0) {
LM_ERR("Failed to populate attr avp!\n");
}
}
ptr = ptr->next;
}
/* Append branches if enabled */
/* If we got to this point and the URI had a ;gr parameter and it was matched
* to a contact. No point in branching */
开发者ID:Parantido,项目名称:opensips,代码行数:67,代码来源:lookup.c
示例20: ds_select_dst
int ds_select_dst(struct sip_msg *msg, char *set, char *alg)
{
int a, s, idx;
ds_setidx_p si = NULL;
unsigned int hash;
if(msg==NULL)
{
LOG(L_ERR, "DISPATCHER:ds_select_dst: bad parameters\n");
return -1;
}
if(_ds_list==NULL || _ds_index==NULL)
{
LOG(L_ERR, "DISPATCHER:ds_select_dst: no destination sets\n");
return -1;
}
if((force_dst==0) && (msg->dst_uri.s!=NULL || msg->dst_uri.len>0))
{
LOG(L_ERR,
"DISPATCHER:ds_select_dst: destination already set [%.*s]\n",
msg->dst_uri.len, msg->dst_uri.s);
return -1;
}
s = (int)(long)set;
a = (int)(long)alg;
/* get the index of the set */
si = _ds_index;
while(si)
{
if(si->id == s)
{
idx = si->index;
break;
}
si = si->next;
}
if(si==NULL)
{
LOG(L_ERR,
"DISPATCHER:ds_select_dst: destination set [%d] not found\n",s);
return -1;
}
DBG("DISPATCHER:ds_select_dst: set index [%d]\n", idx);
hash = 0;
switch(a)
{
case 0:
if(ds_hash_callid(msg, &hash)!=0)
{
LOG(L_ERR,
"DISPATCHER:ds_select_dst: can't get callid hash\n");
return -1;
}
break;
case 1:
if(ds_hash_fromuri(msg, &hash)!=0)
{
LOG(L_ERR,
"DISPATCHER:ds_select_dst: can't get From uri hash\n");
return -1;
}
break;
d
|
请发表评论