int pv_free_contacts(struct sip_msg* msg, char* profile, char* s2) { regpv_profile_t *rpp; rpp = regpv_get_profile((str*)profile); if(rpp==0) return -1; regpv_free_profile(rpp); return 1; }
int ki_reg_free_contacts(sip_msg_t* msg, str* profile) { regpv_profile_t *rpp; rpp = regpv_get_profile(profile); if(rpp==0) return -1; regpv_free_profile(rpp); return 1; }
void regpv_free_profiles(void) { regpv_profile_t *rp; regpv_profile_t *rp0; rp = _regpv_profile_list; while(rp) { if(rp->pname.s!=NULL) pkg_free(rp->pname.s); rp0 = rp; regpv_free_profile(rp0); rp = rp->next; } _regpv_profile_list = 0; }
int pv_fetch_contacts(struct sip_msg* msg, char* table, char* uri, char* profile) { impurecord_t* r; ucontact_t* ptr; ucontact_t* ptr0; ucontact_t* c0; regpv_profile_t *rpp; str aor = {0, 0}; str u = {0, 0}; int res; int olen; int ilen; int n; char *p; rpp = regpv_get_profile((str*)profile); if(rpp==0) { LM_ERR("invalid parameters\n"); return -1; } /* check and free if profile already set */ if(rpp->flags) regpv_free_profile(rpp); if(fixup_get_svalue(msg, (gparam_p)uri, &u)!=0 || u.len<=0) { LM_ERR("invalid uri parameter\n"); return -1; } if (extract_aor(&u, &aor) < 0) { LM_ERR("failed to extract Address Of Record\n"); return -1; } /* copy aor and ul domain */ rpp->aor.s = (char*)pkg_malloc(aor.len*sizeof(char)); if(rpp->aor.s==NULL) { LM_ERR("no more pkg\n"); return -1; } memcpy(rpp->aor.s, aor.s, aor.len); rpp->aor.len = aor.len; rpp->domain = *((udomain_head_t*)table)->name; rpp->flags = 1; /* copy contacts */ ilen = sizeof(ucontact_t); ul.lock_udomain((udomain_t*)table, &aor); res = ul.get_impurecord((udomain_t*)table, &aor, &r); if (res != 0) { LM_DBG("'%.*s' Not found in usrloc\n", aor.len, ZSW(aor.s)); ul.unlock_udomain((udomain_t*)table, &aor); return -1; } ptr = 0;//r->contacts;TODO ptr0 = NULL; n = 0; while(ptr) { olen = (ptr->c.len + ptr->received.len + ptr->path.len + ptr->callid.len + ptr->user_agent.len)*sizeof(char) + ilen; c0 = (ucontact_t*)pkg_malloc(olen); if(c0==NULL) { LM_ERR("no more pkg\n"); ul.unlock_udomain((udomain_t*)table, &aor); goto error; } memcpy(c0, ptr, ilen); //c0->domain = {0,0};//NULL;TODO //c0->aor = {0,0};//NULL; c0->next = NULL; c0->prev = NULL; c0->c.s = (char*)c0 + ilen; memcpy(c0->c.s, ptr->c.s, ptr->c.len); c0->c.len = ptr->c.len; p = c0->c.s + c0->c.len; if(ptr->received.s!=NULL) { c0->received.s = p; memcpy(c0->received.s, ptr->received.s, ptr->received.len); c0->received.len = ptr->received.len; p += c0->received.len; } if(ptr->path.s!=NULL) { c0->path.s = p; memcpy(c0->path.s, ptr->path.s, ptr->path.len); c0->path.len = ptr->path.len; p += c0->path.len; } c0->callid.s = p; memcpy(c0->callid.s, ptr->callid.s, ptr->callid.len); c0->callid.len = ptr->callid.len; p += c0->callid.len; if(ptr->user_agent.s!=NULL) { c0->user_agent.s = p; memcpy(c0->user_agent.s, ptr->user_agent.s, ptr->user_agent.len); c0->user_agent.len = ptr->user_agent.len; p += c0->user_agent.len; } if(ptr0==NULL) { rpp->contacts = c0; } else { ptr0->next = c0; c0->prev = ptr0; } n++; ptr0 = c0; ptr = ptr->next; } ul.unlock_udomain((udomain_t*)table, &aor); rpp->nrc = n; LM_DBG("fetched <%d> contacts for <%.*s> in [%.*s]\n", n, aor.len, aor.s, rpp->pname.len, rpp->pname.s); return 1; error: regpv_free_profile(rpp); return -1; }
void reg_ul_expired_contact(ucontact_t* ptr, int type, void* param) { str profile = {"exp", 3}; regpv_profile_t *rpp; ucontact_t* c0; int backup_rt; struct run_act_ctx ctx; sip_msg_t *fmsg; int olen; int ilen; char *p; if(reg_expire_event_rt<0) return; if (faked_msg_init() < 0) { LM_ERR("faked_msg_init() failed\n"); return; } rpp = regpv_get_profile(&profile); if(rpp==0) { LM_ERR("error getting profile structure\n"); return; } /* check and free if profile already set */ if(rpp->flags) regpv_free_profile(rpp); /* copy aor and ul domain */ rpp->aor.s = (char*)pkg_malloc(ptr->aor->len*sizeof(char)); if(rpp->aor.s==NULL) { LM_ERR("no more pkg\n"); return; } memcpy(rpp->aor.s, ptr->aor->s, ptr->aor->len); rpp->aor.len = ptr->aor->len; rpp->domain = *ptr->domain; rpp->flags = 1; /* copy contact */ ilen = sizeof(ucontact_t); olen = (ptr->c.len + ptr->received.len + ptr->path.len + ptr->callid.len + ptr->user_agent.len + ptr->ruid.len + ptr->instance.len)*sizeof(char) + ilen; c0 = (ucontact_t*)pkg_malloc(olen); if(c0==NULL) { LM_ERR("no more pkg\n"); goto error; } memcpy(c0, ptr, ilen); c0->domain = NULL; c0->aor = NULL; c0->next = NULL; c0->prev = NULL; c0->c.s = (char*)c0 + ilen; memcpy(c0->c.s, ptr->c.s, ptr->c.len); c0->c.len = ptr->c.len; p = c0->c.s + c0->c.len; if(ptr->received.s!=NULL) { c0->received.s = p; memcpy(c0->received.s, ptr->received.s, ptr->received.len); c0->received.len = ptr->received.len; p += c0->received.len; } if(ptr->path.s!=NULL) { c0->path.s = p; memcpy(c0->path.s, ptr->path.s, ptr->path.len); c0->path.len = ptr->path.len; p += c0->path.len; } c0->callid.s = p; memcpy(c0->callid.s, ptr->callid.s, ptr->callid.len); c0->callid.len = ptr->callid.len; p += c0->callid.len; if(ptr->user_agent.s!=NULL) { c0->user_agent.s = p; memcpy(c0->user_agent.s, ptr->user_agent.s, ptr->user_agent.len); c0->user_agent.len = ptr->user_agent.len; p += c0->user_agent.len; } if(ptr->ruid.s!=NULL) { c0->ruid.s = p; memcpy(c0->ruid.s, ptr->ruid.s, ptr->ruid.len); c0->ruid.len = ptr->ruid.len; p += c0->ruid.len; } if(ptr->instance.s!=NULL) { c0->instance.s = p; memcpy(c0->instance.s, ptr->instance.s, ptr->instance.len); c0->instance.len = ptr->instance.len; p += c0->instance.len; } rpp->contacts = c0; rpp->nrc = 1; LM_DBG("saved contact for <%.*s> in [%.*s]\n", ptr->aor->len, ptr->aor->s, rpp->pname.len, rpp->pname.s); fmsg = faked_msg_next(); backup_rt = get_route_type(); set_route_type(REQUEST_ROUTE); init_run_actions_ctx(&ctx); run_top_route(event_rt.rlist[reg_expire_event_rt], fmsg, 0); set_route_type(backup_rt); return; error: regpv_free_profile(rpp); return; }
int pv_fetch_contacts_helper(sip_msg_t* msg, udomain_t* dt, str* uri, str* profile) { urecord_t* r; ucontact_t* ptr; ucontact_t* ptr0; ucontact_t* c0; regpv_profile_t *rpp; str aor = {0, 0}; int res; int olen; int ilen; int n; char *p; rpp = regpv_get_profile((str*)profile); if(rpp==0) { LM_ERR("invalid parameters\n"); return -1; } /* check and free if profile already set */ if(rpp->flags) regpv_free_profile(rpp); if (extract_aor(uri, &aor, NULL) < 0) { LM_ERR("failed to extract Address Of Record\n"); return -1; } /* copy aor and ul domain */ rpp->aor.s = (char*)pkg_malloc(aor.len*sizeof(char)); if(rpp->aor.s==NULL) { LM_ERR("no more pkg\n"); return -1; } memcpy(rpp->aor.s, aor.s, aor.len); rpp->aor.len = aor.len; rpp->domain = *((udomain_head_t*)dt)->name; rpp->flags = 1; /* copy contacts */ ilen = sizeof(ucontact_t); ul.lock_udomain(dt, &aor); res = ul.get_urecord(dt, &aor, &r); if (res > 0) { LM_DBG("'%.*s' Not found in usrloc\n", aor.len, ZSW(aor.s)); ul.unlock_udomain(dt, &aor); return -1; } ptr = r->contacts; ptr0 = NULL; n = 0; while(ptr) { olen = (ptr->c.len + ptr->received.len + ptr->path.len + ptr->callid.len + ptr->user_agent.len + ptr->ruid.len + ptr->instance.len)*sizeof(char) + ilen; c0 = (ucontact_t*)pkg_malloc(olen); if(c0==NULL) { LM_ERR("no more pkg\n"); ul.release_urecord(r); ul.unlock_udomain(dt, &aor); goto error; } memcpy(c0, ptr, ilen); c0->domain = NULL; c0->aor = NULL; c0->next = NULL; c0->prev = NULL; c0->c.s = (char*)c0 + ilen; memcpy(c0->c.s, ptr->c.s, ptr->c.len); c0->c.len = ptr->c.len; p = c0->c.s + c0->c.len; if(ptr->received.s!=NULL) { c0->received.s = p; memcpy(c0->received.s, ptr->received.s, ptr->received.len); c0->received.len = ptr->received.len; p += c0->received.len; } if(ptr->path.s!=NULL) { c0->path.s = p; memcpy(c0->path.s, ptr->path.s, ptr->path.len); c0->path.len = ptr->path.len; p += c0->path.len; } c0->callid.s = p; memcpy(c0->callid.s, ptr->callid.s, ptr->callid.len); c0->callid.len = ptr->callid.len; p += c0->callid.len; if(ptr->user_agent.s!=NULL) { c0->user_agent.s = p; memcpy(c0->user_agent.s, ptr->user_agent.s, ptr->user_agent.len); c0->user_agent.len = ptr->user_agent.len; p += c0->user_agent.len; } if(ptr->ruid.s!=NULL) { c0->ruid.s = p; memcpy(c0->ruid.s, ptr->ruid.s, ptr->ruid.len); c0->ruid.len = ptr->ruid.len; p += c0->ruid.len; } if(ptr->instance.s!=NULL) { c0->instance.s = p; memcpy(c0->instance.s, ptr->instance.s, ptr->instance.len); c0->instance.len = ptr->instance.len; p += c0->instance.len; } LM_DBG("memory block between %p - %p\n", c0, p); if ((ptr->sock) && (ptr->sock->proto == PROTO_TCP || ptr->sock->proto == PROTO_TLS || ptr->sock->proto == PROTO_WS || ptr->sock->proto == PROTO_WSS)) { c0->tcpconn_id = ptr->tcpconn_id; } if(ptr0==NULL) { rpp->contacts = c0; } else { ptr0->next = c0; c0->prev = ptr0; } n++; ptr0 = c0; ptr = ptr->next; } ul.release_urecord(r); ul.unlock_udomain(dt, &aor); rpp->nrc = n; LM_DBG("fetched <%d> contacts for <%.*s> in [%.*s]\n", n, aor.len, aor.s, rpp->pname.len, rpp->pname.s); return 1; error: regpv_free_profile(rpp); return -1; }