opensips/modules/enum/enum.c

changeset 13
b63f281afe6b
parent 12
a3ac912f2857
     1.1 --- a/opensips/modules/enum/enum.c	Mon Jan 18 19:47:23 2010 +0100
     1.2 +++ b/opensips/modules/enum/enum.c	Mon Jan 18 19:59:51 2010 +0100
     1.3 @@ -736,6 +736,84 @@
     1.4  }
     1.5  
     1.6  
     1.7 +/*
     1.8 + * Call isn_query_2 with module parameter suffix and default service.
     1.9 + */
    1.10 +int isn_query_0(struct sip_msg* _msg, char* _str1, char* _str2)
    1.11 +{
    1.12 +	return isn_query_2(_msg, (char *)(&isnsuffix), (char *)(&service));
    1.13 +}
    1.14 +
    1.15 +
    1.16 +/*
    1.17 + * Call isn_query_2 with given suffix and default service.
    1.18 + */
    1.19 +int isn_query_1(struct sip_msg* _msg, char* _suffix, char* _str2)
    1.20 +{
    1.21 +	return isn_query_2(_msg, _suffix, (char *)(&service));
    1.22 +}
    1.23 +
    1.24 +
    1.25 +/*
    1.26 + * See documentation in README file.
    1.27 + */
    1.28 +int isn_query_2(struct sip_msg* _msg, char* _suffix, char* _service)
    1.29 +{
    1.30 +	char *user_s = NULL;
    1.31 +	int user_len, i, j;
    1.32 +	char name[MAX_DOMAIN_SIZE] = {0};
    1.33 +	char string[17] = {0};
    1.34 +	char szItad[17] = {0};
    1.35 +	size_t nItlen = 0;
    1.36 +
    1.37 +	str *suffix, *service;
    1.38 +
    1.39 +	suffix = (str*)_suffix;
    1.40 +	service = (str*)_service;
    1.41 +
    1.42 +	if (parse_sip_msg_uri(_msg) < 0) {
    1.43 +		LM_ERR("Parsing of R-URI failed\n");
    1.44 +		return -1;
    1.45 +	}
    1.46 +
    1.47 +	user_s = _msg->parsed_uri.user.s;
    1.48 +	user_len = _msg->parsed_uri.user.len;
    1.49 +
    1.50 +	memcpy(&(string[0]), user_s, user_len);
    1.51 +	string[user_len] = (char)0;
    1.52 +
    1.53 +	/* Do primitive test for correct ISN format, */
    1.54 +	/* and set szItad to the ISN ITAD (RFC 3872/2871). */
    1.55 +	/* Correct ISN format guessed from freenum.org and IANA */
    1.56 +	/* doc http://www.iana.org/assignments/trip-parameters/ */
    1.57 +	{
    1.58 +		char *pAster = strchr(string, '*');
    1.59 +		if (pAster && (nItlen = strspn(pAster + sizeof(char), "0123456789")))
    1.60 +			strncpy(szItad, pAster + sizeof(char), nItlen);
    1.61 +		else {
    1.62 +			LM_ERR("R-URI user does not contain a valid ISN\n");
    1.63 +			return -1;
    1.64 +		}
    1.65 +	}
    1.66 +
    1.67 +	/* Ammend the original ENUM E.164 string logic to process */
    1.68 +	/* ISN numbers instead, which include a nonreversed ITAD. */
    1.69 +	i = user_len - nItlen - sizeof(char); /* Ex: *1212 */
    1.70 +	j = 0;
    1.71 +	while (i--) {
    1.72 +		name[j] = user_s[i];
    1.73 +		name[j + 1] = '.';
    1.74 +		j = j + 2;
    1.75 +	}
    1.76 +
    1.77 +	strcat(name + j, szItad);  /* Copy the unreversed ITAD, */
    1.78 +	name[j + nItlen] = '.';    /* and append a trailing dot. */
    1.79 +	memcpy(name + j + nItlen + sizeof(char), suffix->s, suffix->len + 1);
    1.80 +
    1.81 +	return do_query(_msg, string, name, service);
    1.82 +}
    1.83 +
    1.84 +
    1.85  /*********** INFRASTRUCTURE ENUM ***************/
    1.86  
    1.87  /*

mercurial