aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
authormartinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b>2003-10-15 22:12:05 +0000
committermartinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b>2003-10-15 22:12:05 +0000
commit6e20c666e6782f68a1ddd4614e28b47cd5819f41 (patch)
tree0da9e80bca7ce1f960de041f81f5aea2d488c35d /channels/chan_sip.c
parenta446b68cdba434083ad8e68c5a23b1a91a2afff9 (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-xchannels/chan_sip.c47
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;