int pv_get_uac_req(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { if(param==NULL || tmb.t_request==NULL) return -1; switch(param->pvn.u.isname.name.n) { case 0: return pv_get_uintval(msg, param, res, _uac_req.flags); case 1: if(_uac_req.s_ruri.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_ruri); case 2: if(_uac_req.s_turi.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_turi); case 3: if(_uac_req.s_furi.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_furi); case 4: if(_uac_req.s_hdrs.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_hdrs); case 5: if(_uac_req.s_body.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_body); case 6: if(_uac_req.s_ouri.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_ouri); case 7: if(_uac_req.s_method.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_method); case 9: if(_uac_req.s_auser.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_auser); case 10: if(_uac_req.s_apasswd.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_apasswd); case 11: if(_uac_req.s_callid.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_callid); case 12: if(_uac_req.s_sock.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_uac_req.s_sock); default: return pv_get_uintval(msg, param, res, _uac_req.flags); } return 0; }
int pv_get_ht_cell_expire(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { str htname; ht_pv_t *hpv; unsigned int now; hpv = (ht_pv_t*)param->pvn.u.dname; if(hpv->ht==NULL) { hpv->ht = ht_get_table(&hpv->htname); if(hpv->ht==NULL) return pv_get_null(msg, param, res); } if(pv_printf_s(msg, hpv->pve, &htname)!=0) { LM_ERR("cannot get $ht name\n"); return -1; } if(ht_get_cell_expire(hpv->ht, &htname, &now)!=0) return pv_get_null(msg, param, res); /* integer */ return pv_get_uintval(msg, param, res, now); }
int pv_get_timeb(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { if(msg==NULL) return -1; return pv_get_uintval(msg, param, res, (unsigned int)up_since); }
int pv_get_timenows(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { time_t t; t = time(NULL); return pv_get_uintval(msg, param, res, (unsigned int)t); }
static int pv_get_rdir(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) { if(msg==NULL || param==NULL) return -1; switch(param->pvn.u.isname.name.n) { case 1: if(is_direction(msg, RR_FLOW_UPSTREAM)==0) return pv_get_strval(msg, param, res, &pv_rr_flow_list[1]); return pv_get_strval(msg, param, res, &pv_rr_flow_list[0]); default: if(is_direction(msg, RR_FLOW_UPSTREAM)==0) return pv_get_uintval(msg, param, res, RR_FLOW_UPSTREAM); return pv_get_uintval(msg, param, res, RR_FLOW_DOWNSTREAM); } }
int pv_get_dlg_ctx(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { if(param==NULL) return -1; switch(param->pvn.u.isname.name.n) { case 1: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.flags); case 2: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.timeout); case 3: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.to_bye); case 4: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.to_route); case 5: _dlg_ctx.set = (_dlg_ctx.dlg==NULL)?0:1; return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.set); case 6: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dir); default: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.on); } return 0; }
int pv_get_times(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { if(msg==NULL) return -1; msg_set_time(msg); return pv_get_uintval(msg, param, res, (unsigned int)msg->tval.tv_sec); }
int pv_get_sndto(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { struct onsend_info* snd_inf; struct ip_addr ip; str s; snd_inf=get_onsend_info(); if (! likely(snd_inf && snd_inf->send_sock)) return pv_get_null(msg, param, res); switch(param->pvn.u.isname.name.n) { case 1: /* af */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->address.af); case 2: /* port */ return pv_get_uintval(msg, param, res, (int)su_getport(snd_inf->to)); case 3: /* proto */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->proto); case 4: /* buf */ s.s = snd_inf->buf; s.len = snd_inf->len; return pv_get_strval(msg, param, res, &s); case 5: /* len */ return pv_get_uintval(msg, param, res, (int)snd_inf->len); case 6: /* sproto */ if(get_valid_proto_string((int)snd_inf->send_sock->proto, 0, 0, &s)<0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &s); default: /* 0 - ip */ su2ip_addr(&ip, snd_inf->to); s.s = ip_addr2a(&ip); s.len = strlen(s.s); return pv_get_strval(msg, param, res, &s); } return 0; }
int pv_get_timeval(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { struct timeval tv; str s; if(msg==NULL || param==NULL) return -1; switch(param->pvn.u.isname.name.n) { case 1: msg_set_time(msg); return pv_get_uintval(msg, param, res, (unsigned int)msg->tval.tv_usec); case 2: if(gettimeofday(&_timeval_ts, NULL)!=0) { LM_ERR("unable to get time val attributes\n"); return pv_get_null(msg, param, res); } return pv_get_uintval(msg, param, res, (unsigned int)_timeval_ts.tv_sec); case 3: return pv_get_uintval(msg, param, res, (unsigned int)_timeval_ts.tv_usec); case 4: if(gettimeofday(&tv, NULL)!=0) { LM_ERR("unable to get time val attributes\n"); return pv_get_null(msg, param, res); } s.len = snprintf(_timeval_ts_buf, 32, "%u.%06u", (unsigned int)tv.tv_sec, (unsigned int)tv.tv_usec); if(s.len<0) return pv_get_null(msg, param, res); s.s = _timeval_ts_buf; return pv_get_strval(msg, param, res, &s); default: msg_set_time(msg); return pv_get_uintval(msg, param, res, (unsigned int)msg->tval.tv_sec); } }
int pv_get_stat(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { stat_var *stat; stat = get_stat(¶m->pvn.u.isname.name.s); if (stat == NULL) { LM_WARN("No stat variable ``%.*s''\n", param->pvn.u.isname.name.s.len, param->pvn.u.isname.name.s.s); return pv_get_null(msg, param, res); } return pv_get_uintval(msg, param, res, (unsigned int)get_stat_val(stat)); }
int pv_get_t(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { tm_cell_t *t; if(msg==NULL || param==NULL) return -1; /* aliases to old TM pvs */ switch(param->pvn.u.isname.name.n) { case 2: return pv_get_tm_reply_code(msg, param, res); case 4: return pv_get_tm_branch_idx(msg, param, res); } t = _tmx_tmb.t_gett(); if(t==NULL || t==T_UNDEFINED) { /* no T */ if(param->pvn.u.isname.name.n==8 || param->pvn.u.isname.name.n==9) { /* id_label_n or id_index_n - attempt to create transaction */ if(_tmx_tmb.t_newtran(msg)<0) { LM_ERR("cannot create the transaction\n"); return pv_get_null(msg, param, res); } t = _tmx_tmb.t_gett(); if (t==NULL || t==T_UNDEFINED) { return pv_get_null(msg, param, res); } } else { return pv_get_null(msg, param, res); } } switch(param->pvn.u.isname.name.n) { case 1: return pv_get_uintval(msg, param, res, t->hash_index); case 3: if(get_route_type()==FAILURE_ROUTE) { if(_tmx_tmb.t_get_picked_branch()<0 ) return pv_get_uintval(msg, param, res, 0); if(t->uac[_tmx_tmb.t_get_picked_branch()].reply==FAKED_REPLY) return pv_get_uintval(msg, param, res, 1); } return pv_get_uintval(msg, param, res, 0); case 8: return pv_get_uintval(msg, param, res, t->label); case 9: return pv_get_uintval(msg, param, res, t->hash_index); default: return pv_get_uintval(msg, param, res, t->label); } }
int pv_get_t(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { tm_cell_t *t; if(msg==NULL || param==NULL) return -1; /* aliases to old TM pvs */ switch(param->pvn.u.isname.name.n) { case 2: return pv_get_tm_reply_code(msg, param, res); case 4: return pv_get_tm_branch_idx(msg, param, res); } t = _tmx_tmb.t_gett(); if(t==NULL || t==T_UNDEFINED) { /* no T */ return pv_get_null(msg, param, res); } switch(param->pvn.u.isname.name.n) { case 1: return pv_get_uintval(msg, param, res, t->hash_index); case 3: if(get_route_type()==FAILURE_ROUTE) { if(_tmx_tmb.t_get_picked_branch()<0 ) return pv_get_uintval(msg, param, res, 0); if(t->uac[_tmx_tmb.t_get_picked_branch()].reply==FAKED_REPLY) return pv_get_uintval(msg, param, res, 1); } return pv_get_uintval(msg, param, res, 0); default: return pv_get_uintval(msg, param, res, t->label); } }
int pv_get_sndfrom(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { struct onsend_info* snd_inf; str s; snd_inf=get_onsend_info(); if (! likely(snd_inf && snd_inf->send_sock)) return pv_get_null(msg, param, res); switch(param->pvn.u.isname.name.n) { case 1: /* af */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->address.af); case 2: /* port */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->port_no); case 3: /* proto */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->proto); case 4: /* buf */ s.s = snd_inf->buf; s.len = snd_inf->len; return pv_get_strval(msg, param, res, &s); case 5: /* len */ return pv_get_uintval(msg, param, res, (int)snd_inf->len); default: /* 0 - ip */ return pv_get_strval(msg, param, res, &snd_inf->send_sock->address_str); } return 0; }
int pv_get_time(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { static struct tm stored_ts; static time_t stored_t = 0; time_t t; if(msg==NULL || param==NULL) return -1; t = time(NULL); if (t!=stored_t) { stored_t = t; if (localtime_r(&t, &stored_ts) == NULL) { LM_ERR("unable to break time to attributes\n"); return -1; } } switch(param->pvn.u.isname.name.n) { case 1: return pv_get_uintval(msg, param, res, (unsigned int)stored_ts.tm_min); case 2: return pv_get_uintval(msg, param, res, (unsigned int)stored_ts.tm_hour); case 3: return pv_get_uintval(msg, param, res, (unsigned int)stored_ts.tm_mday); case 4: return pv_get_uintval(msg, param, res, (unsigned int)(stored_ts.tm_mon+1)); case 5: return pv_get_uintval(msg, param, res, (unsigned int)(stored_ts.tm_year+1900)); case 6: return pv_get_uintval(msg, param, res, (unsigned int)(stored_ts.tm_wday+1)); case 7: return pv_get_uintval(msg, param, res, (unsigned int)(stored_ts.tm_yday+1)); case 8: return pv_get_sintval(msg, param, res, stored_ts.tm_isdst); default: return pv_get_uintval(msg, param, res, (unsigned int)stored_ts.tm_sec); } }
/** * return broken-down time attributes */ int pv_get_time(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { if(msg==NULL || param==NULL) return -1; if(msg_ctx_id_match(msg, &_cfgutils_msgid)!=1) { msg_set_time(msg); msg_ctx_id_set(msg, &_cfgutils_msgid); if(localtime_r(&msg->tval.tv_sec, &_cfgutils_ts) == NULL) { LM_ERR("unable to break time to attributes\n"); return -1; } } switch(param->pvn.u.isname.name.n) { case 1: return pv_get_uintval(msg, param, res, (unsigned int)_cfgutils_ts.tm_min); case 2: return pv_get_uintval(msg, param, res, (unsigned int)_cfgutils_ts.tm_hour); case 3: return pv_get_uintval(msg, param, res, (unsigned int)_cfgutils_ts.tm_mday); case 4: return pv_get_uintval(msg, param, res, (unsigned int)(_cfgutils_ts.tm_mon+1)); case 5: return pv_get_uintval(msg, param, res, (unsigned int)(_cfgutils_ts.tm_year+1900)); case 6: return pv_get_uintval(msg, param, res, (unsigned int)(_cfgutils_ts.tm_wday+1)); case 7: return pv_get_uintval(msg, param, res, (unsigned int)(_cfgutils_ts.tm_yday+1)); case 8: return pv_get_sintval(msg, param, res, _cfgutils_ts.tm_isdst); default: return pv_get_uintval(msg, param, res, (unsigned int)_cfgutils_ts.tm_sec); } }
/* pseudo-variable functions */ static int pv_get_rl_count(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { int counter; if (!param) return pv_get_null(msg, param, res); if(pv_get_spec_name(msg, param, res)!=0 || (!(res->flags&PV_VAL_STR))) { LM_ERR("invalid name\n"); return -1; } counter = rl_get_counter_value(&res->rs); if (counter < 0) { return pv_get_null(msg, param, res); } return pv_get_uintval(msg, param, res, counter); }
int pv_get_dlg(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { dlg_cell_t *dlg = NULL; int res_type = 0; str sv = { 0 }; unsigned int ui = 0; if(param==NULL) return -1; if(_dlg_ctx.iuid.h_id==0) { /* Retrieve the dialog for current message */ dlg=dlg_get_msg_dialog(msg); } else { /* Retrieve the dialog for current context */ dlg=dlg_get_by_iuid(&_dlg_ctx.iuid); } if(dlg == NULL) return pv_get_null(msg, param, res); switch(param->pvn.u.isname.name.n) { case 1: res_type = 1; ui = (unsigned int)dlg->h_id; break; case 2: res_type = 1; ui = (unsigned int)dlg->state; break; case 3: if(dlg->route_set[DLG_CALLEE_LEG].s==NULL || dlg->route_set[DLG_CALLEE_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->route_set[DLG_CALLEE_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->route_set[DLG_CALLEE_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 4: res_type = 1; ui = (unsigned int)dlg->dflags; break; case 5: res_type = 1; ui = (unsigned int)dlg->sflags; break; case 6: if(dlg->callid.s==NULL || dlg->callid.len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->callid.len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->callid.s, sv.len); sv.s[sv.len] = '\0'; break; case 7: if(dlg->to_uri.s==NULL || dlg->to_uri.len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->to_uri.len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->to_uri.s, sv.len); sv.s[sv.len] = '\0'; break; case 8: if(dlg->tag[DLG_CALLEE_LEG].s==NULL || dlg->tag[DLG_CALLEE_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->tag[DLG_CALLEE_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->tag[DLG_CALLEE_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 9: res_type = 1; ui = (unsigned int)dlg->toroute; break; case 10: if(dlg->cseq[DLG_CALLEE_LEG].s==NULL || dlg->cseq[DLG_CALLEE_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->cseq[DLG_CALLEE_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->cseq[DLG_CALLEE_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 11: if(dlg->route_set[DLG_CALLER_LEG].s==NULL || dlg->route_set[DLG_CALLER_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->route_set[DLG_CALLER_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->route_set[DLG_CALLER_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 12: if(dlg->from_uri.s==NULL || dlg->from_uri.len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->from_uri.len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->from_uri.s, sv.len); sv.s[sv.len] = '\0'; break; case 13: if(dlg->tag[DLG_CALLER_LEG].s==NULL || dlg->tag[DLG_CALLER_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->tag[DLG_CALLER_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->tag[DLG_CALLER_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 14: res_type = 1; ui = (unsigned int)dlg->lifetime; break; case 15: res_type = 1; ui = (unsigned int)dlg->start_ts; break; case 16: if(dlg->cseq[DLG_CALLER_LEG].s==NULL || dlg->cseq[DLG_CALLER_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->cseq[DLG_CALLER_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->cseq[DLG_CALLER_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 17: if(dlg->contact[DLG_CALLEE_LEG].s==NULL || dlg->contact[DLG_CALLEE_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->contact[DLG_CALLEE_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->contact[DLG_CALLEE_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 18: if(dlg->bind_addr[DLG_CALLEE_LEG]==NULL) goto done; sv.s = pv_get_buffer(); sv.len = dlg->bind_addr[DLG_CALLEE_LEG]->sock_str.len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->bind_addr[DLG_CALLEE_LEG]->sock_str.s, sv.len); sv.s[sv.len] = '\0'; break; case 19: if(dlg->contact[DLG_CALLER_LEG].s==NULL || dlg->contact[DLG_CALLER_LEG].len<=0) goto done; sv.s = pv_get_buffer(); sv.len = dlg->contact[DLG_CALLER_LEG].len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->contact[DLG_CALLER_LEG].s, sv.len); sv.s[sv.len] = '\0'; break; case 20: if(dlg->bind_addr[DLG_CALLER_LEG]==NULL) goto done; sv.s = pv_get_buffer(); sv.len = dlg->bind_addr[DLG_CALLER_LEG]->sock_str.len; if(pv_get_buffer_size()<sv.len) goto done; res_type = 2; strncpy(sv.s, dlg->bind_addr[DLG_CALLER_LEG]->sock_str.s, sv.len); sv.s[sv.len] = '\0'; break; case 21: res_type = 1; ui = (unsigned int)dlg->h_entry; break; default: res_type = 1; ui = (unsigned int)dlg->ref; } done: dlg_release(dlg); switch(res_type) { case 1: return pv_get_uintval(msg, param, res, ui); case 2: return pv_get_strval(msg, param, res, &sv); default: return pv_get_null(msg, param, res); } }
int pv_get_dlg(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { if(param==NULL) return -1; if(_dlg_ctx.dlg == NULL) return pv_get_null(msg, param, res); switch(param->pvn.u.isname.name.n) { case 1: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->h_id); case 2: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->state); /* case 3: if(_dlg_ctx.dlg->route_set[DLG_CALLEE_LEG].s==NULL || _dlg_ctx.dlg->route_set[DLG_CALLEE_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->route_set[DLG_CALLEE_LEG]); case 4: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->dflags); case 5: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->sflags); case 6: if(_dlg_ctx.dlg->callid.s==NULL || _dlg_ctx.dlg->callid.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->callid); case 7: if(_dlg_ctx.dlg->to_uri.s==NULL || _dlg_ctx.dlg->to_uri.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->to_uri); case 8: if(_dlg_ctx.dlg->tag[DLG_CALLEE_LEG].s==NULL || _dlg_ctx.dlg->tag[DLG_CALLEE_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->tag[DLG_CALLEE_LEG]); case 9: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->toroute); case 10: if(_dlg_ctx.dlg->cseq[DLG_CALLEE_LEG].s==NULL || _dlg_ctx.dlg->cseq[DLG_CALLEE_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->cseq[DLG_CALLEE_LEG]); case 11: if(_dlg_ctx.dlg->route_set[DLG_CALLER_LEG].s==NULL || _dlg_ctx.dlg->route_set[DLG_CALLER_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->route_set[DLG_CALLER_LEG]); case 12: if(_dlg_ctx.dlg->from_uri.s==NULL || _dlg_ctx.dlg->from_uri.len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->from_uri); case 13: if(_dlg_ctx.dlg->tag[DLG_CALLER_LEG].s==NULL || _dlg_ctx.dlg->tag[DLG_CALLER_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->tag[DLG_CALLER_LEG]); case 14: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->lifetime); case 15: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->start_ts); case 16: if(_dlg_ctx.dlg->cseq[DLG_CALLER_LEG].s==NULL || _dlg_ctx.dlg->cseq[DLG_CALLER_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->cseq[DLG_CALLER_LEG]); case 17: if(_dlg_ctx.dlg->contact[DLG_CALLEE_LEG].s==NULL || _dlg_ctx.dlg->contact[DLG_CALLEE_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->contact[DLG_CALLEE_LEG]); case 18: if(_dlg_ctx.dlg->bind_addr[DLG_CALLEE_LEG]==NULL) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->bind_addr[DLG_CALLEE_LEG]->sock_str); case 19: if(_dlg_ctx.dlg->contact[DLG_CALLER_LEG].s==NULL || _dlg_ctx.dlg->contact[DLG_CALLER_LEG].len<=0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->contact[DLG_CALLER_LEG]); case 20: if(_dlg_ctx.dlg->bind_addr[DLG_CALLER_LEG]==NULL) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &_dlg_ctx.dlg->bind_addr[DLG_CALLER_LEG]->sock_str); case 21: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->h_entry); */ default: return pv_get_uintval(msg, param, res, (unsigned int)_dlg_ctx.dlg->ref); } return 0; }
int pv_get_msrp(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) { msrp_frame_t *mf; msrp_hdr_t *hdr; str_array_t *sar; msrp_uri_t uri; str s; char *p; mf = msrp_get_current_frame(); if(mf==NULL || param==NULL) return -1; sar = NULL; hdr = NULL; switch(param->pvn.u.isname.name.n) { case 1: s.s = mf->buf.s; s.len = mf->buf.len; return pv_get_strval(msg, param, res, &s); case 2: if(mf->mbody.s==NULL) return pv_get_null(msg, param, res); s.s = mf->mbody.s; s.len = mf->mbody.len; return pv_get_strval(msg, param, res, &s); case 3: if(mf->fline.msgtypeid==MSRP_REQUEST) return pv_get_null(msg, param, res); return pv_get_intstrval(msg, param, res, MSRP_RPL_CODE(mf->fline.rtypeid), &mf->fline.rtype); case 4: if(mf->hbody.s==NULL) return pv_get_null(msg, param, res); s.s = mf->hbody.s; s.len = mf->hbody.len; return pv_get_strval(msg, param, res, &s); case 5: hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_MESSAGE_ID); if(hdr==NULL) return pv_get_null(msg, param, res); s.s = hdr->body.s; s.len = hdr->body.len; trim(&s); return pv_get_strval(msg, param, res, &s); case 6: if(mf->fline.msgtypeid==MSRP_REPLY) return pv_get_null(msg, param, res); return pv_get_strintval(msg, param, res, &mf->fline.rtype, mf->fline.rtypeid); case 7: return pv_get_uintval(msg, param, res, mf->buf.len); case 8: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[0]; trim(&s); if(msrp_parse_uri(s.s, s.len, &uri)<0 || uri.session.len<=0) return pv_get_null(msg, param, res); s = uri.session; trim(&s); return pv_get_strval(msg, param, res, &s); case 9: if(mf->fline.msgtypeid==MSRP_REQUEST || mf->fline.rtext.s==NULL) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &mf->fline.rtext); case 10: return pv_get_uintval(msg, param, res, mf->mbody.len); case 11: s = mf->fline.transaction; trim(&s); return pv_get_strval(msg, param, res, &s); case 12: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[0]; trim(&s); return pv_get_strval(msg, param, res, &s); case 13: if(msrp_parse_hdr_from_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[0]; trim(&s); return pv_get_strval(msg, param, res, &s); case 14: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; if(sar->size<2) return pv_get_null(msg, param, res); s = sar->list[1]; trim(&s); return pv_get_strval(msg, param, res, &s); case 15: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[sar->size-1]; trim(&s); return pv_get_strval(msg, param, res, &s); case 16: if(msrp_parse_hdr_from_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[sar->size-1]; trim(&s); return pv_get_strval(msg, param, res, &s); case 17: if(msrp_parse_hdr_from_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; return pv_get_uintval(msg, param, res, sar->size); case 18: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; return pv_get_uintval(msg, param, res, sar->size-1); case 19: if(pv_get_buffer_size()<100) return pv_get_null(msg, param, res); s.s = pv_get_buffer(); p = s.s; if(mf->tcpinfo->rcv->proto==PROTO_TLS) { memcpy(p, "msrps://", 8); p+=8; } else { memcpy(p, "msrp://", 7); p+=7; } strcpy(p, ip_addr2a(&mf->tcpinfo->rcv->src_ip)); strcat(p, ":"); strcat(p, int2str(mf->tcpinfo->rcv->src_port, NULL)); s.len = strlen(s.s); return pv_get_strval(msg, param, res, &s); case 20: return pv_get_strval(msg, param, res, &mf->tcpinfo->rcv->bind_address->sock_str); case 21: if(mf->tcpinfo->con==NULL) return pv_get_null(msg, param, res); return pv_get_sintval(msg, param, res, mf->tcpinfo->con->id); default: return pv_get_null(msg, param, res); } return 0; }
int hepv3_get_chunk(struct sip_msg *msg, char *buf, unsigned int len, int req_chunk, pv_param_t *param, pv_value_t *res) { str tmpstr; char *tmp; int i; struct hep_chunk *chunk; struct hep_generic_recv *hg; int chunk_vendor=0, chunk_type=0, chunk_length=0; int total_length = 0; int ret = 0; char ipstr[INET6_ADDRSTRLEN]; if(memcmp(buf, "\x48\x45\x50\x33",4) && !memcmp(buf, "\x45\x45\x50\x31",4)) { LM_ERR("not hep 3 protocol"); pv_get_uintval(msg, param, res, -1); return -1; } hg = (struct hep_generic_recv*)pkg_malloc(sizeof(struct hep_generic_recv)); if(hg==NULL) { LM_ERR("no more pkg memory left for hg\n"); return -1; } memset(hg, 0, sizeof(struct hep_generic_recv)); /* HEADER */ hg->header = (hep_ctrl_t *) (buf); /*Packet size */ total_length = ntohs(hg->header->length); i = sizeof(hep_ctrl_t); while(i < total_length) { /*OUR TMP DATA */ tmp = buf+i; chunk = (struct hep_chunk*) tmp; chunk_vendor = ntohs(chunk->vendor_id); chunk_type = ntohs(chunk->type_id); chunk_length = ntohs(chunk->length); /* if chunk_length */ if(chunk_length == 0) { /* BAD LEN we drop this packet */ goto error; } /* SKIP not general Chunks */ if(chunk_vendor != 0) { i+=chunk_length; } else { if(chunk_type != req_chunk) { i+=chunk_length; continue; } switch(chunk_type) { case 0: goto error; break; case 1: hg->ip_family = (hep_chunk_uint8_t *) (tmp); ret = pv_get_uintval(msg, param, res, hg->ip_family->data); goto done; case 2: hg->ip_proto = (hep_chunk_uint8_t *) (tmp); ret = pv_get_uintval(msg, param, res, hg->ip_proto->data); goto done; case 3: hg->hep_src_ip4 = (hep_chunk_ip4_t *) (tmp); inet_ntop(AF_INET, &(hg->hep_src_ip4->data), ipstr, INET_ADDRSTRLEN); tmpstr.s = ipstr; tmpstr.len = strlen(ipstr); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; case 4: hg->hep_dst_ip4 = (hep_chunk_ip4_t *) (tmp); inet_ntop(AF_INET, &(hg->hep_dst_ip4->data), ipstr, INET_ADDRSTRLEN); tmpstr.s = ipstr; tmpstr.len = strlen(ipstr); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; case 5: hg->hep_src_ip6 = (hep_chunk_ip6_t *) (tmp); inet_ntop(AF_INET6, &(hg->hep_src_ip6->data), ipstr, INET6_ADDRSTRLEN); tmpstr.s = ipstr; tmpstr.len = strlen(ipstr); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; case 6: hg->hep_dst_ip6 = (hep_chunk_ip6_t *) (tmp); inet_ntop(AF_INET6, &(hg->hep_dst_ip6->data), ipstr, INET6_ADDRSTRLEN); tmpstr.s = ipstr; tmpstr.len = strlen(ipstr); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; case 7: hg->src_port = (hep_chunk_uint16_t *) (tmp); ret = pv_get_uintval(msg, param, res, ntohs(hg->src_port->data)); break; case 8: hg->dst_port = (hep_chunk_uint16_t *) (tmp); ret = pv_get_uintval(msg, param, res, ntohs(hg->dst_port->data)); break; case 9: hg->time_sec = (hep_chunk_uint32_t *) (tmp); hg->time_sec->data = ntohl(hg->time_sec->data); ret = pv_get_uintval(msg, param, res, hg->time_sec->data); goto done; case 10: hg->time_usec = (hep_chunk_uint32_t *) (tmp); hg->time_usec->data = ntohl(hg->time_usec->data); ret = pv_get_uintval(msg, param, res, hg->time_usec->data); goto done; case 11: hg->proto_t = (hep_chunk_uint8_t *) (tmp); ret = pv_get_uintval(msg, param, res, hg->proto_t->data); goto done; case 12: hg->capt_id = (hep_chunk_uint32_t *) (tmp); ret = pv_get_uintval(msg, param, res, ntohs(hg->capt_id->data)); goto done; case 13: hg->keep_tm = (hep_chunk_uint16_t *) (tmp); ret = pv_get_uintval(msg, param, res, hg->keep_tm->data); goto done; case 14: tmpstr.s = (char *) tmp + sizeof(hep_chunk_t); tmpstr.len = chunk_length - sizeof(hep_chunk_t); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; case 15: hg->payload_chunk = (hep_chunk_t *) (tmp); tmpstr.s = (char *) tmp+sizeof(hep_chunk_t); tmpstr.len = chunk_length - sizeof(hep_chunk_t); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; case 17: tmpstr.s = (char *) tmp + sizeof(hep_chunk_t); tmpstr.len = chunk_length - sizeof(hep_chunk_t); ret = pv_get_strval(msg, param, res, &tmpstr); goto done; default: ret = pv_get_uintval(msg, param, res, -1); goto done; } } } done: //if(si) pkg_free(si); if(hg) pkg_free(hg); return ret; error: if(hg) pkg_free(hg); ret = pv_get_uintval(msg, param, res, -1); return -1; }
static int pv_get_redisc(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { redisc_pv_t *rpv; str s; int pos; rpv = (redisc_pv_t*)param->pvn.u.dname; if(rpv->reply==NULL) { rpv->reply = redisc_get_reply(&rpv->rname); if(rpv->reply==NULL) return pv_get_null(msg, param, res); } if(rpv->reply->rplRedis==NULL) return pv_get_null(msg, param, res); if(fixup_get_ivalue(msg, &rpv->pos, &pos)!=0) return pv_get_null(msg, param, res); switch(rpv->rkeyid) { case 1: /* value */ switch(rpv->reply->rplRedis->type) { case REDIS_REPLY_STRING: if(pos!=-1) return pv_get_null(msg, param, res); s.len = rpv->reply->rplRedis->len; s.s = rpv->reply->rplRedis->str; return pv_get_strval(msg, param, res, &s); case REDIS_REPLY_INTEGER: if(pos!=-1) return pv_get_null(msg, param, res); return pv_get_sintval(msg, param, res, (int)rpv->reply->rplRedis->integer); case REDIS_REPLY_ARRAY: if(pos<0 || pos>=(int)rpv->reply->rplRedis->elements) return pv_get_null(msg, param, res); if(rpv->reply->rplRedis->element[pos]==NULL) return pv_get_null(msg, param, res); switch(rpv->reply->rplRedis->element[pos]->type) { case REDIS_REPLY_STRING: s.len = rpv->reply->rplRedis->element[pos]->len; s.s = rpv->reply->rplRedis->element[pos]->str; return pv_get_strval(msg, param, res, &s); case REDIS_REPLY_INTEGER: return pv_get_sintval(msg, param, res, (int)rpv->reply->rplRedis->element[pos]->integer); default: return pv_get_null(msg, param, res); } default: return pv_get_null(msg, param, res); } case 2: /* info */ if(rpv->reply->rplRedis->str==NULL) return pv_get_null(msg, param, res); s.len = rpv->reply->rplRedis->len; s.s = rpv->reply->rplRedis->str; return pv_get_strval(msg, param, res, &s); case 3: /* size */ if(rpv->reply->rplRedis->type == REDIS_REPLY_ARRAY) { return pv_get_uintval(msg, param, res, (unsigned int)rpv->reply->rplRedis->elements); } else { return pv_get_null(msg, param, res); } case 0: /* type */ if(pos==-1) return pv_get_sintval(msg, param, res, rpv->reply->rplRedis->type); if(rpv->reply->rplRedis->type != REDIS_REPLY_ARRAY) return pv_get_null(msg, param, res); if(pos<0 || pos>=(int)rpv->reply->rplRedis->elements) return pv_get_null(msg, param, res); if(rpv->reply->rplRedis->element[pos]==NULL) return pv_get_null(msg, param, res); return pv_get_sintval(msg, param, res, rpv->reply->rplRedis->element[pos]->type); default: /* We do nothing. */ return pv_get_null(msg, param, res); } }
int pv_get_ulc(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { regpv_name_t *rp; regpv_profile_t *rpp; ucontact_t *c; int idx; int i; if(param==NULL) { LM_ERR("invalid params\n"); return -1; } rp = (regpv_name_t*)param->pvn.u.dname; if(rp==NULL || rp->rp==NULL) { LM_DBG("no profile in params\n"); return pv_get_null(msg, param, res); } rpp = rp->rp; if(rpp->flags==0 || rpp->contacts==NULL) { LM_DBG("profile not set or no contacts there\n"); return pv_get_null(msg, param, res); } /* get index */ if(pv_get_spec_index(msg, param, &idx, &i)!=0) { LM_ERR("invalid index\n"); return -1; } /* work only with positive indexes by now */ if(idx<0) idx = 0; /* get contact */ i = 0; c = rpp->contacts; while(rpp) { if(i == idx) break; i++; c = c->next; } if(c==NULL) return pv_get_null(msg, param, res); switch(rp->attr) { case 0: /* aor */ return pv_get_strval(msg, param, res, &rpp->aor); break; case 1: /* domain */ return pv_get_strval(msg, param, res, &rpp->domain); break; case 2: /* aorhash */ return pv_get_uintval(msg, param, res, rpp->aorhash); break; case 3: /* addr */ return pv_get_strval(msg, param, res, &c->c); break; case 4: /* path */ return pv_get_strval(msg, param, res, &c->path); break; case 5: /* received */ return pv_get_strval(msg, param, res, &c->received); break; case 6: /* expires */ return pv_get_uintval(msg, param, res, (unsigned int)c->expires); break; case 7: /* callid */ return pv_get_strval(msg, param, res, &c->callid); break; case 8: /* q */ return pv_get_sintval(msg, param, res, (int)c->q); break; case 9: /* cseq */ return pv_get_sintval(msg, param, res, c->cseq); break; case 10: /* flags */ return pv_get_uintval(msg, param, res, c->flags); break; case 11: /* cflags */ return pv_get_uintval(msg, param, res, c->cflags); break; case 12: /* user agent */ return pv_get_strval(msg, param, res, &c->user_agent); break; case 14: /* socket */ if(c->sock==NULL) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &c->sock->sock_str); break; case 15: /* modified */ return pv_get_uintval(msg, param, res, (unsigned int)c->last_modified); break; case 16: /* methods */ return pv_get_uintval(msg, param, res, c->methods); break; case 17: /* count */ return pv_get_sintval(msg, param, res, rpp->nrc); break; } return pv_get_null(msg, param, res); }
int pv_get_branchx_helper(sip_msg_t *msg, pv_param_t *param, pv_value_t *res, int btype) { int idx = 0; int idxf = 0; branch_t *br; if(btype==1) { br = &_pv_sbranch; } else { /* get the index */ if(pv_get_spec_index(msg, param, &idx, &idxf)!=0) { LM_ERR("invalid index\n"); return pv_get_null(msg, param, res); } br = get_sip_branch(idx); if(br==NULL) { return pv_get_null(msg, param, res); } } /* branch(count) doesn't need a valid branch, everything else does */ if(br->len == 0 && ( param->pvn.u.isname.name.n != 5/* count*/ )) { LM_ERR("error accessing branch [%d]\n", idx); return pv_get_null(msg, param, res); } switch(param->pvn.u.isname.name.n) { case 1: /* dst uri */ if(br->dst_uri_len==0) return pv_get_null(msg, param, res); return pv_get_strlval(msg, param, res, br->dst_uri, br->dst_uri_len); case 2: /* path */ if(br->path_len==0) return pv_get_null(msg, param, res); return pv_get_strlval(msg, param, res, br->path, br->path_len); case 3: /* Q */ if(br->q == Q_UNSPECIFIED) return pv_get_null(msg, param, res); return pv_get_sintval(msg, param, res, br->q); case 4: /* send socket */ if(br->force_send_socket!=0) return pv_get_strval(msg, param, res, &br->force_send_socket->sock_str); return pv_get_null(msg, param, res); case 5: /* count */ return pv_get_uintval(msg, param, res, nr_branches); case 6: /* flags */ return pv_get_uintval(msg, param, res, br->flags); case 7: /* ruid */ if(br->ruid_len==0) return pv_get_null(msg, param, res); return pv_get_strlval(msg, param, res, br->ruid, br->ruid_len); case 8: /* location_ua */ if(br->location_ua_len==0) return pv_get_null(msg, param, res); return pv_get_strlval(msg, param, res, br->location_ua, br->location_ua_len); default: /* 0 - uri */ return pv_get_strlval(msg, param, res, br->uri, br->len); } return 0; }