opensips/modules/enum/enum.c

changeset 18
8ec65b8f6e2c
parent 12
a3ac912f2857
equal deleted inserted replaced
0:5b240f6a363d 1:8ab4c12f4951
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 */

mercurial