734 |
734 |
735 return do_query(_msg, string, name, service); |
735 return do_query(_msg, string, name, service); |
736 } |
736 } |
737 |
737 |
738 |
738 |
|
739 /* |
|
740 * Call isn_query_2 with module parameter suffix and default service. |
|
741 */ |
|
742 int isn_query_0(struct sip_msg* _msg, char* _str1, char* _str2) |
|
743 { |
|
744 return isn_query_2(_msg, (char *)(&isnsuffix), (char *)(&service)); |
|
745 } |
|
746 |
|
747 |
|
748 /* |
|
749 * Call isn_query_2 with given suffix and default service. |
|
750 */ |
|
751 int isn_query_1(struct sip_msg* _msg, char* _suffix, char* _str2) |
|
752 { |
|
753 return isn_query_2(_msg, _suffix, (char *)(&service)); |
|
754 } |
|
755 |
|
756 |
|
757 /* |
|
758 * See documentation in README file. |
|
759 */ |
|
760 int isn_query_2(struct sip_msg* _msg, char* _suffix, char* _service) |
|
761 { |
|
762 char *user_s = NULL; |
|
763 int user_len, i, j; |
|
764 char name[MAX_DOMAIN_SIZE] = {0}; |
|
765 char string[17] = {0}; |
|
766 char szItad[17] = {0}; |
|
767 size_t nItlen = 0; |
|
768 |
|
769 str *suffix, *service; |
|
770 |
|
771 suffix = (str*)_suffix; |
|
772 service = (str*)_service; |
|
773 |
|
774 if (parse_sip_msg_uri(_msg) < 0) { |
|
775 LM_ERR("Parsing of R-URI failed\n"); |
|
776 return -1; |
|
777 } |
|
778 |
|
779 user_s = _msg->parsed_uri.user.s; |
|
780 user_len = _msg->parsed_uri.user.len; |
|
781 |
|
782 memcpy(&(string[0]), user_s, user_len); |
|
783 string[user_len] = (char)0; |
|
784 |
|
785 /* Do primitive test for correct ISN format, */ |
|
786 /* and set szItad to the ISN ITAD (RFC 3872/2871). */ |
|
787 /* Correct ISN format guessed from freenum.org and IANA */ |
|
788 /* doc http://www.iana.org/assignments/trip-parameters/ */ |
|
789 { |
|
790 char *pAster = strchr(string, '*'); |
|
791 if (pAster && (nItlen = strspn(pAster + sizeof(char), "0123456789"))) |
|
792 strncpy(szItad, pAster + sizeof(char), nItlen); |
|
793 else { |
|
794 LM_ERR("R-URI user does not contain a valid ISN\n"); |
|
795 return -1; |
|
796 } |
|
797 } |
|
798 |
|
799 /* Ammend the original ENUM E.164 string logic to process */ |
|
800 /* ISN numbers instead, which include a nonreversed ITAD. */ |
|
801 i = user_len - nItlen - sizeof(char); /* Ex: *1212 */ |
|
802 j = 0; |
|
803 while (i--) { |
|
804 name[j] = user_s[i]; |
|
805 name[j + 1] = '.'; |
|
806 j = j + 2; |
|
807 } |
|
808 |
|
809 strcat(name + j, szItad); /* Copy the unreversed ITAD, */ |
|
810 name[j + nItlen] = '.'; /* and append a trailing dot. */ |
|
811 memcpy(name + j + nItlen + sizeof(char), suffix->s, suffix->len + 1); |
|
812 |
|
813 return do_query(_msg, string, name, service); |
|
814 } |
|
815 |
|
816 |
739 /*********** INFRASTRUCTURE ENUM ***************/ |
817 /*********** INFRASTRUCTURE ENUM ***************/ |
740 |
818 |
741 /* |
819 /* |
742 * Call enum_query_2 with default suffix and service. |
820 * Call enum_query_2 with default suffix and service. |
743 */ |
821 */ |