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 /*