diff options
author | martinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-10-15 22:12:05 +0000 |
---|---|---|
committer | martinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-10-15 22:12:05 +0000 |
commit | 6e20c666e6782f68a1ddd4614e28b47cd5819f41 (patch) | |
tree | 0da9e80bca7ce1f960de041f81f5aea2d488c35d /channels/chan_sip.c | |
parent | a446b68cdba434083ad8e68c5a23b1a91a2afff9 (diff) |
In the SIP -> SIP if the called party disconnects with 486 make sure that the calling party gets 486 also
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1633 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_sip.c')
-rwxr-xr-x | channels/chan_sip.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index efc584d34..7fd8f941b 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1010,6 +1010,31 @@ static void sip_destroy(struct sip_pvt *p) static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req); +static int hangup_sip2cause(int cause) +{ + switch(cause) + { + case 486: + return AST_CAUSE_BUSY; + default: + return AST_CAUSE_NORMAL; + } + /* Never reached */ + return 0; +} + +static char *hangup_cause2sip(int cause) +{ + switch(cause) + { + case AST_CAUSE_BUSY: + return "486 Busy"; + default: + return NULL; + } + /* Never reached */ + return 0; +} static int sip_hangup(struct ast_channel *ast) { @@ -1061,8 +1086,13 @@ static int sip_hangup(struct ast_channel *ast) INVITE, but do set an autodestruct just in case. */ needdestroy = 0; sip_scheddestroy(p, 15000); - } else - transmit_response_reliable(p, "403 Forbidden", &p->initreq); + } else { + char *res; + if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) { + transmit_response_reliable(p, res, &p->initreq); + } else + transmit_response_reliable(p, "403 Forbidden", &p->initreq); + } } else { if (!p->pendinginvite) { /* Send a hangup */ @@ -4458,19 +4488,6 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req) strncpy(p->owner->call_forward, s, sizeof(p->owner->call_forward) - 1); } -static int hangup_sip2cause(int cause) -{ - switch(cause) - { - case 486: - return AST_CAUSE_BUSY; - default: - return AST_CAUSE_NORMAL; - } - /* Never reached */ - return 0; -} - static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_request *req) { char *to; |