diff -urN asterisk-1.0.2.orig/channels/chan_iax2.c asterisk-1.0.2/channels/chan_iax2.c --- asterisk-1.0.2.orig/channels/chan_iax2.c 2004-10-25 19:57:25.000000000 +0200 +++ asterisk-1.0.2/channels/chan_iax2.c 2004-10-27 20:37:09.948419048 +0200 @@ -7,6 +7,9 @@ * * Mark Spencer * + * Hangup cause signalling implementation by + * Levent Guendogdu + * * This program is free software, distributed under the terms of * the GNU General Public License */ @@ -2397,14 +2400,19 @@ static int iax2_hangup(struct ast_channel *c) { unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt); + struct iax_ie_data ied; + char causestr[256]; + sprintf(causestr, "%i", c->hangupcause); int alreadygone; ast_mutex_lock(&iaxsl[callno]); if (callno && iaxs[callno]) { - ast_log(LOG_DEBUG, "We're hanging up %s now...\n", c->name); + memset(&ied, 0, sizeof(ied)); + iax_ie_append_str(&ied, IAX_IE_CAUSE, causestr); + ast_log(LOG_DEBUG, "We're hanging up %s with cause %i now...\n", c->name, c->hangupcause); alreadygone = iaxs[callno]->alreadygone; /* Send the hangup unless we have had a transmission error or are already gone */ if (!iaxs[callno]->error && !alreadygone) - send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, NULL, 0, -1); + send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1); /* Explicitly predestroy it */ iax2_predestroy_nolock(callno); /* If we were already gone to begin with, destroy us now */ @@ -5487,6 +5495,11 @@ case IAX_COMMAND_HANGUP: iaxs[fr.callno]->alreadygone = 1; ast_log(LOG_DEBUG, "Immediately destroying %d, having received hangup\n", fr.callno); + + /* Set hangup cause */ + if (ies.cause) + iaxs[fr.callno]->owner->hangupcause = atoi(ies.cause); + /* Send ack immediately, before we destroy */ send_command_immediate(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_ACK, fr.ts, NULL, 0,fr.iseqno); iax2_destroy_nolock(fr.callno);