diff --git a/apps/app_directory.c b/apps/app_directory.c index 0c616b9f4de0341ae20d5ea0c1facf4b1de3e872..c7d2a8bf02727a4d54475e9530ef05229114d43f 100755 --- a/apps/app_directory.c +++ b/apps/app_directory.c @@ -411,11 +411,10 @@ static int directory_exec(struct ast_channel *chan, void *data) char *context, *dialcontext, *dirintro, *options; if (!data) { - ast_log(LOG_WARNING, "directory requires an argument (context[,dialcontext])\n"); + ast_log(LOG_WARNING, "Directory requires an argument (context[,dialcontext])\n"); return -1; } -top: context = ast_strdupa(data); dialcontext = strchr(context, '|'); if (dialcontext) { @@ -446,24 +445,29 @@ top: else dirintro = "dir-intro-fn"; } + if (chan->_state != AST_STATE_UP) res = ast_answer(chan); - if (!res) - res = ast_streamfile(chan, dirintro, chan->language); - if (!res) - res = ast_waitstream(chan, AST_DIGIT_ANY); - ast_stopstream(chan); - if (!res) - res = ast_waitfordigit(chan, 5000); - if (res > 0) { - res = do_directory(chan, cfg, context, dialcontext, res, last); - if (res > 0) { + + for (;;) { + if (!res) + res = ast_streamfile(chan, dirintro, chan->language); + if (!res) res = ast_waitstream(chan, AST_DIGIT_ANY); - ast_stopstream(chan); - if (res >= 0) { - goto top; + ast_stopstream(chan); + if (!res) + res = ast_waitfordigit(chan, 5000); + if (res > 0) { + res = do_directory(chan, cfg, context, dialcontext, res, last); + if (res > 0) { + res = ast_waitstream(chan, AST_DIGIT_ANY); + ast_stopstream(chan); + if (res >= 0) { + continue; + } } } + break; } ast_config_destroy(cfg); LOCAL_USER_REMOVE(u);