[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