diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-31 03:32:53 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-31 03:32:53 +0000 |
commit | 1457512ec8272b5db7a68e993808695dcea46ef9 (patch) | |
tree | bec8d613a3172c2761e1db3733a30929920ef329 /patches | |
parent | aaf884276be62ca4ba10fa421f0e384c4cb44121 (diff) |
remove patch that no longer applies and is not being updated any longer
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6469 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'patches')
-rwxr-xr-x | patches/bug_3710_sip_refer.patch | 762 |
1 files changed, 0 insertions, 762 deletions
diff --git a/patches/bug_3710_sip_refer.patch b/patches/bug_3710_sip_refer.patch deleted file mode 100755 index 2f942c25c..000000000 --- a/patches/bug_3710_sip_refer.patch +++ /dev/null @@ -1,762 +0,0 @@ -Index: channels/chan_sip.c -=================================================================== -RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v -retrieving revision 1.711 -diff -u -u -r1.711 chan_sip.c ---- channels/chan_sip.c 29 Apr 2005 20:42:48 -0000 1.711 -+++ channels/chan_sip.c 1 May 2005 03:27:31 -0000 -@@ -71,6 +71,7 @@ - - /* #define VOCAL_DATA_HACK */ - -+#define SIP_RETVAL_IGNORE 42 /* shrug */ - #define SIPDUMPER - #define DEFAULT_DEFAULT_EXPIRY 120 - #define DEFAULT_MAX_EXPIRY 3600 -@@ -667,6 +668,7 @@ - static struct sip_user *build_user(const char *name, struct ast_variable *v, int realtime); - static int sip_do_reload(void); - static int expire_register(void *data); -+static int sip_addheader(struct ast_channel *chan, void *data); - static int callevents = 0; - - static struct ast_channel *sip_request(const char *type, int format, void *data, int *cause); -@@ -1247,7 +1249,7 @@ - /* Delete it, it needs to disappear */ - if (peer->call) - sip_destroy(peer->call); -- if(peer->chanvars) { -+ if (peer->chanvars) { - ast_variables_destroy(peer->chanvars); - peer->chanvars = NULL; - } -@@ -1312,7 +1314,7 @@ - !strcasecmp(tmp->value, "user")) { - ast_variables_destroy(var); - return NULL; -- } else if(!newpeername && !strcasecmp(tmp->name, "name")) { -+ } else if (!newpeername && !strcasecmp(tmp->name, "name")) { - newpeername = tmp->value; - } - tmp = tmp->next; -@@ -1322,9 +1324,9 @@ - peer = build_peer(newpeername, var, ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS) ? 0 : 1); - - if (peer) { -- if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) { -+ if (ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) { - ast_copy_flags((&peer->flags_page2),(&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS); -- if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR)) { -+ if (ast_test_flag((&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR)) { - if (peer->expire > -1) { - ast_sched_del(sched, peer->expire); - } -@@ -1374,7 +1376,7 @@ - static void sip_destroy_user(struct sip_user *user) - { - ast_free_ha(user->ha); -- if(user->chanvars) { -+ if (user->chanvars) { - ast_variables_destroy(user->chanvars); - user->chanvars = NULL; - } -@@ -1526,6 +1528,8 @@ - } - } - if (!p && !found) { -+ char *ptr, *hostp; -+ - hostn = peer; - if (port) - portno = atoi(port); -@@ -1542,7 +1546,15 @@ - portno = tportno; - } - } -- hp = ast_gethostbyname(hostn, &ahp); -+ if ((hostp = ast_strdupa(hostn))) { -+ if ((ptr = strchr(hostp, '?'))) { -+ *ptr = '\0'; -+ } -+ } else { -+ hostp = peer; -+ } -+ -+ hp = ast_gethostbyname(hostp, &ahp); - if (hp) { - strncpy(r->tohost, peer, sizeof(r->tohost) - 1); - memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr)); -@@ -1742,7 +1754,7 @@ - free(cp); - } - ast_mutex_destroy(&p->lock); -- if(p->chanvars) { -+ if (p->chanvars) { - ast_variables_destroy(p->chanvars); - p->chanvars = NULL; - } -@@ -2531,7 +2543,7 @@ - if (!p->rtp) { - ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno)); - ast_mutex_destroy(&p->lock); -- if(p->chanvars) { -+ if (p->chanvars) { - ast_variables_destroy(p->chanvars); - p->chanvars = NULL; - } -@@ -3097,7 +3109,7 @@ - if (!strcasecmp(aliases[x].fullname, var)) - shortname = aliases[x].shortname; - } -- if(!ast_strlen_zero(shortname)) { -+ if (!ast_strlen_zero(shortname)) { - snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", shortname, value); - } else { - snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value); -@@ -3714,7 +3726,7 @@ - } - /* Start by sending our preferred codecs */ - for (x = 0 ; x < 32 ; x++) { -- if(!(pref_codec = ast_codec_pref_index(&p->prefs,x))) -+ if (!(pref_codec = ast_codec_pref_index(&p->prefs,x))) - break; - if ((capability & pref_codec) && !(alreadysent & pref_codec)) { - if (debug) -@@ -3861,7 +3873,7 @@ - while( *e && ( *e < 33 ) ) { - e++; - } -- if( !*e ) { -+ if ( !*e ) { - return -1; - } - -@@ -3869,7 +3881,7 @@ - /* We have a response */ - req->rlPart2 = e; - len = strlen( req->rlPart2 ); -- if( len < 2 ) { -+ if ( len < 2 ) { - return -1; - } - e+= len - 1; -@@ -3879,18 +3891,18 @@ - *(++e)= '\0'; - } else { - /* We have a request */ -- if( *e == '<' ) { -+ if ( *e == '<' ) { - e++; -- if( !*e ) { -+ if ( !*e ) { - return -1; - } - } - req->rlPart2 = e; /* URI */ -- if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) { -+ if ( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) { - return -1; - } - while( isspace( *(--e) ) ) {} -- if( *e == '>' ) { -+ if ( *e == '>' ) { - *e = '\0'; - } else { - *(++e)= '\0'; -@@ -4995,7 +5007,7 @@ - - /* Save User agent */ - useragent = get_header(req, "User-Agent"); -- if(useragent && strcasecmp(useragent, p->useragent)) { -+ if (useragent && strcasecmp(useragent, p->useragent)) { - strncpy(p->useragent, useragent, sizeof(p->useragent) - 1); - if (option_verbose > 3) { - ast_verbose(VERBOSE_PREFIX_3 "Saved useragent \"%s\" for peer %s\n",p->useragent,p->name); -@@ -5223,12 +5235,12 @@ - c+= strlen("response="); - if ((*c == '\"')) { - response=++c; -- if((c = strchr(c,'\"'))) -+ if ((c = strchr(c,'\"'))) - *c = '\0'; - - } else { - response=c; -- if((c = strchr(c,','))) -+ if ((c = strchr(c,','))) - *c = '\0'; - } - -@@ -5236,11 +5248,11 @@ - c+= strlen("uri="); - if ((*c == '\"')) { - resp_uri=++c; -- if((c = strchr(c,'\"'))) -+ if ((c = strchr(c,'\"'))) - *c = '\0'; - } else { - resp_uri=c; -- if((c = strchr(c,','))) -+ if ((c = strchr(c,','))) - *c = '\0'; - } - -@@ -5250,7 +5262,7 @@ - c++; - } - snprintf(a1, sizeof(a1), "%s:%s:%s", username, global_realm, secret); -- if(!ast_strlen_zero(resp_uri)) -+ if (!ast_strlen_zero(resp_uri)) - snprintf(a2, sizeof(a2), "%s:%s", sip_methods[sipmethod].text, resp_uri); - else - snprintf(a2, sizeof(a2), "%s:%s", sip_methods[sipmethod].text, uri); -@@ -5484,8 +5496,23 @@ - return 0; - } - -+static int sip_extract_tag(char **in) -+{ -+ char *tag; -+ -+ if ((tag = ast_strcasestr(*in, "tag="))) { -+ char *ptr; -+ tag += 4; -+ if ((ptr = strchr(tag, ';'))) { -+ *ptr = '\0'; -+ } -+ return 0; -+ } -+ return -1; -+} -+ - /*--- get_sip_pvt_byid_locked: Lock interface lock and find matching pvt lock ---*/ --static struct sip_pvt *get_sip_pvt_byid_locked(char *callid) -+static struct sip_pvt *get_sip_pvt_byid_locked(char *callid, struct sip_request *req, char *totag, char *fromtag) - { - struct sip_pvt *sip_pvt_ptr = NULL; - -@@ -5494,8 +5521,38 @@ - sip_pvt_ptr = iflist; - while(sip_pvt_ptr) { - if (!strcmp(sip_pvt_ptr->callid, callid)) { -+ char *real_totag = NULL, *real_fromtag = NULL; -+ int match = 1; -+ - /* Go ahead and lock it (and its owner) before returning */ - ast_mutex_lock(&sip_pvt_ptr->lock); -+ -+ if (req && pedanticsipchecking) { -+ if (totag) { -+ real_totag = ast_strdupa(get_header(req, "To")); -+ if (sip_extract_tag(&real_totag)) { -+ real_totag = NULL; -+ } -+ if (strcmp(real_totag, totag)) { -+ match = 0; -+ } -+ } -+ if (match && fromtag) { -+ real_fromtag = ast_strdupa(get_header(req, "From")); -+ if (sip_extract_tag(&real_fromtag)) { -+ real_fromtag = NULL; -+ } -+ if (strcmp(real_fromtag, fromtag)) { -+ match = 0; -+ } -+ } -+ } -+ -+ if (!match) { -+ ast_mutex_unlock(&sip_pvt_ptr->lock); -+ break; -+ } -+ - if (sip_pvt_ptr->owner) { - while(ast_mutex_trylock(&sip_pvt_ptr->owner->lock)) { - ast_mutex_unlock(&sip_pvt_ptr->lock); -@@ -5532,14 +5589,12 @@ - return replaced; - } - -- -- - /*--- get_refer_info: Call transfer support (new standard) ---*/ - static int get_refer_info(struct sip_pvt *sip_pvt, struct sip_request *outgoing_req) - { - - char *p_refer_to = NULL, *p_referred_by = NULL, *h_refer_to = NULL, *h_referred_by = NULL, *h_contact = NULL; -- char *replace_callid = "", *refer_to = NULL, *referred_by = NULL, *ptr = NULL; -+ char *replace_callid = "", *refer_to = NULL, *referred_by = NULL, *ptr = NULL, *replaces_header=NULL, *refer_uri; - struct sip_request *req = NULL; - struct sip_pvt *sip_pvt_ptr = NULL; - struct ast_channel *chan = NULL, *peer = NULL; -@@ -5550,14 +5605,14 @@ - req = &sip_pvt->initreq; - } - -- if(!( (p_refer_to = get_header(req, "Refer-To")) && (h_refer_to = ast_strdupa(p_refer_to)) )) { -+ if (!( (p_refer_to = get_header(req, "Refer-To")) && (h_refer_to = ast_strdupa(p_refer_to)) )) { - ast_log(LOG_WARNING, "No Refer-To Header That's illegal\n"); - return -1; - } - - refer_to = ditch_braces(h_refer_to); - -- if(!( (p_referred_by = get_header(req, "Referred-By")) && (h_referred_by = ast_strdupa(p_referred_by)) )) { -+ if (!( (p_referred_by = get_header(req, "Referred-By")) && (h_referred_by = ast_strdupa(p_referred_by)) )) { - ast_log(LOG_WARNING, "No Refer-To Header That's illegal\n"); - return -1; - } -@@ -5570,9 +5625,11 @@ - ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", referred_by); - return -1; - } -+ -+ - refer_to += 4; - referred_by += 4; -- -+ refer_uri = ast_strdupa(refer_to); - - if ((ptr = strchr(refer_to, '?'))) { - /* Search for arguemnts */ -@@ -5580,10 +5637,7 @@ - ptr++; - if (!strncasecmp(ptr, "REPLACES=", 9)) { - replace_callid = ast_strdupa(ptr + 9); -- /* someday soon to support invite/replaces properly! -- replaces_header = ast_strdupa(replace_callid); -- -anthm -- */ -+ replaces_header = ast_strdupa(replace_callid); - sip_unescape_uri(replace_callid); - if ((ptr = strchr(replace_callid, '%'))) - *ptr = '\0'; -@@ -5617,19 +5671,50 @@ - strncpy(sip_pvt->referred_by, "", sizeof(sip_pvt->referred_by) - 1); - strncpy(sip_pvt->refer_contact, "", sizeof(sip_pvt->refer_contact) - 1); - sip_pvt->refer_call = NULL; -- if ((sip_pvt_ptr = get_sip_pvt_byid_locked(replace_callid))) { -+ if ((sip_pvt_ptr = get_sip_pvt_byid_locked(replace_callid, req, NULL, NULL))) { - sip_pvt->refer_call = sip_pvt_ptr; - if (sip_pvt->refer_call == sip_pvt) { - ast_log(LOG_NOTICE, "Supervised transfer attempted to transfer into same call id (%s == %s)!\n", replace_callid, sip_pvt->callid); - sip_pvt->refer_call = NULL; -- } else -- return 0; -+ } -+ return 0; - } else { -- ast_log(LOG_NOTICE, "Supervised transfer requested, but unable to find callid '%s'. Both legs must reside on Asterisk box to transfer at this time.\n", replace_callid); -- /* XXX The refer_to could contain a call on an entirely different machine, requiring an -- INVITE with a replaces header -anthm XXX */ -+ /* Don't ask me =0 ?, SIP made do it! */ -+ int cause = 0, res = -1; -+ struct ast_channel *ichan = NULL; - -- -+ transmit_notify_with_sipfrag(sip_pvt, sip_pvt->ocseq); -+ if ((ptr = strchr(refer_uri, ';'))) { -+ *ptr = '\0'; -+ } -+ -+ if ((ichan = sip_request("SIP", sip_pvt->owner ? sip_pvt->owner->readformat : AST_FORMAT_ULAW, refer_uri, &cause))) { -+ struct ast_frame *f; -+ char *rbuf; -+ ast_log(LOG_DEBUG, "Going hunting for a remote INVITE/Replaces at [%s] Wish me luck!\n", refer_uri); -+ if ((rbuf = alloca(strlen(replaces_header) + 10))) { -+ sprintf(rbuf, "Replaces: %s", replaces_header); -+ sip_addheader(ichan, rbuf); -+ sip_call(ichan, refer_uri, 20000); -+ ast_channel_masquerade(sip_pvt->owner, ichan); -+ if ((f = ast_read(ichan))) { -+ ast_log(LOG_DEBUG, "WooHoo! The INVITE/Replaces Worked!\n"); -+ ast_frfree(f); -+ transmit_response(sip_pvt, "202 Accepted", req); -+ res = SIP_RETVAL_IGNORE; /* means do nothing more */ -+ } else { -+ res = -1; -+ } -+ } else { -+ ast_log(LOG_ERROR,"Memory Error!\n"); -+ res = -1; -+ } -+ -+ ast_hangup(ichan); -+ } else { -+ res = -1; -+ } -+ return res; - } - } else if (ast_exists_extension(NULL, sip_pvt->context, refer_to, 1, NULL) || !strcmp(refer_to, ast_parking_ext())) { - /* This is an unsupervised transfer */ -@@ -5643,7 +5728,7 @@ - strncpy(sip_pvt->refer_contact, h_contact, sizeof(sip_pvt->refer_contact) - 1); - } - sip_pvt->refer_call = NULL; -- if((chan = sip_pvt->owner) && (peer = ast_bridged_channel(sip_pvt->owner))) { -+ if ((chan = sip_pvt->owner) && (peer = ast_bridged_channel(sip_pvt->owner))) { - pbx_builtin_setvar_helper(chan, "BLINDTRANSFER", peer->name); - pbx_builtin_setvar_helper(peer, "BLINDTRANSFER", chan->name); - } -@@ -5818,7 +5903,7 @@ - *end = '\0'; - else - output[0] = '\0'; -- if(strstr(input,"privacy=full") || strstr(input,"privacy=uri")) -+ if (strstr(input,"privacy=full") || strstr(input,"privacy=uri")) - return AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED; - - return 0; -@@ -5851,7 +5936,7 @@ - - rpid = get_header(req, "Remote-Party-ID"); - memset(rpid_num,0,sizeof(rpid_num)); -- if(!ast_strlen_zero(rpid)) -+ if (!ast_strlen_zero(rpid)) - p->callingpres = get_rpid_num(rpid,rpid_num, sizeof(rpid_num)); - - of = ditch_braces(from); -@@ -5887,14 +5972,14 @@ - ast_copy_flags(p, user, SIP_TRUSTRPID | SIP_USECLIENTCODE | SIP_NAT | SIP_PROG_INBAND | SIP_OSPAUTH); - /* copy channel vars */ - for (v = user->chanvars ; v ; v = v->next) { -- if((tmpvar = ast_variable_new(v->name, v->value))) { -+ if ((tmpvar = ast_variable_new(v->name, v->value))) { - tmpvar->next = p->chanvars; - p->chanvars = tmpvar; - } - } - p->prefs = user->prefs; - /* replace callerid if rpid found, and not restricted */ -- if(!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) { -+ if (!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) { - if (*calleridname) - strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1); - strncpy(p->cid_num, rpid_num, sizeof(p->cid_num) - 1); -@@ -5966,7 +6051,7 @@ - /* Take the peer */ - ast_copy_flags(p, peer, SIP_TRUSTRPID | SIP_USECLIENTCODE | SIP_NAT | SIP_PROG_INBAND | SIP_OSPAUTH); - /* replace callerid if rpid found, and not restricted */ -- if(!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) { -+ if (!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) { - if (*calleridname) - strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1); - strncpy(p->cid_num, rpid_num, sizeof(p->cid_num) - 1); -@@ -5999,7 +6084,7 @@ - strncpy(p->authname, peer->name, sizeof(p->authname) - 1); - /* copy channel vars */ - for (v = peer->chanvars ; v ; v = v->next) { -- if((tmpvar = ast_variable_new(v->name, v->value))) { -+ if ((tmpvar = ast_variable_new(v->name, v->value))) { - tmpvar->next = p->chanvars; - p->chanvars = tmpvar; - } -@@ -6737,10 +6822,10 @@ - pref = &peer->prefs; - for(x = 0; x < 32 ; x++) { - codec = ast_codec_pref_index(pref,x); -- if(!codec) -+ if (!codec) - break; - ast_cli(fd, "%s", ast_getformatname(codec)); -- if(x < 31 && ast_codec_pref_index(pref,x+1)) -+ if (x < 31 && ast_codec_pref_index(pref,x+1)) - ast_cli(fd, "|"); - } - -@@ -6820,10 +6905,10 @@ - pref = &peer->prefs; - for(x = 0; x < 32 ; x++) { - codec = ast_codec_pref_index(pref,x); -- if(!codec) -+ if (!codec) - break; - ast_cli(fd, "%s", ast_getformatname(codec)); -- if(x < 31 && ast_codec_pref_index(pref,x+1)) -+ if (x < 31 && ast_codec_pref_index(pref,x+1)) - ast_cli(fd, ","); - } - -@@ -6896,10 +6981,10 @@ - pref = &user->prefs; - for(x = 0; x < 32 ; x++) { - codec = ast_codec_pref_index(pref,x); -- if(!codec) -+ if (!codec) - break; - ast_cli(fd, "%s", ast_getformatname(codec)); -- if(x < 31 && ast_codec_pref_index(pref,x+1)) -+ if (x < 31 && ast_codec_pref_index(pref,x+1)) - ast_cli(fd, "|"); - } - -@@ -7976,12 +8061,12 @@ - } - switch(resp) { - case 100: /* 100 Trying */ -- if(sipmethod == SIP_INVITE) { -+ if (sipmethod == SIP_INVITE) { - sip_cancel_destroy(p); - } - break; - case 183: /* 183 Session Progress */ -- if(sipmethod == SIP_INVITE) { -+ if (sipmethod == SIP_INVITE) { - sip_cancel_destroy(p); - if (!ast_strlen_zero(get_header(req, "Content-Type"))) - process_sdp(p, req); -@@ -7992,7 +8077,7 @@ - } - break; - case 180: /* 180 Ringing */ -- if(sipmethod == SIP_INVITE) { -+ if (sipmethod == SIP_INVITE) { - sip_cancel_destroy(p); - if (p->owner) { - ast_queue_control(p->owner, AST_CONTROL_RINGING); -@@ -8071,8 +8156,8 @@ - for(;;) { - contact = __get_header(req, "Contact", &start); - /* this loop ensures we get a contact header about our register request */ -- if(!ast_strlen_zero(contact)) { -- if( (tmptmp=strstr(contact, p->our_contact))) { -+ if (!ast_strlen_zero(contact)) { -+ if ( (tmptmp=strstr(contact, p->our_contact))) { - contact=tmptmp; - break; - } -@@ -8146,7 +8231,7 @@ - transmit_request(p, SIP_ACK, seqno, 0, 0); - /* Then we AUTH */ - /* But only if the packet wasn't marked as ignore in handle_request */ -- if(!ignore){ -+ if (!ignore){ - p->theirtag[0]='\0'; /* forget their old tag, so we don't match tags when getting response */ - if ((p->authtries > 1) || do_proxy_auth(p, req, "Proxy-Authenticate", "Proxy-Authorization", SIP_INVITE, 1)) { - ast_log(LOG_NOTICE, "Failed to authenticate on INVITE to '%s'\n", get_header(&p->initreq, "From")); -@@ -8419,18 +8504,19 @@ - - if (peera->cdr && peerb->cdr) { - peerb->cdr = ast_cdr_append(peerb->cdr, peera->cdr); -- } else if(peera->cdr) { -+ } else if (peera->cdr) { - peerb->cdr = peera->cdr; - } - peera->cdr = NULL; - - if (peerb->cdr && peerc->cdr) { - peerb->cdr = ast_cdr_append(peerb->cdr, peerc->cdr); -- } else if(peerc->cdr) { -+ } else if (peerc->cdr) { - peerb->cdr = peerc->cdr; - } - peerc->cdr = NULL; - -+ ast_log(LOG_DEBUG, "XXXX Trying to masquerade %s and %s\n", peerb->name, peerc->name); - if (ast_channel_masquerade(peerb, peerc)) { - ast_log(LOG_WARNING, "Failed to masquerade %s into %s\n", peerb->name, peerc->name); - res = -1; -@@ -8478,7 +8564,24 @@ - struct ast_channel *c=NULL; - int gotdest; - struct ast_frame af = { AST_FRAME_NULL, }; -+ char *p_replaces, *replace_id = NULL; - -+ if ((p_replaces = get_header(req, "Replaces"))) { -+ if (ast_strlen_zero(p_replaces)) { -+ p_replaces = NULL; -+ } else { -+ char *ptr; -+ ast_log(LOG_DEBUG, "I SEE a Replaces [%s]\n", p_replaces); -+ replace_id = ast_strdupa(p_replaces); -+ if (strchr(replace_id, '%')) { -+ sip_unescape_uri(replace_id); -+ } -+ if ((ptr = strchr(replace_id, ';'))) { -+ *ptr = '\0'; -+ } -+ } -+ } -+ - if (ast_test_flag(p, SIP_OUTGOING) && p->owner && (p->owner->_state != AST_STATE_UP)) { - /* This is a call to ourself. Send ourselves an error code and stop - processing immediately, as SIP really has no good mechanism for -@@ -8487,6 +8590,7 @@ - /* We do NOT destroy p here, so that our response will be accepted */ - return 0; - } -+ - if (!ignore) { - /* Use this as the basis */ - if (debug) -@@ -8511,8 +8615,10 @@ - ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n"); - } - } -- } else if (debug) -+ } else if (debug) { - ast_verbose("Ignoring this request\n"); -+ } -+ - if (!p->lastinvite && !ignore && !p->owner) { - /* Handle authentication if this is our first invite */ - res = check_user(p, req, SIP_INVITE, e, 1, sin, ignore); -@@ -8563,22 +8669,22 @@ - get_rdnis(p, NULL); - extract_uri(p, req); - build_contact(p); -- -- if (gotdest) { -+ -+ if (!replace_id && gotdest) { - if (gotdest < 0) { - if (ignore) - transmit_response(p, "404 Not Found", req); - else - transmit_response_reliable(p, "404 Not Found", req, 1); - update_user_counter(p,DEC_IN_USE); -- } else { -- if (ignore) -- transmit_response(p, "484 Address Incomplete", req); -- else -- transmit_response_reliable(p, "484 Address Incomplete", req, 1); -- update_user_counter(p,DEC_IN_USE); -- } -- ast_set_flag(p, SIP_NEEDDESTROY); -+ } else { -+ if (ignore) -+ transmit_response(p, "484 Address Incomplete", req); -+ else -+ transmit_response_reliable(p, "484 Address Incomplete", req, 1); -+ update_user_counter(p,DEC_IN_USE); -+ } -+ ast_set_flag(p, SIP_NEEDDESTROY); - } else { - /* If no extension was specified, use the s one */ - if (ast_strlen_zero(p->exten)) -@@ -8591,16 +8697,41 @@ - /* Save Record-Route for any later requests we make on this dialogue */ - build_route(p, req, 0); - if (c) { -+ if (replace_id) { -+ struct sip_pvt *refer_pvt; -+ struct ast_frame *f; -+ -+ if ((refer_pvt = get_sip_pvt_byid_locked(replace_id, req, NULL, p->theirtag))) { -+ ast_log(LOG_DEBUG, "XXXXXXXX I PARSED a Replaces [%s]\n", p_replaces); -+ transmit_response(p, "100 Trying", req); -+ ast_mutex_unlock(&refer_pvt->owner->lock); -+ ast_mutex_unlock(&refer_pvt->lock); -+ ast_channel_masquerade(refer_pvt->owner, c ); -+ ast_hangup(c); -+ c = refer_pvt->owner; -+ if ((f = ast_read(c))) { -+ ast_log(LOG_DEBUG, "XXXXXXXX I DID a Replaces [%s]\n", p_replaces); -+ ast_frfree(f); -+ ast_setstate(c, AST_STATE_UP); -+ } -+ } else { -+ transmit_response_with_allow(p, "481 Call/Transaction Does Not Exist", req, 0); -+ return 0; -+ } -+ } - /* Pre-lock the call */ - ast_mutex_lock(&c->lock); - } - } -- -- } else -+ } else { - c = p->owner; -- if (!ignore && p) -+ } -+ -+ if (!ignore && p) { - p->lastinvite = seqno; -+ } - if (c) { -+ - switch(c->_state) { - case AST_STATE_DOWN: - transmit_response(p, "100 Trying", req); -@@ -8688,11 +8819,13 @@ - if (ast_strlen_zero(p->context)) - strncpy(p->context, default_context, sizeof(p->context) - 1); - res = get_refer_info(p, req); -- if (res < 0) -+ if (res == SIP_RETVAL_IGNORE) { -+ ignore = 1; -+ } else if (res < 0) { - transmit_response_with_allow(p, "404 Not Found", req, 1); -- else if (res > 0) -+ } else if (res > 0) { - transmit_response_with_allow(p, "484 Address Incomplete", req, 1); -- else { -+ } else { - int nobye = 0; - if (!ignore) { - if (p->refer_call) { -@@ -9016,7 +9149,7 @@ - cseq += len; - - /* Determine the request URI for sip, sips or tel URIs */ -- if( determine_firstline_parts( req ) < 0 ) { -+ if ( determine_firstline_parts( req ) < 0 ) { - return -1; - } - cmd = req->rlPart1; -@@ -9723,7 +9856,7 @@ - ast_set_flag(flags, SIP_PROG_INBAND_YES); - } else if (!strcasecmp(v->name, "allowguest")) { - #ifdef OSP_SUPPORT -- if(!strcasecmp(v->value, "osp")) -+ if (!strcasecmp(v->value, "osp")) - global_allowguest = 2; - else - #endif -@@ -9893,7 +10026,7 @@ - if (varname && (varval = strchr(varname,'='))) { - *varval = '\0'; - varval++; -- if((tmpvar = ast_variable_new(varname, varval))) { -+ if ((tmpvar = ast_variable_new(varname, varval))) { - tmpvar->next = user->chanvars; - user->chanvars = tmpvar; - } -@@ -10037,7 +10170,7 @@ - peer->expiry = expiry; - } - /* If we have channel variables, remove them (reload) */ -- if(peer->chanvars) { -+ if (peer->chanvars) { - ast_variables_destroy(peer->chanvars); - peer->chanvars = NULL; - } -@@ -10210,7 +10343,7 @@ - if (varname && (varval = strchr(varname,'='))) { - *varval = '\0'; - varval++; -- if((tmpvar = ast_variable_new(varname, varval))) { -+ if ((tmpvar = ast_variable_new(varname, varval))) { - tmpvar->next = peer->chanvars; - peer->chanvars = tmpvar; - } -@@ -10347,7 +10480,7 @@ - ast_set2_flag((&global_flags_page2), ast_true(v->value), SIP_PAGE2_RTNOUPDATE); - } else if (!strcasecmp(v->name, "rtautoclear")) { - int i = atoi(v->value); -- if(i > 0) -+ if (i > 0) - global_rtautoclear = i; - else - i = 0; -@@ -11124,7 +11257,7 @@ - p = p->next; - /* Free associated memory */ - ast_mutex_destroy(&pl->lock); -- if(pl->chanvars) { -+ if (pl->chanvars) { - ast_variables_destroy(pl->chanvars); - pl->chanvars = NULL; - } |