diff --git a/apps/app_dial.c b/apps/app_dial.c index 1759fefe9f..f360680cf6 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1380,6 +1380,10 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags res = -1; /* reset default */ } + if (ast_test_flag64(&opts, OPT_DTMF_EXIT)) { + __ast_answer(chan, 0, 0); + } + if (continue_exec) *continue_exec = 0; diff --git a/apps/app_dictate.c b/apps/app_dictate.c index 86ccad8756..abac0c8edd 100644 --- a/apps/app_dictate.c +++ b/apps/app_dictate.c @@ -116,7 +116,9 @@ static int dictate_exec(struct ast_channel *chan, void *data) return -1; } - ast_answer(chan); + if (chan->_state != AST_STATE_UP) { + ast_answer(chan); + } ast_safe_sleep(chan, 200); for (res = 0; !res;) { if (ast_strlen_zero(filename)) { diff --git a/apps/app_waitforsilence.c b/apps/app_waitforsilence.c index eedbf15ac4..bb6e06f7ba 100644 --- a/apps/app_waitforsilence.c +++ b/apps/app_waitforsilence.c @@ -168,7 +168,9 @@ static int waitfor_exec(struct ast_channel *chan, void *data, int wait_for_silen int iterations = 1, i; time_t waitstart; - res = ast_answer(chan); /* Answer the channel */ + if (chan->_state != AST_STATE_UP) { + res = ast_answer(chan); /* Answer the channel */ + } if (!data || ( (sscanf(data, "%d,%d,%d", &timereqd, &iterations, &timeout) != 3) && (sscanf(data, "%d,%d", &timereqd, &iterations) != 2) && diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 80783344f5..c1898bff1d 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -971,7 +971,7 @@ void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval off * \retval non-zero on failure */ int ast_answer(struct ast_channel *chan); -int __ast_answer(struct ast_channel *chan, unsigned int delay); +int __ast_answer(struct ast_channel *chan, unsigned int delay, int cdr_answer); /*! \brief Make a call * \param chan which channel to make the call on diff --git a/main/channel.c b/main/channel.c index 69689f79c3..7545f4e1ae 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1676,7 +1676,7 @@ int ast_hangup(struct ast_channel *chan) } #define ANSWER_WAIT_MS 500 -int __ast_answer(struct ast_channel *chan, unsigned int delay) +int __ast_answer(struct ast_channel *chan, unsigned int delay, int cdr_answer) { int res = 0; @@ -1704,7 +1704,9 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay) res = chan->tech->answer(chan); } ast_setstate(chan, AST_STATE_UP); - ast_cdr_answer(chan->cdr); + if (cdr_answer) { + ast_cdr_answer(chan->cdr); + } ast_channel_unlock(chan); if (delay) { ast_safe_sleep(chan, delay); @@ -1740,6 +1742,12 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay) } break; case AST_STATE_UP: + /* Calling ast_cdr_answer when it it has previously been called + * is essentially a no-op, so it is safe. + */ + if (cdr_answer) { + ast_cdr_answer(chan->cdr); + } break; default: break; @@ -1753,7 +1761,7 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay) int ast_answer(struct ast_channel *chan) { - return __ast_answer(chan, 0); + return __ast_answer(chan, 0, 1); } void ast_deactivate_generator(struct ast_channel *chan) diff --git a/main/pbx.c b/main/pbx.c index 4f759a9c07..46d7f152f2 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -7788,7 +7788,7 @@ static int pbx_builtin_answer(struct ast_channel *chan, void *data) delay = 0; } - return __ast_answer(chan, delay); + return __ast_answer(chan, delay, 1); } static int pbx_builtin_incomplete(struct ast_channel *chan, void *data) @@ -7805,7 +7805,7 @@ static int pbx_builtin_incomplete(struct ast_channel *chan, void *data) if (ast_check_hangup(chan)) { return -1; } else if (chan->_state != AST_STATE_UP && answer) { - __ast_answer(chan, 0); + __ast_answer(chan, 0, 1); } return AST_PBX_INCOMPLETE;