Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 133076) +++ channels/chan_sip.c (working copy) @@ -15760,9 +15760,16 @@ sipmethod = find_sip_method(msg); owner = p->owner; - if (owner) + if (owner) { owner->hangupcause = hangup_sip2cause(resp); + char hangupcausetext[256]; + snprintf(hangupcausetext,256,"SIP %s",req->rlPart2); + + pbx_builtin_setvar_helper(owner,"HANGUPCAUSETEXT",hangupcausetext); + ast_log(LOG_WARNING,"Setted up: %s\n",hangupcausetext); + } + /* Acknowledge whatever it is destined for */ if ((resp >= 100) && (resp <= 199)) __sip_semi_ack(p, seqno, 0, sipmethod); Index: apps/app_dial.c =================================================================== --- apps/app_dial.c (revision 133076) +++ apps/app_dial.c (working copy) @@ -567,6 +567,13 @@ char status[256]; }; +static void copy_variable(struct ast_channel *dst,struct ast_channel *src,char *varname) +{ + const char *sreason; + sreason = pbx_builtin_getvar_helper(src, varname); + pbx_builtin_setvar_helper(dst,"HANGUPCAUSETEXT",sreason); +} + static struct ast_channel *wait_for_answer(struct ast_channel *in, struct chanlist *outgoing, int *to, struct ast_flags64 *peerflags, struct privacy_args *pa, @@ -656,6 +663,8 @@ f = ast_read(winner); if (!f) { in->hangupcause = c->hangupcause; + + copy_variable(in,c,"HANGUPCAUSETEXT"); #ifdef HAVE_EPOLL ast_poll_channel_del(in, c); #endif @@ -688,10 +697,14 @@ /* If call has been answered, then the eventual hangup is likely to be normal hangup */ in->hangupcause = AST_CAUSE_NORMAL_CLEARING; c->hangupcause = AST_CAUSE_NORMAL_CLEARING; + break; case AST_CONTROL_BUSY: ast_verb(3, "%s is busy\n", c->name); in->hangupcause = c->hangupcause; + + copy_variable(in,c,"HANGUPCAUSETEXT"); + ast_hangup(c); c = o->chan = NULL; ast_clear_flag64(o, DIAL_STILLGOING); @@ -700,6 +713,10 @@ case AST_CONTROL_CONGESTION: ast_verb(3, "%s is circuit-busy\n", c->name); in->hangupcause = c->hangupcause; + + copy_variable(in,c,"HANGUPCAUSETEXT"); + + ast_hangup(c); c = o->chan = NULL; ast_clear_flag64(o, DIAL_STILLGOING); @@ -1971,8 +1988,11 @@ ast_parseable_goto(peer, opt_args[OPT_ARG_CALLEE_GO_ON]); ast_pbx_start(peer); } else { - if (!ast_check_hangup(chan)) + if (!ast_check_hangup(chan)) { + //carles chan->hangupcause = peer->hangupcause; + copy_variable(chan,peer,"HANGUPCAUSETEXT"); + } ast_hangup(peer); } } Index: main/pbx.c =================================================================== --- main/pbx.c (revision 133076) +++ main/pbx.c (working copy) @@ -2494,6 +2494,9 @@ } else if (!strcmp(var, "HANGUPCAUSE")) { snprintf(workspace, workspacelen, "%d", c->hangupcause); s = workspace; + } else if (!strcmp(var,"HANGUPCAUSETEXT")) { + const char *hangupcausetext = pbx_builtin_getvar_helper(c, "HANGUPCAUSETEXT"); + s = hangupcausetext; } } if (s == ¬_found) { /* look for more */ @@ -7707,12 +7710,14 @@ if ((cause = ast_str2cause(data)) > -1) { chan->hangupcause = cause; + pbx_builtin_setvar_helper(chan,"HANGUPCAUSETEXT","AQUI1"); return -1; } cause = strtol((const char *) data, &endptr, 10); if (cause != 0 || (data != endptr)) { chan->hangupcause = cause; + pbx_builtin_setvar_helper(chan,"HANGUPCAUSETEXT","AQUI2"); return -1; } @@ -7721,6 +7726,7 @@ if (!chan->hangupcause) { chan->hangupcause = AST_CAUSE_NORMAL_CLEARING; + pbx_builtin_setvar_helper(chan,"HANGUPCAUSETEXT","AQUI3"); } return -1;