diff --git a/apps/app_dial.c b/apps/app_dial.c index 62abe7bbf3..f8f2346d3b 100755 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -174,7 +174,7 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception } while(0) -static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localuser *outgoing, int *to, struct ast_flags *locflags, int *sentringing, char *status, size_t statussize, int busystart, int nochanstart, int congestionstart) +static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localuser *outgoing, int *to, struct ast_flags *peerflags, int *sentringing, char *status, size_t statussize, int busystart, int nochanstart, int congestionstart) { struct localuser *o; int found; @@ -192,7 +192,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu int single; struct ast_channel *winner; - single = (outgoing && !outgoing->next && !ast_test_flag(outgoing, DIAL_MUSICONHOLD) && !ast_test_flag(outgoing, DIAL_RINGBACKONLY)); + single = (outgoing && !outgoing->next && !ast_test_flag(outgoing, DIAL_MUSICONHOLD | DIAL_RINGBACKONLY)); if (single) { /* Turn off hold music, etc */ @@ -245,7 +245,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "%s answered %s\n", o->chan->name, in->name); peer = o->chan; - ast_copy_flags(locflags, o, DIAL_ALLOWREDIRECT_IN|DIAL_ALLOWREDIRECT_OUT|DIAL_ALLOWDISCONNECT_IN|DIAL_ALLOWDISCONNECT_OUT); + ast_copy_flags(peerflags, o, DIAL_ALLOWREDIRECT_IN|DIAL_ALLOWREDIRECT_OUT|DIAL_ALLOWDISCONNECT_IN|DIAL_ALLOWDISCONNECT_OUT); } } else if (o->chan && (o->chan == winner)) { if (!ast_strlen_zero(o->chan->call_forward)) { @@ -352,7 +352,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "%s answered %s\n", o->chan->name, in->name); peer = o->chan; - ast_copy_flags(locflags, o, DIAL_ALLOWREDIRECT_IN|DIAL_ALLOWREDIRECT_OUT|DIAL_ALLOWDISCONNECT_IN|DIAL_ALLOWDISCONNECT_OUT); + ast_copy_flags(peerflags, o, DIAL_ALLOWREDIRECT_IN|DIAL_ALLOWREDIRECT_OUT|DIAL_ALLOWDISCONNECT_IN|DIAL_ALLOWDISCONNECT_OUT); } /* If call has been answered, then the eventual hangup is likely to be normal hangup */ in->hangupcause = AST_CAUSE_NORMAL_CLEARING; @@ -395,7 +395,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu /* Ignore going off hook and flash */ break; case -1: - if (!ast_test_flag(outgoing, DIAL_RINGBACKONLY) && !ast_test_flag(outgoing, DIAL_MUSICONHOLD)) { + if (!ast_test_flag(outgoing, DIAL_RINGBACKONLY | DIAL_MUSICONHOLD)) { if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "%s stopped sounds\n", o->chan->name); ast_indicate(in, -1); @@ -440,7 +440,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu ast_frfree(f); return NULL; } - if (f && (f->frametype == AST_FRAME_DTMF) && ast_test_flag(locflags, DIAL_ALLOWDISCONNECT_OUT) && + if (f && (f->frametype == AST_FRAME_DTMF) && ast_test_flag(peerflags, DIAL_ALLOWDISCONNECT_OUT) && (f->subclass == '*')) { if (option_verbose > 3) ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass); @@ -473,7 +473,7 @@ static int dial_exec(struct ast_channel *chan, void *data) struct localuser *outgoing=NULL, *tmp; struct ast_channel *peer; int to; - struct ast_flags locflags={0}; + struct ast_flags peerflags={0}; int hasmacro = 0; int privacy=0; int announce=0; @@ -791,7 +791,9 @@ static int dial_exec(struct ast_channel *chan, void *data) ast_set2_flag(tmp, strchr(transfer, 'r'), DIAL_RINGBACKONLY); ast_set2_flag(tmp, strchr(transfer, 'm'), DIAL_MUSICONHOLD); ast_set2_flag(tmp, strchr(transfer, 'H'), DIAL_ALLOWDISCONNECT_OUT); - ast_set2_flag(tmp, strchr(transfer, 'h'), DIAL_ALLOWDISCONNECT_IN); + ast_set2_flag(&peerflags, strchr(transfer, 'H'), DIAL_ALLOWDISCONNECT_OUT); + ast_set2_flag(tmp, strchr(transfer, 'h'), DIAL_ALLOWDISCONNECT_IN); + ast_set2_flag(&peerflags, strchr(transfer, 'h'), DIAL_ALLOWDISCONNECT_IN); ast_set2_flag(tmp, strchr(transfer, 'f'), DIAL_FORCECALLERID); ast_set2_flag(tmp, strchr(transfer, 'w'), DIAL_MONITOR_IN); ast_set2_flag(tmp, strchr(transfer, 'W'), DIAL_MONITOR_OUT); @@ -985,7 +987,7 @@ static int dial_exec(struct ast_channel *chan, void *data) strncpy(status, "CHANUNAVAIL", sizeof(status) - 1); time(&start_time); - peer = wait_for_answer(chan, outgoing, &to, &locflags, &sentringing, status, sizeof(status), numbusy, numnochan, numcongestion); + peer = wait_for_answer(chan, outgoing, &to, &peerflags, &sentringing, status, sizeof(status), numbusy, numnochan, numcongestion); if (!peer) { if (to) @@ -1071,13 +1073,13 @@ static int dial_exec(struct ast_channel *chan, void *data) if (!strcasecmp(macro_result, "BUSY")) { strncpy(status, macro_result, sizeof(status) - 1); if (!ast_goto_if_exists(chan, NULL, NULL, chan->priority + 101)) { - ast_set_flag(&locflags, DIAL_GO_ON); + ast_set_flag(&peerflags, DIAL_GO_ON); } res = -1; } else if (!strcasecmp(macro_result, "CONGESTION") || !strcasecmp(macro_result, "CHANUNAVAIL")) { strncpy(status, macro_result, sizeof(status) - 1); - ast_set_flag(&locflags, DIAL_GO_ON); + ast_set_flag(&peerflags, DIAL_GO_ON); res = -1; } else if (!strcasecmp(macro_result, "CONTINUE")) { @@ -1085,7 +1087,7 @@ static int dial_exec(struct ast_channel *chan, void *data) the context / exten / priority or perhaps the next priority in the current exten is desired. */ - ast_set_flag(&locflags, DIAL_GO_ON); + ast_set_flag(&peerflags, DIAL_GO_ON); res = -1; } else if (!strcasecmp(macro_result, "ABORT")) { /* Hangup both ends unless the caller has the g flag */ @@ -1100,7 +1102,7 @@ static int dial_exec(struct ast_channel *chan, void *data) macro_transfer_dest[res] = '|'; if(!ast_parseable_goto(chan, macro_transfer_dest)) - ast_set_flag(&locflags, DIAL_GO_ON); + ast_set_flag(&peerflags, DIAL_GO_ON); } } @@ -1123,17 +1125,17 @@ static int dial_exec(struct ast_channel *chan, void *data) config.features_caller |= AST_FEATURE_PLAY_WARNING; if (play_to_callee) config.features_callee |= AST_FEATURE_PLAY_WARNING; - if (ast_test_flag(&locflags, DIAL_ALLOWREDIRECT_IN)) + if (ast_test_flag(&peerflags, DIAL_ALLOWREDIRECT_IN)) config.features_callee |= AST_FEATURE_REDIRECT; - if (ast_test_flag(&locflags, DIAL_ALLOWREDIRECT_OUT)) + if (ast_test_flag(&peerflags, DIAL_ALLOWREDIRECT_OUT)) config.features_caller |= AST_FEATURE_REDIRECT; - if (ast_test_flag(&locflags, DIAL_ALLOWDISCONNECT_IN)) + if (ast_test_flag(&peerflags, DIAL_ALLOWDISCONNECT_IN)) config.features_callee |= AST_FEATURE_DISCONNECT; - if (ast_test_flag(&locflags, DIAL_ALLOWDISCONNECT_OUT)) + if (ast_test_flag(&peerflags, DIAL_ALLOWDISCONNECT_OUT)) config.features_caller |= AST_FEATURE_DISCONNECT; - if (ast_test_flag(&locflags, DIAL_MONITOR_IN)) + if (ast_test_flag(&peerflags, DIAL_MONITOR_IN)) config.features_callee |= AST_FEATURE_AUTOMON; - if (ast_test_flag(&locflags, DIAL_MONITOR_OUT)) + if (ast_test_flag(&peerflags, DIAL_MONITOR_OUT)) config.features_caller |= AST_FEATURE_AUTOMON; config.timelimit = timelimit; config.play_warning = play_warning; @@ -1187,7 +1189,7 @@ out: LOCAL_USER_REMOVE(u); - if((ast_test_flag(&locflags, DIAL_GO_ON)) && (!chan->_softhangup)) + if((ast_test_flag(&peerflags, DIAL_GO_ON)) && (!chan->_softhangup)) res=0; return res;