bool cConfigItem_hour_interval::setParamFromValueStr(string value_str) {
	if(!param_from || !param_to ||
	   value_str.empty()) {
		return(false);
	}
	const char *value = value_str.c_str();
	if(value) {
		string fromTo = reg_replace(value, "([0-9]+)[- ]*([0-9]+)", "$1-$2", __FILE__, __LINE__);
		if(fromTo.empty()) {
			*param_from = *param_to = atoi(value);
			if(*param_from < 0 || *param_from > 23) {
				*param_from = -1;
				*param_to = -1;
			}
		} else {
			sscanf(fromTo.c_str(), "%i-%i", param_from, param_to);
			if(*param_from < 0 || *param_from > 23 ||
			   *param_to < 0 || *param_to > 23) {
				*param_from = -1;
				*param_to = -1;
			}
		}
		return(true);
	}
	return(false);
}
Beispiel #2
0
/* get esqk information from contact header and save this in call cell
*/
int get_esqk_in_contact(char *contact_esgwri, ESCT *call_cell){
    char *contact_esqk_aux;
    str pattern_contact_esqk, replacement_contact_esqk;
    str pt_contact_esqk;

    int len_contact_esgwri =  strlen(contact_esgwri);

    contact_esqk_aux = pkg_malloc(sizeof (char)*len_contact_esgwri + 1);
    if (contact_esqk_aux == NULL) {
        LM_ERR("no more pkg memory\n");
        return -1;
    }
    memset(contact_esqk_aux, 0,len_contact_esgwri + 1);
    pt_contact_esqk.s = contact_esqk_aux;
    pt_contact_esqk.len = len_contact_esgwri;

    pattern_contact_esqk.s = "Asserted-Identity:=<(sips?:)*[+]*1?([-0-9]+)@";
    pattern_contact_esqk.len = strlen(pattern_contact_esqk.s);
    replacement_contact_esqk.s = "\\2";
    replacement_contact_esqk.len = strlen(replacement_contact_esqk.s);

    if (reg_replace(pattern_contact_esqk.s, replacement_contact_esqk.s, contact_esgwri, &pt_contact_esqk) != 1) {
        LM_ERR("****** PATTERN ESQK NAO OK \n");
        pkg_free(contact_esqk_aux);
        pkg_free(contact_esgwri);

        if (strlen(call_cell->lro) <= 1){
            pkg_free(call_cell->callid);
            pkg_free(call_cell);
        }
        return -1;
    }
    pt_contact_esqk.len = strlen(pt_contact_esqk.s);

    call_cell->esqk = pkg_malloc(sizeof (char)* pt_contact_esqk.len + 1);
    if (call_cell->esqk == NULL) {
        LM_ERR("--------------------------------------------------no more shm memory\n");
        return -1;
    }

    memcpy(call_cell->esqk, pt_contact_esqk.s, pt_contact_esqk.len);
    call_cell->esqk[pt_contact_esqk.len] = 0;

    LM_DBG ("CONTEUDO TRANS REPLY ESQK %.*s \n", pt_contact_esqk.len, pt_contact_esqk.s);
    pkg_free(contact_esqk_aux);

    return 1;
}
Beispiel #3
0
/* get lro information from contact header and save this in call cell
*/
int get_lro_in_contact(char *contact_lro, ESCT *call_cell) {

    char *contact_lro_aux;
    str pattern_contact_lro, replacement_contact_lro;
    str pt_contact_lro;

    int len_contact_lro =  strlen(contact_lro);

    contact_lro_aux = pkg_malloc(sizeof (char)*len_contact_lro + 1);
    if (contact_lro_aux == NULL) {
        LM_ERR("no more pkg memory\n");
        return -1;
    }
    memset(contact_lro_aux, 0,len_contact_lro  + 1);
    pt_contact_lro.s = contact_lro_aux;
    pt_contact_lro.len = len_contact_lro;

    pattern_contact_lro.s = "(sips?:)*+?1?([-0-9]+)@";
    pattern_contact_lro.len = strlen(pattern_contact_lro.s);
    replacement_contact_lro.s = "\\2";
    replacement_contact_lro.len = strlen(replacement_contact_lro.s);

    if (reg_replace(pattern_contact_lro.s, replacement_contact_lro.s, contact_lro, &pt_contact_lro) != 1) {
        LM_ERR("****** PATTERN LRO NAO OK \n");
        pkg_free(contact_lro_aux);
        pkg_free(contact_lro);

        return 1;
    }
    pt_contact_lro.len = strlen(pt_contact_lro.s);

    call_cell->lro = pkg_malloc(sizeof (char)* pt_contact_lro.len + 1);
    if (call_cell->lro == NULL) {
        LM_ERR("--------------------------------------------------no more shm memory\n");
        return -1;
    }

    memcpy(call_cell->lro, pt_contact_lro.s, pt_contact_lro.len);
    call_cell->lro[pt_contact_lro.len] = 0;
    call_cell->disposition = "none";

    LM_DBG ("CONTEUDO TRANS REPLY LRO %.*s \n", pt_contact_lro.len, pt_contact_lro.s);
    pkg_free(contact_lro_aux);
    pkg_free(contact_lro);

    return 1;
}
Beispiel #4
0
/*
 * Makes enum query on name.  On success, rewrites user part and 
 * replaces Request-URI.
 */
int do_query(struct sip_msg* _msg, char *user, char *name, str *service) {

    char uri[MAX_URI_SIZE];
    char new_uri[MAX_URI_SIZE];
    unsigned int priority, curr_prio, first;
    qvalue_t q;
    struct rdata* head;
    struct rdata* l;
    struct naptr_rdata* naptr;
    str pattern, replacement, result, new_result;

    head = get_record(name, T_NAPTR);
    
    if (head == 0) {
	LM_DBG("No NAPTR record found for %s.\n", name);
	return -1;
    }
    
    naptr_sort(&head);

    q = MAX_Q - 10;
    curr_prio = 0;
    first = 1;

    for (l = head; l; l = l->next) {

	if (l->type != T_NAPTR) continue; /*should never happen*/
	naptr = (struct naptr_rdata*)l->rdata;
	if (naptr == 0) {
	    LM_ERR("Null rdata in DNS response\n");
	    continue;
	}

	LM_DBG("ENUM query on %s: order %u, pref %u, flen %u, flags '%.*s', "
	       "slen %u, services '%.*s', rlen %u, regexp '%.*s'\n",
	       name, naptr->order, naptr->pref,
	    naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags),
	    naptr->services_len,
	    (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len,
	    (int)(naptr->regexp_len), ZSW(naptr->regexp));
	
	if (sip_match(naptr, service) == 0) continue;
	
	if (parse_naptr_regexp(&(naptr->regexp[0]), naptr->regexp_len,
			       &pattern, &replacement) < 0) {
	    LM_ERR("Parsing of NAPTR regexp failed\n");
	    continue;
	}
	result.s = &(uri[0]);
	result.len = MAX_URI_SIZE;
	/* Avoid making copies of pattern and replacement */
	pattern.s[pattern.len] = (char)0;
	replacement.s[replacement.len] = (char)0;
	if (reg_replace(pattern.s, replacement.s, user, &result) < 0) {
	    pattern.s[pattern.len] = '!';
	    replacement.s[replacement.len] = '!';
	    LM_ERR("Regexp replace failed\n");
	    continue;
	}
	LM_DBG("Resulted in replacement: '%.*s'\n", result.len, ZSW(result.s));
	pattern.s[pattern.len] = '!';
	replacement.s[replacement.len] = '!';
	
	if (param.len > 0) {
	    if (result.len + param.len > MAX_URI_SIZE - 1) {
		LM_ERR("URI is too long\n");
		continue;
	    }
	    new_result.s = &(new_uri[0]);
	    new_result.len = MAX_URI_SIZE;
	    if (add_uri_param(&result, &param, &new_result) == 0) {
		LM_ERR("Parsing of URI <%.*s> failed\n",
		       result.len, result.s);
		continue;
	    }
	    if (new_result.len > 0) {
		result = new_result;
	    }
	}
	
	if (first) {
	    if (set_ruri(_msg, &result) == -1) {
		goto done;
	    }
	    set_ruri_q(q);
	    first = 0;
	    curr_prio = ((naptr->order) << 16) + naptr->pref;
	} else {
	    priority = ((naptr->order) << 16) + naptr->pref;
	    if (priority > curr_prio) {
		q = q - 10;
		curr_prio = priority;
	    }
	    if (append_branch(_msg, &result, 0, 0, q, 0, 0) == -1) {
		goto done;
	    }
	}
    }

done:
    free_rdata_list(head);
    return first ? -1 : 1;
}
Beispiel #5
0
/*
 * Check if from user is a valid enum based user, and check to make sure
 * that the src_ip == an srv record that maps to the enum from user.
 */
int is_from_user_enum_2(struct sip_msg* _msg, char* _suffix, char* _service)
{
	struct ip_addr addr;
	struct hostent* he;
	unsigned short zp;
	unsigned short proto;
	char *user_s;
	int user_len, i, j;
	char name[MAX_DOMAIN_SIZE];
	char uri[MAX_URI_SIZE];
	struct sip_uri *furi;
	struct sip_uri luri;
	struct rdata* head;

	str* suffix;
	str* service;

	struct rdata* l;
	struct naptr_rdata* naptr;

	str pattern, replacement, result;
	char string[17];

	if (parse_from_header(_msg) < 0) {
	    LM_ERR("Failed to parse From header\n");
	    return -1;
	}
	
	if(_msg->from==NULL || get_from(_msg)==NULL) {
	    LM_DBG("No From header\n");
	    return -1;
	}

	if ((furi = parse_from_uri(_msg)) == NULL) {
	    LM_ERR("Failed to parse From URI\n");
	    return -1;
	}

	suffix = (str*)_suffix;
	service = (str*)_service;

	if (is_e164(&(furi->user)) == -1) {
	    LM_ERR("From URI user is not an E164 number\n");
	    return -1;
	}

	/* assert: the from user is a valid formatted e164 string */

	user_s = furi->user.s;
	user_len = furi->user.len;

	j = 0;
	for (i = user_len - 1; i > 0; i--) {
		name[j] = user_s[i];
		name[j + 1] = '.';
		j = j + 2;
	}

	memcpy(name + j, suffix->s, suffix->len + 1);

	head = get_record(name, T_NAPTR);

	if (head == 0) {
		LM_DBG("No NAPTR record found for %s.\n", name);
		return -3;
	}

	/* we have the naptr records, loop and find an srv record with */
	/* same ip address as source ip address, if we do then true is returned */

	for (l = head; l; l = l->next) {

		if (l->type != T_NAPTR) continue; /*should never happen*/
		naptr = (struct naptr_rdata*)l->rdata;
		if (naptr == 0) {
			LM_ERR("Null rdata in DNS response\n");
			free_rdata_list(head);
			return -4;
		}

		LM_DBG("ENUM query on %s: order %u, pref %u, flen %u, flags "
		       "'%.*s', slen %u, services '%.*s', rlen %u, "
		       "regexp '%.*s'\n",
		       name, naptr->order, naptr->pref,
		    naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags), naptr->services_len,
		    (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len,
		    (int)(naptr->regexp_len), ZSW(naptr->regexp));

		if (sip_match(naptr, service) != 0) {
			if (parse_naptr_regexp(&(naptr->regexp[0]), naptr->regexp_len,
					 &pattern, &replacement) < 0) {
				free_rdata_list(head); /*clean up*/
				LM_ERR("Parsing of NAPTR regexp failed\n");
				return -5;
			}
#ifdef LATER
			if ((pattern.len == 4) && (strncmp(pattern.s, "^.*$", 4) == 0)) {
				LM_DBG("Resulted in replacement: '%.*s'\n",
				       replacement.len, ZSW(replacement.s));				
				retval = set_uri(_msg, replacement.s, replacement.len);
				free_rdata_list(head); /*clean up*/
				return retval;
			}
#endif
			result.s = &(uri[0]);
			result.len = MAX_URI_SIZE;
			/* Avoid making copies of pattern and replacement */
			pattern.s[pattern.len] = (char)0;
			replacement.s[replacement.len] = (char)0;
			/* We have already checked the size of
			   _msg->parsed_uri.user.s */ 
			memcpy(&(string[0]), user_s, user_len);
			string[user_len] = (char)0;
			if (reg_replace(pattern.s, replacement.s, &(string[0]),
					&result) < 0) {
				pattern.s[pattern.len] = '!';
				replacement.s[replacement.len] = '!';
				LM_ERR("Regexp replace failed\n");
				free_rdata_list(head); /*clean up*/
				return -6;
			}
			LM_DBG("Resulted in replacement: '%.*s'\n",
			    result.len, ZSW(result.s));

			if(parse_uri(result.s, result.len, &luri) < 0)
			{
				LM_ERR("Parsing of URI <%.*s> failed\n",
				       result.len, result.s);
				free_rdata_list(head); /*clean up*/
				return -7;
			}

			pattern.s[pattern.len] = '!';
			replacement.s[replacement.len] = '!';

			zp = 0;
			proto = PROTO_NONE;
			he = sip_resolvehost(&luri.host, &zp, &proto,
				(luri.type==SIPS_URI_T)?1:0 , 0);

			hostent2ip_addr(&addr, he, 0);

			if(ip_addr_cmp(&addr, &_msg->rcv.src_ip))
			{
				free_rdata_list(head);
				return(1);
			}
		}
	}
	free_rdata_list(head); /*clean up*/
	LM_DBG("FAIL\n");

    /* must not have found the record */
    return(-8);
}
Beispiel #6
0
int enum_pv_query_3(struct sip_msg* _msg, char* _sp, char* _suffix,
		    char* _service)
{
	char *user_s;
	int user_len, i, j, first;
	char name[MAX_DOMAIN_SIZE];
	char uri[MAX_URI_SIZE];
	char new_uri[MAX_URI_SIZE];
	unsigned int priority, curr_prio;
	qvalue_t q;
	char tostring[17];
	struct rdata* head;
	struct rdata* l;
	struct naptr_rdata* naptr;
	str pattern, replacement, result, new_result;
	str *suffix, *service;
	char string[17];
	pv_spec_t *sp;
	pv_value_t pv_val;

	sp = (pv_spec_t *)_sp;
	suffix = (str*)_suffix;
	service = (str*)_service;

	/*
	 *  Get R-URI user to tostring
	 */
	if (parse_sip_msg_uri(_msg) < 0) {
		LM_ERR("R-URI parsing failed\n");
		return -1;
	}

	user_s = _msg->parsed_uri.user.s;
	user_len = _msg->parsed_uri.user.len;

	memcpy(&(tostring[0]), user_s, user_len);
	tostring[user_len] = (char)0;

	/*
	 * Get E.164 number from pseudo variable
         */
	if (sp && (pv_get_spec_value(_msg, sp, &pv_val) == 0)) {
	    if (pv_val.flags & PV_VAL_STR) {
		if (pv_val.rs.len == 0 || pv_val.rs.s == NULL) {
		    LM_DBG("Missing E.164 number\n");
		    return -1;
		}
	    } else {
		LM_DBG("Pseudo variable value is not string\n");
		return -1;
	}
	} else {
	    LM_DBG("Cannot get pseudo variable value\n");
	    return -1;
	}
	if (is_e164(&(pv_val.rs)) == -1) {
	    LM_ERR("pseudo variable does not contain an E164 number\n");
	    return -1;
	}

	user_s = pv_val.rs.s;
	user_len = pv_val.rs.len;

	memcpy(&(string[0]), user_s, user_len);
	string[user_len] = (char)0;

	j = 0;
	for (i = user_len - 1; i > 0; i--) {
		name[j] = user_s[i];
		name[j + 1] = '.';
		j = j + 2;
	}

	memcpy(name + j, suffix->s, suffix->len + 1);

	head = get_record(name, T_NAPTR);

	if (head == 0) {
		LM_DBG("No NAPTR record found for %s.\n", name);
		return -1;
	}

	naptr_sort(&head);

	q = MAX_Q - 10;
	curr_prio = 0;
	first = 1;

	for (l = head; l; l = l->next) {

		if (l->type != T_NAPTR) continue; /*should never happen*/
		naptr = (struct naptr_rdata*)l->rdata;
		if (naptr == 0) {
			LM_ERR("Null rdata in DNS response\n");
			continue;
		}

		LM_DBG("ENUM query on %s: order %u, pref %u, flen %u, flags "
		       "'%.*s', slen %u, services '%.*s', rlen %u, "
		       "regexp '%.*s'\n",
		       name, naptr->order, naptr->pref,
		    naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags),
		    naptr->services_len,
		    (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len,
		    (int)(naptr->regexp_len), ZSW(naptr->regexp));

		if (sip_match(naptr, service) == 0) continue;

		if (parse_naptr_regexp(&(naptr->regexp[0]), naptr->regexp_len,
				       &pattern, &replacement) < 0) {
			LM_ERR("Parsing of NAPTR regexp failed\n");
			continue;
		}
		result.s = &(uri[0]);
		result.len = MAX_URI_SIZE;
		/* Avoid making copies of pattern and replacement */
		pattern.s[pattern.len] = (char)0;
		replacement.s[replacement.len] = (char)0;
		if (reg_replace(pattern.s, replacement.s, &(tostring[0]),
				&result) < 0) {
			pattern.s[pattern.len] = '!';
			replacement.s[replacement.len] = '!';
			LM_ERR("Regexp replace failed\n");
			continue;
		}
		LM_DBG("Resulted in replacement: '%.*s'\n",
		       result.len, ZSW(result.s));
		pattern.s[pattern.len] = '!';
		replacement.s[replacement.len] = '!';
		
		if (param.len > 0) {
			if (result.len + param.len > MAX_URI_SIZE - 1) {
				LM_ERR("URI is too long\n");
				continue;
			}
			new_result.s = &(new_uri[0]);
			new_result.len = MAX_URI_SIZE;
			if (add_uri_param(&result, &param, &new_result) == 0) {
				LM_ERR("Parsing of URI <%.*s> failed\n",
				       result.len, result.s);
				continue;
			}
			if (new_result.len > 0) {
				result = new_result;
			}
		}

		if (first) {
			if (set_ruri(_msg, &result) == -1) {
				goto done;
			}
			set_ruri_q(q);
			first = 0;
			curr_prio = ((naptr->order) << 16) + naptr->pref;
		} else {
			priority = ((naptr->order) << 16) + naptr->pref;
			if (priority > curr_prio) {
				q = q - 10;
				curr_prio = priority;
			}
			if (append_branch(_msg, &result, 0, 0, q, 0, 0) == -1) {
				goto done;
			}
		}
	}

done:
	free_rdata_list(head);
	return first ? -1 : 1;
}
Beispiel #7
0
int dp_can_connect_str(str *domain, int rec_level) {
    struct rdata* head;
    struct rdata* l;
    struct naptr_rdata* naptr;
    struct naptr_rdata* next_naptr;
    int	   ret;
    str	   newdomain;
    char   uri[MAX_URI_SIZE];
    struct avp_stack stack;
    int    last_order = -1;
    int    failed = 0;
    int    found_anything = 0;

    str pattern, replacement, result;

    stack_reset(&stack);
    /* If we're in a recursive call, set the domain-replacement */
    if ( rec_level > 0 ) {
	stack_push(&stack, domain_replacement_name.s.s, domain->s);
	stack.succeeded = 0;
    }

    if (rec_level > MAX_DDDS_RECURSIONS) {
    	LM_ERR("too many indirect NAPTRs. Aborting at %.*s.\n", domain->len,
				ZSW(domain->s));
		return(DP_DDDS_RET_DNSERROR);
    }

    LM_INFO("looking up Domain itself: %.*s\n",domain->len, ZSW(domain->s));
    ret = check_rule(domain,"D2P+sip:dom", 11, &stack);

    if (ret == 1) {
	LM_INFO("found a match on domain itself\n");
	stack_to_avp(&stack);
	return(DP_DDDS_RET_POSITIVE);
    } else if (ret == 0) {
	LM_INFO("no match on domain itself.\n");
	stack_reset(&stack);
	/* If we're in a recursive call, set the domain-replacement */
	if ( rec_level > 0 ) {
	    stack_push(&stack, domain_replacement_name.s.s, (char *) domain->s);
	    stack.succeeded = 0;
	}
    } else {
	return(DP_DDDS_RET_DNSERROR);	/* actually: DB error */
    }

    LM_INFO("doing DDDS with %.*s\n",domain->len, ZSW(domain->s));
    head = get_record(domain->s, T_NAPTR, RES_ONLY_TYPE);
    if (head == 0) {
    	LM_NOTICE("no NAPTR record found for %.*s.\n", 
				domain->len, ZSW(domain->s));
    	return(DP_DDDS_RET_NOTFOUND);
    }

    LM_DBG("found the following NAPTRs: \n");
    for (l = head; l; l = l->next) {
	if (l->type != T_NAPTR) {
	    LM_DBG("found non-NAPTR record.\n");
	    continue; /*should never happen*/
	}
	naptr = (struct naptr_rdata*)l->rdata;
	if (naptr == 0) {
		LM_CRIT("null rdata\n");
		continue;
	}
	LM_DBG("order %u, pref %u, flen %u, flags '%.*s', slen %u, "
	    "services '%.*s', rlen %u, regexp '%.*s', repl '%s'\n", 
		naptr->order, naptr->pref,
	    naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags),
	    naptr->services_len,
	    (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len,
	    (int)(naptr->regexp_len), ZSW(naptr->regexp),
	    ZSW(naptr->repl)
	    );
    }


    LM_DBG("sorting...\n");
    naptr_sort(&head);

    for (l = head; l; l = l->next) {

	if (l->type != T_NAPTR) continue; /*should never happen*/
	naptr = (struct naptr_rdata*)l->rdata;
	if (naptr == 0) {
		LM_CRIT("null rdata\n");
		continue;
	}

	LM_DBG("considering order %u, pref %u, flen %u, flags '%.*s', slen %u, "
	    "services '%.*s', rlen %u, regexp '%.*s', repl '%s'\n", 
		naptr->order, naptr->pref,
	    naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags),
	    naptr->services_len,
	    (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len,
	    (int)(naptr->regexp_len), ZSW(naptr->regexp),
	    ZSW(naptr->repl)
	    );

	/*
	 * New order? then we check whether the had success during the last one.
	 * If yes, we can leave the loop.
	 */
	if (last_order != naptr->order) {
	    	last_order = naptr->order;
		failed = 0;

		if (stack_succeeded(&stack)) {
    		LM_INFO("we don't need to consider further orders "
						"(starting with %d).\n",last_order);
		    break;
		}
	} else if (failed) {
	    LM_INFO("order %d has already failed.\n",last_order);
	    continue;
	}


	/*
	 * NAPTRs we don't care about
	 */
	if (!IS_D2PNAPTR(naptr)) 
	    continue;

	/*
	 * once we've been here, don't return DP_DDDS_RET_NOTFOUND
	 */
	found_anything = 1;

	next_naptr = NULL;
	if (l->next && (l->next->type == T_NAPTR)) {
	     next_naptr = (struct naptr_rdata*)l->next->rdata;
	}

	/*
	 * Non-terminal?
	 */
	if ((naptr->services_len == 7) && !strncasecmp("D2P+SIP", naptr->services,7) && (naptr->flags_len == 0)){
	    LM_INFO("found non-terminal NAPTR\n");

	    /*
	     * This needs to be the only record with this order.
	     */
	    if (next_naptr && (next_naptr->order == naptr->order) && IS_D2PNAPTR(next_naptr)) {
	    	LM_ERR("non-terminal NAPTR needs to be the only one "
					"with this order %.*s.\n", domain->len, ZSW(domain->s));

		return(DP_DDDS_RET_DNSERROR);
	    }

	    newdomain.s = naptr->repl;
	    newdomain.len = strlen(naptr->repl);

	    ret = dp_can_connect_str(&newdomain, rec_level + 1);

	    if (ret == DP_DDDS_RET_POSITIVE)	/* succeeded, we're done. */
		return(ret);

	    if (ret == DP_DDDS_RET_NEGATIVE)	/* found rules, did not work */
		continue;			/* look for more rules */

	    if (ret == DP_DDDS_RET_DNSERROR)	/* errors during lookup */
		return(ret);			/* report them */

	    if (ret == DP_DDDS_RET_NOTFOUND)	/* no entries in linked domain? */
		return(ret);			/* ok, fine. go with that */

	    continue; /* not reached */
	}

	/*
	 * wrong kind of terminal
	 */
	if ((naptr->flags_len != 1) || (tolower(naptr->flags[0]) != 'u')) {
	    LM_ERR("terminal NAPTR needs flag = 'u' and not '%.*s'.\n",
					(int)naptr->flags_len, ZSW(naptr->flags));
		/*
		 * It's not that clear what we should do now: Ignore this records or regard it as failed.
		 * We go with "ignore" for now.
		 */
		continue;
	}

	if (parse_naptr_regexp(&(naptr->regexp[0]), naptr->regexp_len,
			       &pattern, &replacement) < 0) {
		LM_ERR("parsing of NAPTR regexp failed\n");
		continue;
	}
	result.s = &(uri[0]);
	result.len = MAX_URI_SIZE;

	/* Avoid making copies of pattern and replacement */
	pattern.s[pattern.len] = (char)0;
	replacement.s[replacement.len] = (char)0;
	if (reg_replace(pattern.s, replacement.s, domain->s,
			&result) < 0) {
		pattern.s[pattern.len] = '!';
		replacement.s[replacement.len] = '!';
		LM_ERR("regexp replace failed\n");
		continue;
	}
	LM_INFO("resulted in replacement: '%.*s'\n", result.len, ZSW(result.s));
	pattern.s[pattern.len] = '!';
	replacement.s[replacement.len] = '!';

	ret = check_rule(&result,naptr->services,naptr->services_len, &stack);

	if (ret == 1) {
	    LM_INFO("positive return\n");
	} else if (ret == 0) {
	    LM_INFO("check_rule failed.\n");
	    stack_reset(&stack);
	    /* If we're in a recursive call, set the domain-replacement */
	    if ( rec_level > 0 ) {
		stack_push(&stack, domain_replacement_name.s.s, (char *) domain->s);
		stack.succeeded = 0;
	    }
	    failed = 1;
	} else {
	    return(DP_DDDS_RET_DNSERROR);
    	}
    }

    if (stack_succeeded(&stack)) {
        LM_INFO("calling stack_to_avp.\n");
		stack_to_avp(&stack);
		return(DP_DDDS_RET_POSITIVE);
    }

    LM_INFO("returning %d.\n", 
	    (found_anything ? DP_DDDS_RET_NEGATIVE : DP_DDDS_RET_NOTFOUND));
    return(  found_anything ? DP_DDDS_RET_NEGATIVE : DP_DDDS_RET_NOTFOUND );
}
Beispiel #8
0
/* get esgwri or ert information from contact header and save this in call cell
*/
int get_esgwri_ert_in_contact(char *contact_esgwri, ESCT *call_cell){

	char *contact_routing_aux;
	str pattern_contact_routing, replacement_contact_routing;
	str pt_contact_routing;
	int len_contact_routing;
	char *contact_routing;
	char *pt_aux;
	char *p_aux;
	char *srid_aux, *resn_aux, *npa_aux;
	char *pt_a, *pt_b;
	str pattern_contact_ert, replacement_contact_ert;

	char *p = strstr(contact_esgwri, "P-Asserted-Identity");
	len_contact_routing = p - contact_esgwri -1;

	contact_routing = pkg_malloc(sizeof (char)*len_contact_routing);
	if (contact_routing == NULL) {
		LM_ERR("no more pkg memory\n");
		return -1;
	}
	memset(contact_routing, 0, len_contact_routing);
	p_aux = contact_esgwri;
	p_aux++;
	memcpy(contact_routing, p_aux, len_contact_routing-1 );
	pkg_free(contact_esgwri);

	contact_routing_aux = pkg_malloc(sizeof (char)*len_contact_routing);
	if (contact_routing_aux == NULL) {
		LM_ERR("no more pkg memory\n");
		return -1;
	}
	memset(contact_routing_aux, 0,len_contact_routing);
	pt_contact_routing.s = contact_routing_aux;
	pt_contact_routing.len = len_contact_routing - 1;

	pattern_contact_routing.s = "^(sips?):[+]*([-0-9]+)@";
	pattern_contact_routing.len = strlen(pattern_contact_routing.s);
	replacement_contact_routing.s = "\\2";
	replacement_contact_routing.len = strlen(replacement_contact_routing.s);

	if (reg_replace(pattern_contact_routing.s, replacement_contact_routing.s, contact_routing, &pt_contact_routing) == 1) {
		LM_DBG ("TRANS REPLY ESGWRI %s \n",contact_routing);
		call_cell->esgwri = contact_routing;
		call_cell->disposition = "processes";

		pkg_free(contact_routing_aux);

	}else{
		pattern_contact_ert.s = "^(sips?):([A-Z0-9.]*)@";
		pattern_contact_ert.len = strlen(pattern_contact_ert.s);
		replacement_contact_ert.s = "\\2";
		replacement_contact_ert.len = strlen(replacement_contact_ert.s);

		if (reg_replace(pattern_contact_ert.s, replacement_contact_ert.s, contact_routing, &pt_contact_routing) != 1) {
			LM_ERR("****** PATTERN ERT NAO OK \n");
			pkg_free(contact_routing_aux);
			pkg_free(contact_routing);
			return 0;
		}

		LM_DBG ("CONTEUDO TRANS REPLY ERT %.*s \n", pt_contact_routing.len, pt_contact_routing.s);
		pt_aux = pt_contact_routing.s;
		pt_a = strchr(pt_aux,'.');
		int len_srid = pt_a - pt_contact_routing.s;
		srid_aux = pkg_malloc(sizeof (char)*len_srid + 1);
		if (srid_aux == NULL) {
			LM_ERR("no more pkg memory\n");
			return -1;
		}
		memcpy(srid_aux, pt_aux, len_srid);
		srid_aux[len_srid] = 0;
		pt_aux += len_srid + 1;

		pt_b = strchr(pt_aux,'.');
		int len_resn = pt_b - pt_aux ;
		resn_aux = pkg_malloc(sizeof (char)*len_resn + 1);
		if (resn_aux == NULL) {
			LM_ERR("no more pkg memory\n");
			return -1;
		}
		memcpy(resn_aux, pt_aux, len_resn);
		resn_aux[len_resn] = 0;
		pt_aux += len_resn + 1;

		int len_npa = pt_contact_routing.len - len_srid - len_resn;
		npa_aux = pkg_malloc(sizeof (char)*len_npa + 1);
		if (npa_aux == NULL) {
			LM_ERR("no more pkg memory\n");
			return -1;
		}
		npa_aux[len_npa] = 0;
		memcpy(npa_aux, pt_aux, len_npa);

		LM_DBG ("CONTEUDO TRANS REPLY SRID %s \n",srid_aux);
		LM_DBG ("CONTEUDO TRANS REPLY RESN %s \n",resn_aux);
		LM_DBG ("CONTEUDO TRANS REPLY NPA %s \n",npa_aux);
		int npa = atoi(npa_aux);
		int resn = atoi(resn_aux);
		int srid_len = strlen(srid_aux);

		call_cell->ert_npa = npa;
		call_cell->ert_resn = resn;
		call_cell->ert_srid = pkg_malloc(sizeof (char)* srid_len + 1);
		if (call_cell->ert_srid == NULL) {
			LM_ERR("--------------------------------------------------no more shm memory\n");
			return -1;
		}

		strcpy(call_cell->ert_srid, srid_aux);
		call_cell->ert_srid[srid_len] = 0;

		call_cell->disposition = "processes";

		pkg_free(contact_routing_aux);
		pkg_free(contact_routing);
		pkg_free(srid_aux);
		pkg_free(resn_aux);
		pkg_free(npa_aux);
	}
	return 1;
}
Beispiel #9
0
/*
 * get parsed data extract from esrResponse and save in calls_eme struct:
 *  - source
 *       .organizationname
 *       .hostname
 *       .nenaid
 *       .contact
 *       .certuri
 *   - vpc
 *       .organizationname
 *       .hostname
 *       .nenaid
 *       .contact
 *       .certuri
 *   - esqk
 *   - callid
 *   - lro
 *   - result
 *   - datetimestamp
 */
int treat_parse_esrResponse(struct sip_msg *msg, ESCT *call_cell, PARSED *parsed, int proxy_role){
	char *p;
	int vsp_addr_len;
	char *vsp_addr = "@vsp.com";
	str pattern_lro, replacement_lro;
	str pt_lro;
	char *lro_aux;

	call_cell->esgwri = empty;
	call_cell->ert_srid = empty;
	call_cell->ert_npa = 0;
	call_cell->ert_resn = 0;

	call_cell->esgw = empty;
	call_cell->lro = empty;
	call_cell->disposition = empty;

	LM_DBG(" --- TREAT PARSE ESRRESPONSE...");

	call_cell->source->organizationname = parsed->destination->organizationname;
	call_cell->source->hostname = parsed->destination->hostname;
	call_cell->source->nenaid = parsed->destination->nenaid;
	call_cell->source->contact = parsed->destination->contact;
	call_cell->source->certuri = parsed->destination->certuri;
	call_cell->vpc->organizationname = parsed->vpc->organizationname;
	call_cell->vpc->hostname = parsed->vpc->hostname;
	call_cell->vpc->nenaid = parsed->vpc->nenaid;
	call_cell->vpc->contact = parsed->vpc->contact;
	call_cell->vpc->certuri = parsed->vpc->certuri;
	call_cell->esqk = parsed->esqk;
	call_cell->callid = parsed->callid;
	call_cell->datetimestamp = parsed->datetimestamp;
	call_cell->result = parsed->result;

	if (parsed->esgwri != empty && strlen(parsed->esgwri) > 0) {

		call_cell->esgwri = parsed->esgwri;
		call_cell->ert_npa = 0;
		call_cell->ert_resn = 0;
		call_cell->ert_srid = "";

		char *r = strstr(call_cell->esgwri, "@");
		r++;
		int tam_esgw = call_cell->esgwri + strlen(call_cell->esgwri) - r;

		call_cell->esgw = pkg_malloc(sizeof (char)*tam_esgw + 1);
		if (call_cell->esgw == NULL) {
			LM_ERR("--------------------------------------------------no more shm memory\n");
			return -1;
		}
		memcpy(call_cell->esgw, r, tam_esgw);
		call_cell->esgw[tam_esgw] = 0;

		LM_DBG(" --- ESGW:%s \n", call_cell->esgw);


		if (parsed->ert->selectiveRoutingID != empty)
			pkg_free(parsed->ert->selectiveRoutingID);

		if (parsed->ert->routingESN != empty)
			pkg_free(parsed->ert->routingESN);

		if (parsed->ert->npa != empty)
			pkg_free(parsed->ert->npa);

	} else {
		if ((parsed->ert->selectiveRoutingID != empty) && (parsed->ert->routingESN != empty) && (parsed->ert->npa != empty)) {
			int npa = atoi(parsed->ert->npa);
			int resn = atoi(parsed->ert->routingESN);
			call_cell->ert_npa = npa;
			call_cell->ert_resn = resn;

			call_cell->ert_srid = parsed->ert->selectiveRoutingID;

			if (proxy_role == 4){
				// in opensips as redirect role, consider esgwri as joint selectiveRoutingID + routingESN + npa + @vsp_address in contact headers in 300 response
				// get source ip address that send INVITE
				vsp_addr = ip_addr2a(&msg->rcv.src_ip);
				vsp_addr_len = strlen(vsp_addr);

				int esgw_len = strlen(parsed->ert->selectiveRoutingID) + strlen(parsed->ert->routingESN) + strlen(parsed->ert->npa) + vsp_addr_len + 4;
				p = pkg_malloc(sizeof (char)*esgw_len);
				if (p == NULL) {
					LM_ERR("--------------------------------------------------no more shm memory\n");
					return -1;
				}

				call_cell->esgwri = p;

				memcpy(p, parsed->ert->selectiveRoutingID, strlen(parsed->ert->selectiveRoutingID));
				p += strlen(parsed->ert->selectiveRoutingID);
				*p = '.';
				p++;
				memcpy(p, parsed->ert->routingESN, strlen(parsed->ert->routingESN));
				p += strlen(parsed->ert->routingESN);
				*p = '.';
				p++;
				memcpy(p, parsed->ert->npa, strlen(parsed->ert->npa));
				p += strlen(parsed->ert->npa);
				*p = '@';
				p++;
				memcpy(p, vsp_addr, vsp_addr_len);
				p += vsp_addr_len;
				*p = 0;

			}else{
				call_cell->esgwri = "";
			}

			pkg_free(parsed->ert->routingESN);
			pkg_free(parsed->ert->npa);
		}
	}

	if (parsed-> lro!= empty ) {
		// extarct only contigency number in lro
		LM_DBG( "LRO %s \n", parsed-> lro);
		int len_lro = strlen(parsed->lro);

		lro_aux = pkg_malloc(sizeof (char)*len_lro + 1);
		if (lro_aux == NULL) {
			LM_ERR("no more pkg memory\n");
			return -1;
		}
		memset(lro_aux, 0, len_lro + 1);
		pt_lro.s = lro_aux;
		pt_lro.len = len_lro;

		pattern_lro.s = "(tel:)*[+]*([-0-9]+)";
		pattern_lro.len = strlen(pattern_lro.s);
		replacement_lro.s = "\\2";
		replacement_lro.len = strlen(replacement_lro.s);

		if (reg_replace(pattern_lro.s, replacement_lro.s, parsed->lro, &pt_lro) != 1) {
			LM_ERR("****** PATTERN LRO NAO OK \n");
			pkg_free(lro_aux);
			goto end;
		}
		pt_lro.len = strlen(pt_lro.s);
		LM_DBG("****** PATTERN LRO OK II %.*s\n",pt_lro.len,pt_lro.s);
		call_cell->lro = pkg_malloc(sizeof (char)*pt_lro.len+1);
		if (call_cell->lro == NULL) {
			LM_ERR("--------------------------------------------------no more shm memory\n");
			return -1;
		}

		memcpy(call_cell->lro, pt_lro.s, pt_lro.len);
		call_cell->lro[pt_lro.len] = 0;
		pkg_free(lro_aux);
		pkg_free(parsed->lro);
	}

end:
	pkg_free(parsed->ert);
	pkg_free(parsed->vpc);
	pkg_free(parsed->destination);
	pkg_free(parsed);
	return 1;
}
Beispiel #10
0
int enum_query_2(struct sip_msg* _msg, char* _suffix, char* _service)
{
	char *user_s;
	int user_len, i, j, first;
	char name[MAX_DOMAIN_SIZE];
	char uri[MAX_URI_SIZE];
	char new_uri[MAX_URI_SIZE];
	unsigned int priority, curr_prio;
	qvalue_t q;

	struct rdata* head;
	struct rdata* l;
	struct naptr_rdata* naptr;

	str pattern, replacement, result, new_result;

	char string[17];

	str *suffix, *service;

	suffix = (str*)_suffix;
	service = (str*)_service;

	if (parse_sip_msg_uri(_msg) < 0) {
		LOG(L_ERR, "enum_query(): uri parsing failed\n");
		return -1;
	}

	if (is_e164(&(_msg->parsed_uri.user)) == -1) {
		LOG(L_ERR, "enum_query(): uri user is not an E164 number\n");
		return -1;
	}

	user_s = _msg->parsed_uri.user.s;
	user_len = _msg->parsed_uri.user.len;

	memcpy(&(string[0]), user_s, user_len);
	string[user_len] = (char)0;

	j = 0;
	for (i = user_len - 1; i > 0; i--) {
		name[j] = user_s[i];
		name[j + 1] = '.';
		j = j + 2;
	}

	memcpy(name + j, suffix->s, suffix->len + 1);

	head = get_record(name, T_NAPTR);

	if (head == 0) {
		DBG("enum_query(): No NAPTR record found for %s.\n", name);
		return -1;
	}

	naptr_sort(&head);

	q = MAX_Q - 10;
	curr_prio = 0;
	first = 1;

	for (l = head; l; l = l->next) {

		if (l->type != T_NAPTR) continue; /*should never happen*/
		naptr = (struct naptr_rdata*)l->rdata;
		if (naptr == 0) {
			LOG(L_CRIT, "enum_query: BUG: null rdata\n");
			continue;
		}

		DBG("enum_query(): order %u, pref %u, flen %u, flags '%.*s', slen %u, "
		    "services '%.*s', rlen %u, regexp '%.*s'\n", naptr->order, naptr->pref,
		    naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags),
		    naptr->services_len,
		    (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len,
		    (int)(naptr->regexp_len), ZSW(naptr->regexp));

		if (sip_match(naptr, service) == 0) continue;

		if (parse_naptr_regexp(&(naptr->regexp[0]), naptr->regexp_len,
				       &pattern, &replacement) < 0) {
			LOG(L_ERR, "enum_query(): parsing of NAPTR regexp failed\n");
			continue;
		}
		result.s = &(uri[0]);
		result.len = MAX_URI_SIZE;
		/* Avoid making copies of pattern and replacement */
		pattern.s[pattern.len] = (char)0;
		replacement.s[replacement.len] = (char)0;
		if (reg_replace(pattern.s, replacement.s, &(string[0]),
				&result) < 0) {
			pattern.s[pattern.len] = '!';
			replacement.s[replacement.len] = '!';
			LOG(L_ERR, "enum_query(): regexp replace failed\n");
			continue;
		}
		DBG("enum_query(): resulted in replacement: '%.*s'\n",
		    result.len, ZSW(result.s));
		pattern.s[pattern.len] = '!';
		replacement.s[replacement.len] = '!';
		
		if (param.len > 0) {
			if (result.len + param.len > MAX_URI_SIZE - 1) {
				LOG(L_ERR, "ERROR: enum_query(): URI is too long\n");
				continue;
			}
			new_result.s = &(new_uri[0]);
			new_result.len = MAX_URI_SIZE;
			if (add_uri_param(&result, &param, &new_result) == 0) {
				LOG(L_ERR, "ERROR: enum_query(): Parsing of URI failed\n");
				continue;
			}
			if (new_result.len > 0) {
				result = new_result;
			}
		}

		if (first) {
			if (rewrite_uri(_msg, &result) == -1) {
				goto done;
			}
			set_ruri_q(q);
			first = 0;
			curr_prio = ((naptr->order) << 16) + naptr->pref;
		} else {
			priority = ((naptr->order) << 16) + naptr->pref;
			if (priority > curr_prio) {
				q = q - 10;
				curr_prio = priority;
			}
			if (append_branch(_msg, &result, 0, q, 0, 0) == -1) {
				goto done;
			}
		}
	}

done:
	free_rdata_list(head);
	return first ? -1 : 1;
}
Beispiel #11
0
/*
*  - source
*       .organizationname
*       .hostname
*       .nenaid
*       .contact
*       .certuri
*   - vpc
*       .organizationname
*       .hostname
*       .nenaid
*       .contact
*       .certuri
*   - esqk
*   - callid
*   - lro
*   - result
*   - datetimestamp
*/
int treat_parse_esrResponse(struct sip_msg *msg, ESCT *call_cell , NENA *call_cell_vpc, NENA *call_cell_source, PARSED *parsed, int proxy_role){
    char *p;
    int vsp_addr_len;
    char *vsp_addr = "@vsp.com";
    str pattern_lro, replacement_lro;
    str pt_lro;
    char *lro_aux;

    call_cell->vpc = call_cell_vpc;
    call_cell->source = call_cell_source;
    call_cell_source->organizationname = empty;
    call_cell_source->hostname = empty;
    call_cell_source->nenaid = empty;
    call_cell_source->contact = empty;
    call_cell_source->certuri = empty;

    call_cell_vpc->organizationname = empty;
    call_cell_vpc->hostname = empty;
    call_cell_vpc->nenaid = empty;
    call_cell_vpc->contact = empty;
    call_cell_vpc->certuri = empty;

    call_cell->esgwri = empty;
    call_cell->ert_srid = empty;
    call_cell->ert_npa = 0;
    call_cell->ert_resn = 0;

    call_cell->esqk = empty;
    call_cell->esgw = empty;
    call_cell->lro = empty;
    call_cell->disposition = empty;
    call_cell->datetimestamp = empty;

    LM_DBG(" --- TREAT PARSE ESRRESPONSE...");
    if (parsed->destination->organizationname != NULL) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->destination->organizationname)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->destination->organizationname);
        call_cell_source->organizationname = field;
    }
    if (parsed->destination->hostname != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->destination->hostname)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->destination->hostname);
        call_cell_source->hostname = field;
    }
    if (parsed->destination->nenaid != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->destination->nenaid)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->destination->nenaid);
        call_cell_source->nenaid = field;
    }
    if (parsed->destination->contact != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->destination->contact)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->destination->contact);
        call_cell_source->contact = field;
    }

    if (parsed->destination->certuri != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->destination->certuri)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->destination->certuri);
        call_cell_source->certuri = field;
    }

    if (parsed->vpc->organizationname != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->vpc->organizationname)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->vpc->organizationname);
        call_cell_vpc->organizationname = field;
    }
    if (parsed->vpc->hostname != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->vpc->hostname)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->vpc->hostname);
        call_cell_vpc->hostname = field;
    }
    if (parsed->vpc->nenaid != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->vpc->nenaid)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->vpc->nenaid);
        call_cell_vpc->nenaid = field;
    }
    if (parsed->vpc->contact != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->vpc->contact)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->vpc->contact);
        call_cell_vpc->contact = field;
    }
    if (parsed->vpc->certuri != NULL ) {
        char* field = pkg_malloc(sizeof (char)*strlen(parsed->vpc->certuri)+1);
        if (field == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(field, parsed->vpc->certuri);
        call_cell_vpc->certuri = field;
    }

    if (parsed-> esqk!= NULL ) {
        call_cell->esqk = pkg_malloc(sizeof (char)*strlen(parsed->esqk)+1);
        if (call_cell->esqk == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(call_cell->esqk, parsed->esqk);
    }

    call_cell->callid = pkg_malloc(sizeof (char)*strlen(parsed->callid)+1);
    if (call_cell->callid == NULL) {
        LM_ERR("--------------------------------------------------no more shm memory\n");
        return -1;
    }
    strcpy(call_cell->callid, parsed->callid);

    if (parsed->esgwri != NULL && strlen(parsed->esgwri) > 0) {

        call_cell->esgwri = pkg_malloc(sizeof (char)*strlen(parsed->esgwri));
        if (call_cell->esgwri == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(call_cell->esgwri, parsed->esgwri);
        call_cell->ert_npa = 0;
        call_cell->ert_resn = 0;
        call_cell->ert_srid = "";

        call_cell->esgw = strstr(call_cell->esgwri, "@");
        call_cell->esgw ++;

    } else {
        if ((parsed->ert->selectiveRoutingID != NULL) && (parsed->ert->routingESN != NULL) && (parsed->ert->npa != NULL)) {
            int npa = atoi(parsed->ert->npa);
            int resn = atoi(parsed->ert->routingESN);
            int srid_len = strlen(parsed->ert->selectiveRoutingID);
            call_cell->ert_npa = npa;
            call_cell->ert_resn = resn;

            call_cell->ert_srid = pkg_malloc(sizeof (char)* srid_len + 1);
            if (call_cell->ert_srid == NULL) {
                LM_ERR("--------------------------------------------------no more shm memory\n");
                return -1;
            }
            strcpy(call_cell->ert_srid, parsed->ert->selectiveRoutingID);
            //call_cell->ert_srid[srid_len] = 0;

            if (proxy_role == 4){

                // get source ip address that send INVITE
                vsp_addr = ip_addr2a(&msg->rcv.src_ip);
                vsp_addr_len = strlen(vsp_addr);

                int esgw_len = strlen(parsed->ert->selectiveRoutingID) + strlen(parsed->ert->routingESN) + strlen(parsed->ert->npa) + vsp_addr_len + 4;
                p = pkg_malloc(sizeof (char)*esgw_len);
                if (p == NULL) {
                    LM_ERR("--------------------------------------------------no more shm memory\n");
                    return -1;
                }

                call_cell->esgwri = p;
                memcpy(p, parsed->ert->selectiveRoutingID, strlen(parsed->ert->selectiveRoutingID));
                p += strlen(parsed->ert->selectiveRoutingID);
                *p = '.';
                p++;
                memcpy(p, parsed->ert->routingESN, strlen(parsed->ert->routingESN));
                p += strlen(parsed->ert->routingESN);
                *p = '.';
                p++;
                memcpy(p, parsed->ert->npa, strlen(parsed->ert->npa));
                p += strlen(parsed->ert->npa);
                *p = '@';
                p++;
                memcpy(p, vsp_addr, vsp_addr_len);
                p += vsp_addr_len;
                *p = 0;

            }else{
                call_cell->esgwri = "";
            }
        }
    }

    if (parsed-> lro!= NULL ) {
        LM_DBG( "LRO %s \n", parsed-> lro);
        int len_lro = strlen(parsed->lro);

        lro_aux = pkg_malloc(sizeof (char)*len_lro + 1);
        if (lro_aux == NULL) {
            LM_ERR("no more pkg memory\n");
            return -1;
        }
        memset(lro_aux, 0, len_lro + 1);
        pt_lro.s = lro_aux;
        pt_lro.len = len_lro;

        pattern_lro.s = "(tel:)*[+]*([-0-9]+)";
        pattern_lro.len = strlen(pattern_lro.s);
        replacement_lro.s = "\\2";
        replacement_lro.len = strlen(replacement_lro.s);

        if (reg_replace(pattern_lro.s, replacement_lro.s, parsed->lro, &pt_lro) != 1) {
            LM_ERR("****** PATTERN LRO NAO OK \n");
            pkg_free(lro_aux);
            return -1;
        }
        pt_lro.len = strlen(pt_lro.s);
        LM_DBG("****** PATTERN LRO OK II %.*s\n",pt_lro.len,pt_lro.s);
        call_cell->lro = pkg_malloc(sizeof (char)*pt_lro.len+1);

        if (call_cell->lro == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }

        memcpy(call_cell->lro, pt_lro.s, pt_lro.len);
        pkg_free(lro_aux);

    }

    if (parsed->datetimestamp != NULL ) {
        call_cell->datetimestamp = pkg_malloc(sizeof (char)*strlen(parsed->datetimestamp)+1);
        if (call_cell->datetimestamp == NULL) {
            LM_ERR("--------------------------------------------------no more shm memory\n");
            return -1;
        }
        strcpy(call_cell->datetimestamp, parsed->datetimestamp);
    }

    call_cell->result = pkg_malloc(sizeof (char)*strlen(parsed->result)+1);
    if (call_cell->result == NULL) {
        LM_ERR("--------------------------------------------------no more shm memory\n");
        return -1;
    }
    strcpy(call_cell->result, parsed->result);

    return 1;
}