! \brief parses the naptr record into a naptr_rdata structure * \param msg - pointer to the dns message * \param end - pointer to the end of the message * \param rdata - pointer to the rdata part of the naptr answer * \return 0 on error, or a dyn. alloc'ed naptr_rdata structure * * NAPTR rdata format: * 111111 * 0123456789012345 * +----------------+ * | ord
| 867 | * +----------------+ |
| 868 | */ |
| 869 | struct naptr_rdata* dns_naptr_parser( unsigned char* msg, unsigned char* end, |
| 870 | unsigned char* rdata) |
| 871 | { |
| 872 | struct naptr_rdata* naptr; |
| 873 | |
| 874 | naptr = 0; |
| 875 | if ((rdata + 7) >= end) |
| 876 | goto error; |
| 877 | naptr=(struct naptr_rdata*)local_malloc(sizeof(struct naptr_rdata)); |
| 878 | if (naptr == 0){ |
| 879 | LM_ERR("out of pkg memory\n"); |
| 880 | goto error; |
| 881 | } |
| 882 | |
| 883 | memcpy((void*)&naptr->order, rdata, 2); |
| 884 | naptr->order=ntohs(naptr->order); |
| 885 | memcpy((void*)&naptr->pref, rdata + 2, 2); |
| 886 | naptr->pref=ntohs(naptr->pref); |
| 887 | naptr->flags_len = (int)rdata[4]; |
| 888 | if ((rdata + 7 + naptr->flags_len) >= end) |
| 889 | goto error; |
| 890 | memcpy((void*)&naptr->flags, rdata + 5, naptr->flags_len); |
| 891 | naptr->services_len = (int)rdata[5 + naptr->flags_len]; |
| 892 | if ((rdata + 7 + naptr->flags_len + naptr->services_len) >= end) goto error; |
| 893 | memcpy((void*)&naptr->services, rdata + 6 + naptr->flags_len, naptr->services_len); |
| 894 | naptr->regexp_len = (int)rdata[6 + naptr->flags_len + naptr->services_len]; |
| 895 | if ((rdata + 7 + naptr->flags_len + naptr->services_len + naptr->regexp_len) >= end) |
| 896 | goto error; |
| 897 | memcpy((void*)&naptr->regexp, rdata + 7 + naptr->flags_len + |
| 898 | naptr->services_len, naptr->regexp_len); |
| 899 | rdata = rdata + 7 + naptr->flags_len + naptr->services_len + naptr->regexp_len; |
| 900 | naptr->repl_len=dn_expand(msg, end, rdata, naptr->repl, MAX_DNS_NAME-1); |
| 901 | if ( naptr->repl_len==(unsigned int)-1 ) |
| 902 | goto error; |
| 903 | /* add terminating 0 ? (warning: len=compressed name len) */ |
| 904 | return naptr; |
| 905 | error: |
| 906 | if (naptr) |
| 907 | local_free(naptr); |
| 908 | return 0; |
| 909 | } |
| 910 | |
| 911 | |
| 912 |