opensips/enum-isn.diff

changeset 13
b63f281afe6b
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/opensips/enum-isn.diff	Mon Jan 18 19:59:51 2010 +0100
     1.3 @@ -0,0 +1,502 @@
     1.4 +Index: modules/enum/enum_mod.h
     1.5 +diff -Nau modules/enum/enum_mod.h.orig modules/enum/enum_mod.h
     1.6 +--- modules/enum/enum_mod.h.orig	2010-01-18 15:54:52.842465412 +0100
     1.7 ++++ modules/enum/enum_mod.h	2010-01-18 15:55:20.812190874 +0100
     1.8 +@@ -41,5 +41,7 @@
     1.9 + extern str i_branchlabel;    /* the label branching off the infrastructure tree */
    1.10 + extern str i_bl_alg;         /* how to know where to branch off */
    1.11 + 
    1.12 ++extern str isnsuffix;        /* str version of isn_suffix */
    1.13 ++
    1.14 + 
    1.15 + #endif /* ENUM_MOD_H */
    1.16 +Index: modules/enum/enum_mod.c
    1.17 +diff -Nau modules/enum/enum_mod.c.orig modules/enum/enum_mod.c
    1.18 +--- modules/enum/enum_mod.c.orig	2010-01-18 15:52:57.316263519 +0100
    1.19 ++++ modules/enum/enum_mod.c	2010-01-18 15:52:42.844229824 +0100
    1.20 +@@ -55,6 +55,8 @@
    1.21 + char* i_enum_suffix = "e164.arpa.";
    1.22 + char* bl_algorithm = "cc";
    1.23 + 
    1.24 ++char* isn_suffix = "freenum.org.";
    1.25 ++
    1.26 + 
    1.27 + /*
    1.28 +  * Internal module variables
    1.29 +@@ -67,6 +69,8 @@
    1.30 + str i_branchlabel;
    1.31 + str i_bl_alg;
    1.32 + 
    1.33 ++str isnsuffix;
    1.34 ++
    1.35 + 
    1.36 + /*
    1.37 +  * Exported functions
    1.38 +@@ -94,6 +98,11 @@
    1.39 + 	 REQUEST_ROUTE},
    1.40 + 	{"i_enum_query", (cmd_function)i_enum_query_2, 2, fixup_str_str, 0,
    1.41 + 	 REQUEST_ROUTE},
    1.42 ++	{"isn_query", (cmd_function)isn_query_0, 0, 0, 0, REQUEST_ROUTE},
    1.43 ++	{"isn_query", (cmd_function)isn_query_1, 1, fixup_str_null,
    1.44 ++	 fixup_free_str_null, REQUEST_ROUTE},
    1.45 ++	{"isn_query", (cmd_function)isn_query_2, 2, fixup_str_str, 
    1.46 ++	 fixup_free_str_str, REQUEST_ROUTE},
    1.47 + 	{0, 0, 0, 0, 0, 0}
    1.48 + };
    1.49 + 
    1.50 +@@ -107,6 +116,7 @@
    1.51 + 	{"branchlabel", STR_PARAM, &branchlabel},
    1.52 + 	{"i_enum_suffix", STR_PARAM, &i_enum_suffix},
    1.53 + 	{"bl_algorithm", STR_PARAM, &bl_algorithm},
    1.54 ++	{"isn_suffix", STR_PARAM, &isn_suffix},
    1.55 + 	{0, 0, 0}
    1.56 + };
    1.57 + 
    1.58 +@@ -152,6 +162,9 @@
    1.59 + 	i_bl_alg.s = bl_algorithm;
    1.60 + 	i_bl_alg.len = strlen(bl_algorithm);
    1.61 + 
    1.62 ++	isnsuffix.s = isn_suffix;
    1.63 ++	isnsuffix.len = strlen(isn_suffix.s);
    1.64 ++
    1.65 + 	return 0;
    1.66 + }
    1.67 + 
    1.68 +Index: modules/enum/enum.h
    1.69 +diff -Nau modules/enum/enum.h.orig modules/enum/enum.h
    1.70 +--- modules/enum/enum.h.orig	2010-01-18 15:54:40.361624448 +0100
    1.71 ++++ modules/enum/enum.h	2010-01-18 15:54:43.090330399 +0100
    1.72 +@@ -66,5 +66,13 @@
    1.73 + int i_enum_query_1(struct sip_msg* _msg, char* _suffix, char* _str2);
    1.74 + int i_enum_query_2(struct sip_msg* _msg, char* _suffix, char* _service);
    1.75 + 
    1.76 ++/*
    1.77 ++ * Make ISN query and if query succeeds, replace current uri with the
    1.78 ++ * result of the query
    1.79 ++ */
    1.80 ++int isn_query_0(struct sip_msg* _msg, char* _str1, char* _str2);
    1.81 ++int isn_query_1(struct sip_msg* _msg, char* _suffix, char* _str2);
    1.82 ++int isn_query_2(struct sip_msg* _msg, char* _suffix, char* _service);
    1.83 ++
    1.84 + 
    1.85 + #endif /* ENUM_H */
    1.86 +Index: modules/enum/enum.c
    1.87 +diff -Nau modules/enum/enum.c.orig modules/enum/enum.c
    1.88 +--- modules/enum/enum.c.orig	2010-01-18 15:57:10.995902181 +0100
    1.89 ++++ modules/enum/enum.c	2010-01-18 15:46:19.642209178 +0100
    1.90 +@@ -736,6 +736,84 @@
    1.91 + }
    1.92 + 
    1.93 + 
    1.94 ++/*
    1.95 ++ * Call isn_query_2 with module parameter suffix and default service.
    1.96 ++ */
    1.97 ++int isn_query_0(struct sip_msg* _msg, char* _str1, char* _str2)
    1.98 ++{
    1.99 ++	return isn_query_2(_msg, (char *)(&isnsuffix), (char *)(&service));
   1.100 ++}
   1.101 ++
   1.102 ++
   1.103 ++/*
   1.104 ++ * Call isn_query_2 with given suffix and default service.
   1.105 ++ */
   1.106 ++int isn_query_1(struct sip_msg* _msg, char* _suffix, char* _str2)
   1.107 ++{
   1.108 ++	return isn_query_2(_msg, _suffix, (char *)(&service));
   1.109 ++}
   1.110 ++
   1.111 ++
   1.112 ++/*
   1.113 ++ * See documentation in README file.
   1.114 ++ */
   1.115 ++int isn_query_2(struct sip_msg* _msg, char* _suffix, char* _service)
   1.116 ++{
   1.117 ++	char *user_s = NULL;
   1.118 ++	int user_len, i, j;
   1.119 ++	char name[MAX_DOMAIN_SIZE] = {0};
   1.120 ++	char string[17] = {0};
   1.121 ++	char szItad[17] = {0};
   1.122 ++	size_t nItlen = 0;
   1.123 ++
   1.124 ++	str *suffix, *service;
   1.125 ++
   1.126 ++	suffix = (str*)_suffix;
   1.127 ++	service = (str*)_service;
   1.128 ++
   1.129 ++	if (parse_sip_msg_uri(_msg) < 0) {
   1.130 ++		LM_ERR("Parsing of R-URI failed\n");
   1.131 ++		return -1;
   1.132 ++	}
   1.133 ++
   1.134 ++	user_s = _msg->parsed_uri.user.s;
   1.135 ++	user_len = _msg->parsed_uri.user.len;
   1.136 ++
   1.137 ++	memcpy(&(string[0]), user_s, user_len);
   1.138 ++	string[user_len] = (char)0;
   1.139 ++
   1.140 ++	/* Do primitive test for correct ISN format, */
   1.141 ++	/* and set szItad to the ISN ITAD (RFC 3872/2871). */
   1.142 ++	/* Correct ISN format guessed from freenum.org and IANA */
   1.143 ++	/* doc http://www.iana.org/assignments/trip-parameters/ */
   1.144 ++	{
   1.145 ++		char *pAster = strchr(string, '*');
   1.146 ++		if (pAster && (nItlen = strspn(pAster + sizeof(char), "0123456789")))
   1.147 ++			strncpy(szItad, pAster + sizeof(char), nItlen);
   1.148 ++		else {
   1.149 ++			LM_ERR("R-URI user does not contain a valid ISN\n");
   1.150 ++			return -1;
   1.151 ++		}
   1.152 ++	}
   1.153 ++
   1.154 ++	/* Ammend the original ENUM E.164 string logic to process */
   1.155 ++	/* ISN numbers instead, which include a nonreversed ITAD. */
   1.156 ++	i = user_len - nItlen - sizeof(char); /* Ex: *1212 */
   1.157 ++	j = 0;
   1.158 ++	while (i--) {
   1.159 ++		name[j] = user_s[i];
   1.160 ++		name[j + 1] = '.';
   1.161 ++		j = j + 2;
   1.162 ++	}
   1.163 ++
   1.164 ++	strcat(name + j, szItad);  /* Copy the unreversed ITAD, */
   1.165 ++	name[j + nItlen] = '.';    /* and append a trailing dot. */
   1.166 ++	memcpy(name + j + nItlen + sizeof(char), suffix->s, suffix->len + 1);
   1.167 ++
   1.168 ++	return do_query(_msg, string, name, service);
   1.169 ++}
   1.170 ++
   1.171 ++
   1.172 + /*********** INFRASTRUCTURE ENUM ***************/
   1.173 + 
   1.174 + /*
   1.175 +Index: modules/enum/README
   1.176 +diff -Nau modules/enum/README.orig modules/enum/README
   1.177 +--- modules/enum/README.orig	2010-01-18 17:59:52.034172367 +0100
   1.178 ++++ modules/enum/README	2010-01-18 18:01:30.730633377 +0100
   1.179 +@@ -10,8 +10,8 @@
   1.180 + 
   1.181 +    Copyright © 2002, 2003 Juha Heinanen
   1.182 +    Revision History
   1.183 +-   Revision $Revision: 5906 $ $Date: 2009-07-21 10:45:05 +0300
   1.184 +-                              (Tue, 21 Jul 2009) $
   1.185 ++   Revision $Revision: 5907 $ $Date: 2010-01-18 10:45:05 +0100
   1.186 ++                              (Mon, 18 Jan 2010) $
   1.187 +      __________________________________________________________
   1.188 + 
   1.189 +    Table of Contents
   1.190 +@@ -25,28 +25,32 @@
   1.191 +               1.3.1. domain_suffix (string)
   1.192 +               1.3.2. tel_uri_params (string)
   1.193 +               1.3.3. i_enum_suffix (string)
   1.194 +-              1.3.4. branchlabel (string)
   1.195 +-              1.3.5. bl_algorithm (string)
   1.196 ++              1.3.4. isn_suffix (string)
   1.197 ++              1.3.5. branchlabel (string)
   1.198 ++              1.3.6. bl_algorithm (string)
   1.199 + 
   1.200 +         1.4. Exported Functions
   1.201 + 
   1.202 +               1.4.1. enum_query(["suffix"[,"service"]])
   1.203 +               1.4.2. enum_pv_query("pvar"[,"suffix"[,"service"]])
   1.204 +               1.4.3. i_enum_query(["suffix"[,"service"]])
   1.205 +-              1.4.4. is_from_user_enum()
   1.206 ++              1.4.4. isn_query(["suffix"[,"service"]])
   1.207 ++              1.4.5. is_from_user_enum()
   1.208 + 
   1.209 +    List of Examples
   1.210 + 
   1.211 +    1.1. Setting domain_suffix module parameter
   1.212 +    1.2. Setting tel_uri_params module parameter
   1.213 +    1.3. Setting i_enum_suffix module parameter
   1.214 +-   1.4. Setting brachlabel module parameter
   1.215 +-   1.5. Zone file example
   1.216 ++   1.4. Setting isn_query usage module parameter
   1.217 ++   1.5. Setting branchlabel module parameter
   1.218 +    1.6. Zone file example
   1.219 +-   1.7. Setting the bl_algorithm module parameter
   1.220 +-   1.8. enum_query usage
   1.221 +-   1.9. enum_pv_query usage
   1.222 +-   1.10. is_from_user_enum usage
   1.223 ++   1.7. Zone file example
   1.224 ++   1.8. Setting the bl_algorithm module parameter
   1.225 ++   1.9. enum_query usage
   1.226 ++   1.10. enum_pv_query usage
   1.227 ++   1.11. isn_query usage
   1.228 ++   1.12. is_from_user_enum usage
   1.229 + 
   1.230 + Chapter 1. Admin Guide
   1.231 + 
   1.232 +@@ -113,6 +117,22 @@
   1.233 +    function does an enum lookup on the from user and returns true
   1.234 +    if found, false otherwise.
   1.235 + 
   1.236 ++   In addition to standard ENUM, support for ISN (ITAD Subscriber
   1.237 ++   Numbers) is provided as well. To allow ISN lookups to resolve,
   1.238 ++   a different formatting algorithm is expected by the DNS server.
   1.239 ++   Whereas a ENUM NAPTR record expects a DNS query of the form
   1.240 ++   9.8.7.6.5.4.3.2.1.<suffix>, ISN method expects a DNS query of
   1.241 ++   the form 6.5.1212.<suffix>. That is, a valid ISN number includes
   1.242 ++   a prefix of '56' in the example. The rest of the number is a
   1.243 ++   ITAD (Internet Telephony Administrative Domain) as defined
   1.244 ++   in RFCs 3872 and 2871, and as allocated by the IANA in
   1.245 ++   http://www.iana.org/assignments/trip-parameters. The ITAD is
   1.246 ++   left intact and not refersed as ENUM requires. To learn more
   1.247 ++   about ISN please refer to documents at www.freenum.org.
   1.248 ++
   1.249 ++   To complete a ISN lookup on the user part of the Request-URI,
   1.250 ++   isn_query() is used instead of enum_query().
   1.251 ++
   1.252 + 1.2. Dependencies
   1.253 + 
   1.254 +    The module depends on the following modules (in the other words
   1.255 +@@ -158,17 +178,27 @@
   1.256 +    Example 1.3. Setting i_enum_suffix module parameter
   1.257 + modparam("enum", "i_enum_suffix", "e1234.arpa.")
   1.258 + 
   1.259 +-1.3.4. branchlabel (string)
   1.260 ++1.3.4. isn_suffix (string)
   1.261 ++
   1.262 ++   The domain suffix to be used for isn_query() lookups. Can be
   1.263 ++   overridden by a parameter to isn_query.
   1.264 ++
   1.265 ++   Default value is "freenum.org."
   1.266 ++
   1.267 ++   Example 1.4. Setting isn_suffix module parameter
   1.268 ++modparam("enum", "isn_suffix", "freenum.org.")
   1.269 ++
   1.270 ++1.3.5. branchlabel (string)
   1.271 + 
   1.272 +    This parameter determines which label i_enum_query() will use
   1.273 +    to branch off to the infrastructure ENUM tree.
   1.274 + 
   1.275 +    Default value is ""i""
   1.276 + 
   1.277 +-   Example 1.4. Setting brachlabel module parameter
   1.278 ++   Example 1.5. Setting branchlabel module parameter
   1.279 + modparam("enum", "branchlabel", "i")
   1.280 + 
   1.281 +-1.3.5. bl_algorithm (string)
   1.282 ++1.3.6. bl_algorithm (string)
   1.283 + 
   1.284 +    This parameter determines which algorithm i_enum_query() will
   1.285 +    use to select the position in the DNS tree where the
   1.286 +@@ -182,7 +212,7 @@
   1.287 +    [branchlabel].[reverse-country-code].[i_enum_suffix] to
   1.288 +    indicate after how many digits the label should in inserted.
   1.289 + 
   1.290 +-   Example 1.5. Zone file example
   1.291 ++   Example 1.6. Zone file example
   1.292 + i.1.e164.arpa.                     IN TXT   "4"
   1.293 + 9.9.9.8.7.6.5.i.4.3.2.1.e164.arpa. IN NAPTR "NAPTR content for  +1 234 5
   1.294 + 678 999"
   1.295 +@@ -196,7 +226,7 @@
   1.296 +    allocated yet. This version of the code uses 65300. See
   1.297 +    resolve.h.
   1.298 + 
   1.299 +-   Example 1.6. Zone file example
   1.300 ++   Example 1.7. Zone file example
   1.301 + i.1.e164.arpa.     TYPE65300  \# 14 (
   1.302 +                               04    ; position
   1.303 +                               01 69 ; separator
   1.304 +@@ -208,7 +238,7 @@
   1.305 + 
   1.306 +    Default value is "cc"
   1.307 + 
   1.308 +-   Example 1.7. Setting the bl_algorithm module parameter
   1.309 ++   Example 1.8. Setting the bl_algorithm module parameter
   1.310 + modparam("enum", "bl_algorithm", "txt")
   1.311 + 
   1.312 + 1.4. Exported Functions
   1.313 +@@ -225,7 +255,7 @@
   1.314 + 
   1.315 +    This function can be used from REQUEST_ROUTE.
   1.316 + 
   1.317 +-   Example 1.8. enum_query usage
   1.318 ++   Example 1.9. enum_query usage
   1.319 + ...
   1.320 + # search for "e2u+sip" in freenum.org
   1.321 + enum_query("freenum.org.");
   1.322 +@@ -262,7 +292,7 @@
   1.323 + 
   1.324 +    This function can be used from REQUEST_ROUTE.
   1.325 + 
   1.326 +-   Example 1.9. enum_pv_query usage
   1.327 ++   Example 1.10. enum_pv_query usage
   1.328 + ...
   1.329 + # search for "e2u+sip" in freenum.org
   1.330 + enum_pv_query("$avp(i:100)", "freenum.org.");
   1.331 +@@ -296,14 +326,42 @@
   1.332 +    ftp://ftp.rfc-editor.org/in-notes/internet-drafts/draft-haberle
   1.333 +    r-carrier-enum-01.txt for the rationale behind this function.
   1.334 + 
   1.335 +-1.4.4. is_from_user_enum()
   1.336 ++1.4.4.  isn_query(["suffix"[,"service"]])
   1.337 ++
   1.338 ++   The function performs a ISN query and rewrites the
   1.339 ++   Request-URI with the result of the query. See Section 1.1,
   1.340 ++   "Overview" for more information.
   1.341 ++
   1.342 ++   Meaning of the parameters is as follows:
   1.343 ++     * suffix - Suffix to be appended to the domain name.
   1.344 ++     * service - Service string to be used in the service field.
   1.345 ++
   1.346 ++   This function can be used from REQUEST_ROUTE.
   1.347 ++
   1.348 ++   See ftp://www.ietf.org/rfc/rfc3872.txt and
   1.349 ++   ftp://www.ietf.org/rfc/rfc2871.txt for information
   1.350 ++   regarding the ITAD part of the ISN string.
   1.351 ++
   1.352 ++   Example 1.11. isn_query usage
   1.353 ++...
   1.354 ++# search for "e2u+sip" in freenum.org
   1.355 ++isn_query("freenum.org.");
   1.356 ++...
   1.357 ++# search for "e2u+sip" in default tree (configured as parameter)
   1.358 ++enum_query();
   1.359 ++...
   1.360 ++# search for "e2u+voice:sip" in freenum.org
   1.361 ++enum_query("freenum.org.","voice");
   1.362 ++...
   1.363 ++
   1.364 ++1.4.5. is_from_user_enum()
   1.365 + 
   1.366 +    Checks if the user part of from URI is found in an enum lookup.
   1.367 +    Returns 1 if yes and -1 if not.
   1.368 + 
   1.369 +    This function can be used from REQUEST_ROUTE.
   1.370 + 
   1.371 +-   Example 1.10. is_from_user_enum usage
   1.372 ++   Example 1.12. is_from_user_enum usage
   1.373 + ...
   1.374 + if (is_from_user_enum()) {
   1.375 +         ....
   1.376 +Index: modules/enum/doc/enum.xml
   1.377 +diff -Nau modules/enum/doc/enum.xml.orig modules/enum/doc/enum.xml
   1.378 +--- modules/enum/doc/enum.xml.orig	2009-10-16 02:31:52.000000000 +0200
   1.379 ++++ modules/enum/doc/enum.xml	2010-01-18 18:01:15.954172402 +0100
   1.380 +@@ -33,8 +33,8 @@
   1.381 + 	</copyright>
   1.382 + 	<revhistory>
   1.383 + 	    <revision>
   1.384 +-		<revnumber>$Revision: 5901 $</revnumber>
   1.385 +-		<date>$Date: 2009-07-21 10:45:05 +0300 (Tue, 21 Jul 2009) $</date>
   1.386 ++		<revnumber>$Revision: 5907 $</revnumber>
   1.387 ++		<date>$Date: 2010-01-18 10:45:05 +0100 (Mon, 18 Jan 2010) $</date>
   1.388 + 	    </revision>
   1.389 + 	</revhistory>
   1.390 +     </bookinfo>
   1.391 +Index: modules/enum/doc/enum_admin.xml
   1.392 +diff -Nau modules/enum/doc/enum_admin.xml.orig modules/enum/doc/enum_admin.xml
   1.393 +--- modules/enum/doc/enum_admin.xml.orig	2010-01-18 12:33:30.053644000 +0100
   1.394 ++++ modules/enum/doc/enum_admin.xml	2010-01-18 18:14:59.583157910 +0100
   1.395 +@@ -75,6 +75,24 @@
   1.396 + 		and -1 if not.
   1.397 + 	</para>
   1.398 + 	<para>
   1.399 ++		In addition to standard ENUM, support for ISN (ITAD Subscriber
   1.400 ++		Numbers) is provided as well. To allow ISN lookups to resolve,
   1.401 ++		a different formatting algorithm is expected by the DNS server.
   1.402 ++		Whereas a ENUM NAPTR record expects a DNS query of the form
   1.403 ++		9.8.7.6.5.4.3.2.1.<suffix>, ISN method expects a DNS query of
   1.404 ++		the form 6.5.1212.<suffix>. That is, a valid ISN number includes
   1.405 ++		a prefix of '56' in the example. The rest of the number is a
   1.406 ++		ITAD (Internet Telephony Administrative Domain) as defined
   1.407 ++		in RFCs 3872 and 2871, and as allocated by the IANA in
   1.408 ++		http://www.iana.org/assignments/trip-parameters. The ITAD is
   1.409 ++		left intact and not refersed as ENUM requires. To learn more
   1.410 ++		about ISN please refer to documents at www.freenum.org.
   1.411 ++	</para>
   1.412 ++	<para>
   1.413 ++		To complete a ISN lookup on the user part of the Request-URI,
   1.414 ++		isn_query() is used instead of enum_query().
   1.415 ++	</para>
   1.416 ++	<para>
   1.417 + 		Enum module also implements is_from_user_enum function.
   1.418 + 		This function does an enum lookup on the from user and
   1.419 + 		returns true if found, false otherwise.
   1.420 +@@ -153,6 +171,22 @@
   1.421 +                 </example>
   1.422 +         </section>
   1.423 +         <section>
   1.424 ++                <title><varname>isn_suffix</varname> (string)</title>
   1.425 ++                <para>
   1.426 ++                The domain suffix to be used for isn_query() lookups. Can
   1.427 ++                be overridden by a parameter to isn_query.
   1.428 ++                </para>
   1.429 ++                <para>
   1.430 ++                Default value is <quote>freenum.org.</quote>
   1.431 ++                </para>
   1.432 ++                <example>
   1.433 ++                <title>Setting isn_suffix module parameter</title>
   1.434 ++                <programlisting format="linespecific">
   1.435 ++modparam("enum", "isn_suffix", "freenum.org.")
   1.436 ++</programlisting>
   1.437 ++                </example>
   1.438 ++        </section>
   1.439 ++        <section>
   1.440 +                 <title><varname>branchlabel</varname> (string)</title>
   1.441 +                 <para>
   1.442 +                 This parameter determines which label i_enum_query() will use
   1.443 +@@ -162,7 +196,7 @@
   1.444 +                 Default value is <quote>"i"</quote>
   1.445 +                 </para>
   1.446 +                 <example>
   1.447 +-                <title>Setting brachlabel module parameter</title>
   1.448 ++                <title>Setting branchlabel module parameter</title>
   1.449 +                 <programlisting format="linespecific">
   1.450 + modparam("enum", "branchlabel", "i")
   1.451 + </programlisting>
   1.452 +@@ -353,6 +387,53 @@
   1.453 +         </section>
   1.454 + 
   1.455 + 	<section>
   1.456 ++		<title>
   1.457 ++		<function moreinfo="none">isn_query(["suffix"[,"service"]])</function>
   1.458 ++		</title>
   1.459 ++		<para>
   1.460 ++		The function performs a ISN query and rewrites the Request-URI with 
   1.461 ++		the result of the query. See <xref linkend="sec-overview"/> for more 
   1.462 ++		information.
   1.463 ++		</para>
   1.464 ++		<para>Meaning of the parameters is as follows:</para>
   1.465 ++		<itemizedlist>
   1.466 ++		<listitem>
   1.467 ++			<para><emphasis>suffix</emphasis> - Suffix to be appended to the 
   1.468 ++			domain name.
   1.469 ++			</para>
   1.470 ++		</listitem>
   1.471 ++		<listitem>
   1.472 ++			<para><emphasis>service</emphasis> - Service string to be used in 
   1.473 ++			the service field.
   1.474 ++			</para>
   1.475 ++		</listitem>
   1.476 ++		</itemizedlist>
   1.477 ++		<para>
   1.478 ++			This function can be used from REQUEST_ROUTE.
   1.479 ++		</para>
   1.480 ++		<para>
   1.481 ++			See ftp://www.ietf.org/rfc/rfc3872.txt and
   1.482 ++			ftp://www.ietf.org/rfc/rfc2871.txt for information
   1.483 ++			regarding the ITAD part of the ISN string.
   1.484 ++		</para>
   1.485 ++		<example>
   1.486 ++		<title><function moreinfo="none">isn_query</function> usage</title>
   1.487 ++		<programlisting format="linespecific">
   1.488 ++...
   1.489 ++# search for "e2u+sip" in freenum.org 
   1.490 ++isn_query("freenum.org.");
   1.491 ++...
   1.492 ++# search for "e2u+sip" in default tree (configured as parameter)
   1.493 ++isn_query();
   1.494 ++...
   1.495 ++# search for "e2u+voice:sip" in freenum.org
   1.496 ++isn_query("freenum.org.","voice");
   1.497 ++...
   1.498 ++</programlisting>
   1.499 ++		</example>
   1.500 ++	</section>
   1.501 ++
   1.502 ++	<section>
   1.503 + 		<title><function moreinfo="none">is_from_user_enum()</function></title>
   1.504 + 		<para>
   1.505 + 		Checks if the user part of from <abbrev>URI</abbrev>

mercurial