static int w_create_dialog2(struct sip_msg *req,char *param) { struct dlg_cell *dlg; struct cell *t; str res = {0,0}; int flags; if (fixup_get_svalue(req, (gparam_p)param, &res) !=0) { LM_ERR("no create dialog flags\n"); return -1; } flags = parse_create_dlg_flags(res); /* is the dialog already created? */ if ( (dlg=get_current_dialog())!=NULL ) { /*Clear current flags before setting new ones*/ dlg->flags &= ~(DLG_FLAG_PING_CALLER | DLG_FLAG_PING_CALLEE | DLG_FLAG_BYEONTIMEOUT); dlg->flags |= flags; return 1; } t = d_tmb.t_gett(); if (dlg_create_dialog( (t==T_UNDEFINED)?NULL:t, req,flags)!=0) return -1; return 1; }
static int w_create_dialog(struct sip_msg *req) { struct cell *t; /* is the dialog already created? */ if (get_current_dialog()!=NULL) return 1; t = d_tmb.t_gett(); if (dlg_create_dialog( (t==T_UNDEFINED)?NULL:t, req,0)!=0) return -1; return 1; }
static int w_create_dialog2(struct sip_msg *req,char *param) { struct cell *t; str res = {0,0}; int flags=0; char *p; if (fixup_get_svalue(req, (gparam_p)param, &res) !=0) { LM_ERR("no create dialog flags\n"); return -1; } for (p=res.s;p<res.s+res.len;p++) { switch (*p) { case 'P': flags |= DLG_FLAG_PING_CALLER; LM_DBG("will ping caller\n"); break; case 'p': flags |= DLG_FLAG_PING_CALLEE; LM_DBG("will ping callee\n"); break; case 'B': flags |= DLG_FLAG_BYEONTIMEOUT; LM_DBG("bye on timeout activated\n"); break; default: LM_DBG("unknown create_dialog flag : [%c] . Skipping\n",*p); } } /* is the dialog already created? */ if (current_dlg_pointer!=NULL) { /*Clear current flags before setting new ones*/ current_dlg_pointer->flags &= ~(DLG_FLAG_PING_CALLER | DLG_FLAG_PING_CALLEE | DLG_FLAG_BYEONTIMEOUT); current_dlg_pointer->flags |= flags; return 1; } t = d_tmb.t_gett(); if (dlg_create_dialog( (t==T_UNDEFINED)?NULL:t, req,flags)!=0) return -1; return 1; }
static int create_dialog_wrapper(struct sip_msg *req,int flags) { struct cell *t; struct dlg_cell *dlg; /* is the dialog already created? */ if ((dlg = get_current_dialog())!=NULL) { dlg->flags |= flags; return 1; } t = d_tmb.t_gett(); if (dlg_create_dialog( (t==T_UNDEFINED)?NULL:t, req,flags)!=0) return -1; return 1; }
/* hide via, route sets and contacts */ static int topology_hiding(struct sip_msg *req,int extra_flags) { struct dlg_cell *dlg; struct hdr_field *it; char* buf; struct lump* lump, *crt, *prev_crt =0, *a, *foo; struct cell* t; t = d_tmb.t_gett(); if (t == T_UNDEFINED) t=NULL; dlg = get_current_dialog(); if(!dlg) { if(dlg_create_dialog( t, req, 0) != 0) { LM_ERR("Failed to create dialog\n"); return -1; } /* double check if the dialog can be retrieved */ if (!(dlg = get_current_dialog())) { LM_ERR("failed to get dialog\n"); return -1; } } dlg->flags |= DLG_FLAG_TOPHIDING; dlg->flags |= extra_flags; /* delete also the added record route and the did param */ for(crt=req->add_rm; crt;) { lump = 0; if(crt->type != HDR_RECORDROUTE_T) /* check on before list for parameters */ for( lump=crt->before ; lump ; lump=lump->before ) { /* we are looking for the lump that adds the * suffix of the RR header */ if ( lump->type==HDR_RECORDROUTE_T && lump->op==LUMP_ADD) { LM_DBG("lump before root %p\n", crt); LM_DBG("Found lump = %p, %.*s\n", lump, lump->len,lump->u.value); break; } } if((crt->type==HDR_RECORDROUTE_T) || lump) { /* lump found */ lump = crt; crt = crt->next; a=lump->before; while(a) { LM_DBG("before [%p], op=%d\n", a, a->op); if(a->op == LUMP_ADD) LM_DBG("value= %.*s\n", a->len, a->u.value); foo=a; a=a->before; if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM))) free_lump(foo); if (!(foo->flags&LUMPFLAG_SHMEM)) pkg_free(foo); } a=lump->after; while(a) { LM_DBG("after [%p], op=%d\n", a, a->op); if(a->op == LUMP_ADD) LM_DBG("value= %.*s\n", a->len, a->u.value); foo=a; a=a->after; if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM))) free_lump(foo); if (!(foo->flags&LUMPFLAG_SHMEM)) pkg_free(foo); } if(lump == req->add_rm) req->add_rm = lump->next; else prev_crt->next = lump->next; if (!(lump->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM))) free_lump(lump); if (!(lump->flags&LUMPFLAG_SHMEM)) pkg_free(lump); // goto after_del_rr; // break; continue; } prev_crt = crt; crt= crt->next; } buf = req->buf; /* delete record-route headers */ for (it=req->record_route;it;it=it->sibling) { if (del_lump(req,it->name.s - buf,it->len,HDR_RECORDROUTE_T) == 0) { LM_ERR("del_lump failed - while deleting record-route\n"); return -1; } } /* delete via headers */ if(dlg_del_vias(req) < 0) { LM_ERR("Failed to remove via headers\n"); return -1; } /* replace contact*/ if(dlg_replace_contact(req, dlg) < 0) { LM_ERR("Failed to replace contact\n"); return -1; } return 1; }