/* change the r-uri if it is a PSTN format */ static int prefix2domain(struct sip_msg* msg, char* str1, char* str2) { char *host_port; code_t code=0, i; int digit; if(!msg) return -1; /* parse the uri, if not yet */ if(msg->parsed_uri_ok==0) if(parse_sip_msg_uri(msg)<0) { LOG(L_ERR,"PDT:prefix2domain: ERROR while parsing the R-URI\n"); return -1; } /* if the user part begin with the prefix for PSTN users, extract the code*/ if (msg->parsed_uri.user.len<=0) { DBG("PDT: prefix2domain: user part of the message was empty\n"); return 1; } if(prefix_len>0 && strncasecmp(prefix, msg->parsed_uri.user.s, prefix_len)!=0) { DBG("PDT: prefix2domain: PSTN prefix did not matched\n"); return 1; } i=0; code=0; digit = msg->parsed_uri.user.s[prefix_len+i]-'0'; while (digit != code_terminator) { if (digit<0 || digit>9) { DBG("PDT: prefix2domain: domain_code not well formed\n"); return -1; } if(MAX_CODE_10<code || (MAX_CODE_10==code && MAX_CODE-MAX_CODE_R<=digit)) { DBG("PDT: prefix2domain: domain_code not well formed\n"); return -1; } code=code*10+digit; i++; digit = msg->parsed_uri.user.s[prefix_len+i]-'0'; } /* find the domain that corresponds to that code */ if(!(host_port=get_domain_from_hash(hash->chash, hash->hash_size, code))) { LOG(L_ERR, "PDT: get_domain_from_hash: required " "code %d is not allocated yet\n", code); return -1; } /* update the new uri */ if(update_new_uri(msg, prefix_len+i+1, host_port)<0) { DBG("PDT: prefix2domain: new_uri cannot be updated\n"); return -1; } return 1; }
/** * @brief change the r-uri domain based on source domain and prefix * * @param msg the sip message structure * @param sdomain the source domain * @param rmode the r-uri rewrite mode * @param fmode the source domain fallback mode * @return 1 if translation is done; -1 otherwise */ static int pd_translate(sip_msg_t *msg, str *sdomain, int rmode, int fmode) { str *d, p; str sdall={"*",1}; int plen; if(msg==NULL) { LM_ERR("received null msg\n"); return -1; } if(parse_sip_msg_uri(msg)<0) { LM_ERR("failed to parse the R-URI\n"); return -1; } /* if the user part begin with the prefix, extract the code*/ if (msg->parsed_uri.user.len<=0) { LM_DBG("user part of the message is empty\n"); return -1; } if(pdt_prefix.len>0) { if (msg->parsed_uri.user.len<=pdt_prefix.len) { LM_DBG("user part is less than prefix parameter\n"); return -1; } if(strncasecmp(pdt_prefix.s, msg->parsed_uri.user.s, pdt_prefix.len)!=0) { LM_DBG("prefix parameter did not matched\n"); return -1; } } p.s = msg->parsed_uri.user.s + pdt_prefix.len; p.len = msg->parsed_uri.user.len - pdt_prefix.len; again: lock_get( pdt_lock ); if (pdt_reload_flag) { lock_release( pdt_lock ); sleep_us(5); goto again; } pdt_tree_refcnt++; lock_release( pdt_lock ); if((d=pdt_get_domain(*_ptree, sdomain, &p, &plen))==NULL) { plen = 0; if((fmode==0) || (d=pdt_get_domain(*_ptree, &sdall, &p, &plen))==NULL) { LM_INFO("no prefix PDT prefix matched [%.*s]\n", p.len, p.s); goto error; } } /* update the new uri */ if(update_new_uri(msg, plen, d, rmode)<0) { LM_ERR("new_uri cannot be updated\n"); goto error; } lock_get( pdt_lock ); pdt_tree_refcnt--; lock_release( pdt_lock ); return 1; error: lock_get( pdt_lock ); pdt_tree_refcnt--; lock_release( pdt_lock ); return -1; }
/* change the r-uri if it is a PSTN format */ static int prefix2domain(struct sip_msg* msg, int mode, int sd_en) { str *d, p, all={"*",1}; int plen; struct sip_uri uri; if(msg==NULL) { LM_ERR("received null msg\n"); return -1; } /* parse the uri, if not yet */ if(msg->parsed_uri_ok==0) if(parse_sip_msg_uri(msg)<0) { LM_ERR("failed to parse the R-URI\n"); return -1; } /* if the user part begin with the prefix for PSTN users, extract the code*/ if (msg->parsed_uri.user.len<=0) { LM_DBG("user part of the message is empty\n"); return -1; } if(prefix.len>0) { if (msg->parsed_uri.user.len<=prefix.len) { LM_DBG("user part is less than prefix\n"); return -1; } if(strncasecmp(prefix.s, msg->parsed_uri.user.s, prefix.len)!=0) { LM_DBG("PSTN prefix did not matched\n"); return -1; } } if(prefix.len>0 && prefix.len < msg->parsed_uri.user.len && strncasecmp(prefix.s, msg->parsed_uri.user.s, prefix.len)!=0) { LM_DBG("PSTN prefix did not matched\n"); return -1; } p.s = msg->parsed_uri.user.s + prefix.len; p.len = msg->parsed_uri.user.len - prefix.len; lock_start_read( pdt_lock ); if(sd_en==2) { /* take the domain from FROM uri as sdomain */ if(parse_from_header(msg)<0 || msg->from == NULL || get_from(msg)==NULL) { LM_ERR("cannot parse FROM header\n"); goto error; } memset(&uri, 0, sizeof(struct sip_uri)); if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len , &uri)<0) { LM_ERR("failed to parse From uri\n"); goto error; } /* find the domain that corresponds to this prefix */ plen = 0; if((d=pdt_get_domain(*_ptree, &uri.host, &p, &plen))==NULL) { plen = 0; if((d=pdt_get_domain(*_ptree, &all, &p, &plen))==NULL) { LM_INFO("no prefix found in [%.*s]\n", p.len, p.s); goto error; } } } else if(sd_en==1) { /* take the domain from FROM uri as sdomain */ if(parse_from_header(msg)<0 || msg->from == NULL || get_from(msg)==NULL) { LM_ERR("ERROR cannot parse FROM header\n"); goto error; } memset(&uri, 0, sizeof(struct sip_uri)); if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len , &uri)<0) { LM_ERR("failed to parse From uri\n"); goto error; } /* find the domain that corresponds to this prefix */ plen = 0; if((d=pdt_get_domain(*_ptree, &uri.host, &p, &plen))==NULL) { LM_INFO("no prefix found in [%.*s]\n", p.len, p.s); goto error; } } else { /* find the domain that corresponds to this prefix */ plen = 0; if((d=pdt_get_domain(*_ptree, &all, &p, &plen))==NULL) { LM_INFO("no prefix found in [%.*s]\n", p.len, p.s); goto error; } } /* update the new uri */ if(update_new_uri(msg, plen, d, mode)<0) { LM_ERR("new_uri cannot be updated\n"); goto error; } lock_stop_read( pdt_lock ); return 1; error: lock_stop_read( pdt_lock ); return -1; }
/* change the r-uri if it is a PSTN format */ static int prefix2domain(struct sip_msg* msg, int mode) { str p; str *d; time_t crt_time; int plen; if(msg==NULL) { LOG(L_ERR,"PDT:prefix2domain: weird error\n"); return -1; } /* parse the uri, if not yet */ if(msg->parsed_uri_ok==0) if(parse_sip_msg_uri(msg)<0) { LOG(L_ERR,"PDT:prefix2domain: ERROR while parsing the R-URI\n"); return -1; } /* if the user part begin with the prefix for PSTN users, extract the code*/ if (msg->parsed_uri.user.len<=0) { DBG("PDT:prefix2domain: user part of the message is empty\n"); return 1; } if(prefix.len>0 && prefix.len < msg->parsed_uri.user.len && strncasecmp(prefix.s, msg->parsed_uri.user.s, prefix.len)!=0) { DBG("PDT:prefix2domain: PSTN prefix did not matched\n"); return 1; } p.s = msg->parsed_uri.user.s + prefix.len; p.len = msg->parsed_uri.user.len - prefix.len; /* check if need for sync */ crt_time = time(NULL); if(last_sync + sync_time < crt_time) { last_sync = crt_time; if(pdt_sync_cache()) { LOG(L_ERR, "PDT:prefix2domain: cannot update the cache\n"); return -1; } } /* find the domain that corresponds to this prefix */ plen = 0; if((d=pdt_get_domain(_ptree, &p, &plen))==NULL) { LOG(L_INFO, "PDT:prefix2domain: no prefix found in [%.*s]\n", p.len, p.s); return -1; } /* update the new uri */ if(update_new_uri(msg, plen, d, mode)<0) { LOG(L_ERR, "PDT:prefix2domain: new_uri cannot be updated\n"); return -1; } return 1; }