diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/channel.c | 14 | ||||
-rw-r--r-- | main/pbx.c | 4 |
2 files changed, 13 insertions, 5 deletions
diff --git a/main/channel.c b/main/channel.c index 69689f79c..7545f4e1a 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 4f759a9c0..46d7f152f 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; |