Index: channels/chan_misdn.c =================================================================== --- channels/chan_misdn.c (revision 312069) +++ channels/chan_misdn.c (working copy) @@ -681,7 +681,7 @@ static enum event_response_e cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data); -static void send_cause2ast(struct ast_channel *ast, struct misdn_bchannel*bc, struct chan_list *ch); +static int send_cause2ast(struct ast_channel *ast, struct misdn_bchannel *bc, struct chan_list *ch); static void cl_queue_chan(struct chan_list *chan); @@ -8364,8 +8364,7 @@ cb_log(2, port, " --> hangup\n"); ch->need_hangup = 0; ch->need_queue_hangup = 0; - if (ch->ast) { - send_cause2ast(ch->ast, bc, ch); + if (ch->ast && send_cause2ast(ch->ast, bc, ch)) { ast_hangup(ch->ast); } return; @@ -8373,13 +8372,15 @@ if (!ch->need_queue_hangup) { cb_log(2, port, " --> No need to queue hangup\n"); + return; } ch->need_queue_hangup = 0; if (ch->ast) { - send_cause2ast(ch->ast, bc, ch); - ast_queue_hangup_with_cause(ch->ast, bc->cause); - cb_log(2, port, " --> queue_hangup\n"); + if (send_cause2ast(ch->ast, bc, ch)) { + ast_queue_hangup_with_cause(ch->ast, bc->cause); + cb_log(2, port, " --> queue_hangup\n"); + } } else { cb_log(1, port, "Cannot hangup chan, no ast\n"); } @@ -8653,26 +8654,31 @@ } } +/*! + * \retval -1 if can hangup after calling. + * \retval 0 if cannot hangup after calling. + */ +static int send_cause2ast(struct ast_channel *ast, struct misdn_bchannel *bc, struct chan_list *ch) +{ + int can_hangup; - -static void send_cause2ast(struct ast_channel *ast, struct misdn_bchannel *bc, struct chan_list *ch) { if (!ast) { chan_misdn_log(1, 0, "send_cause2ast: No Ast\n"); - return; + return 0; } if (!bc) { chan_misdn_log(1, 0, "send_cause2ast: No BC\n"); - return; + return 0; } if (!ch) { chan_misdn_log(1, 0, "send_cause2ast: No Ch\n"); - return; + return 0; } ast->hangupcause = bc->cause; + can_hangup = -1; switch (bc->cause) { - case AST_CAUSE_UNALLOCATED: case AST_CAUSE_NO_ROUTE_TRANSIT_NET: case AST_CAUSE_NO_ROUTE_DESTINATION: @@ -8699,15 +8705,16 @@ chan_misdn_log(1, bc ? bc->port : 0, "Queued busy already\n"); break; } + ch->need_busy = 0; chan_misdn_log(1, bc ? bc->port : 0, " --> * SEND: Queue Busy pid:%d\n", bc ? bc->pid : -1); - ast_queue_control(ast, AST_CONTROL_BUSY); - ch->need_busy = 0; - + /* The BUSY is likely to cause a hangup or the user needs to hear it. */ + can_hangup = 0; break; } + return can_hangup; }