[asterisk-commits] file: branch 1.2 r38501 - /branches/1.2/channels/chan_sip.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sat Jul 29 16:18:01 MST 2006


Author: file
Date: Sat Jul 29 18:18:00 2006
New Revision: 38501

URL: http://svn.digium.com/view/asterisk?rev=38501&view=rev
Log:
How many attempts does it take to make a SIP URI parser that works well? I'm up to 5 personally. On to the good stuff - parse the domain first, user second, and get rid of port & options/params last. (issue #7616 reported by andrew)

Modified:
    branches/1.2/channels/chan_sip.c

Modified: branches/1.2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/chan_sip.c?rev=38501&r1=38500&r2=38501&view=diff
==============================================================================
--- branches/1.2/channels/chan_sip.c (original)
+++ branches/1.2/channels/chan_sip.c Sat Jul 29 18:18:00 2006
@@ -6633,7 +6633,7 @@
 /*! \brief  get_destination: Find out who the call is for --*/
 static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
 {
-	char tmp[256] = "", *uri, *a, *b;
+	char tmp[256] = "", *uri, *a, *user, *domain, *opts;
 	char tmpf[256], *from;
 	struct sip_request *req;
 	char *colon;
@@ -6668,26 +6668,27 @@
 		ast_uri_decode(from);
 	}
 
-	/* Skip any options */
-	if ((a = strchr(uri, ';'))) {
-		*a++ = '\0';
-		b = a;
+	/* Get the target domain first and user */
+	if ((domain = strchr(uri, '@'))) {
+		*domain++ = '\0';
+		user = uri;
 	} else {
-		b = uri;
-	}
-	
-	/* Get the target domain */
-	if ((a = strchr(b, '@'))) {
-		*a++ = '\0';
-	} else {	/* No username part */
-		a = b;
-		uri = "s";	/* Set extension to "s" */
-	}
-	colon = strchr(a, ':'); /* Remove :port */
-	if (colon)
+		/* No user portion present */
+		domain = uri;
+		user = "s";
+	}
+
+	/* Strip port from domain if present */
+	if ((colon = strchr(domain, ':'))) {
 		*colon = '\0';
-
-	ast_copy_string(p->domain, a, sizeof(p->domain));
+	}
+
+	/* Strip any params or options from user */
+	if ((opts = strchr(user, ';'))) {
+		*opts = '\0';
+	}
+
+	ast_copy_string(p->domain, domain, sizeof(p->domain));
 
 	if (!AST_LIST_EMPTY(&domain_list)) {
 		char domain_context[AST_MAX_EXTENSION];
@@ -6714,19 +6715,19 @@
 			ast_copy_string(p->fromdomain, from, sizeof(p->fromdomain));
 	}
 	if (sip_debug_test_pvt(p))
-		ast_verbose("Looking for %s in %s (domain %s)\n", uri, p->context, p->domain);
+		ast_verbose("Looking for %s in %s (domain %s)\n", user, p->context, p->domain);
 
 	/* Return 0 if we have a matching extension */
-	if (ast_exists_extension(NULL, p->context, uri, 1, from) ||
+	if (ast_exists_extension(NULL, p->context, user, 1, from) ||
 		!strcmp(uri, ast_pickup_ext())) {
 		if (!oreq)
-			ast_copy_string(p->exten, uri, sizeof(p->exten));
+			ast_copy_string(p->exten, user, sizeof(p->exten));
 		return 0;
 	}
 
 	/* Return 1 for overlap dialling support */
-	if (ast_canmatch_extension(NULL, p->context, uri, 1, from) ||
-	    !strncmp(uri, ast_pickup_ext(),strlen(uri))) {
+	if (ast_canmatch_extension(NULL, p->context, user, 1, from) ||
+	    !strncmp(user, ast_pickup_ext(),strlen(user))) {
 		return 1;
 	}
 	



More information about the asterisk-commits mailing list