diff --git a/apps/app_read.c b/apps/app_read.c index f4a965c8b4..e2ac60cc96 100644 --- a/apps/app_read.c +++ b/apps/app_read.c @@ -85,6 +85,13 @@ and you will need to rely on duration and max digits for ending input. + @@ -125,6 +132,7 @@ enum read_option_flags { OPT_INDICATION = (1 << 1), OPT_NOANSWER = (1 << 2), OPT_TERMINATOR = (1 << 3), + OPT_KEEP_TERMINATOR = (1 << 4), }; enum { @@ -138,6 +146,7 @@ AST_APP_OPTIONS(read_app_options, { AST_APP_OPTION('i', OPT_INDICATION), AST_APP_OPTION('n', OPT_NOANSWER), AST_APP_OPTION_ARG('t', OPT_TERMINATOR, OPT_ARG_TERMINATOR), + AST_APP_OPTION('e', OPT_KEEP_TERMINATOR), }); static char *app = "Read"; @@ -261,12 +270,20 @@ static int read_exec(struct ast_channel *chan, const char *data) } } else { res = ast_app_getdata_terminator(chan, arglist.filename, tmp, maxdigits, to, terminator); - if (res == AST_GETDATA_COMPLETE || res == AST_GETDATA_EMPTY_END_TERMINATED) + if (res == AST_GETDATA_COMPLETE) { + status = "OK"; + } else if (res == AST_GETDATA_EMPTY_END_TERMINATED) { + if (ast_test_flag(&flags, OPT_KEEP_TERMINATOR)) { + /* if the option is set to do so, read the + returned string as the terminator string */ + ast_copy_string(tmp, terminator, sizeof(tmp)); + } status = "OK"; - else if (res == AST_GETDATA_TIMEOUT) + } else if (res == AST_GETDATA_TIMEOUT) { status = "TIMEOUT"; - else if (res == AST_GETDATA_INTERRUPTED) + } else if (res == AST_GETDATA_INTERRUPTED) { status = "INTERRUPTED"; + } } if (res > -1) { pbx_builtin_setvar_helper(chan, arglist.variable, tmp); diff --git a/doc/CHANGES-staging/app_read_return_terminator.txt b/doc/CHANGES-staging/app_read_return_terminator.txt new file mode 100644 index 0000000000..2987f77ea7 --- /dev/null +++ b/doc/CHANGES-staging/app_read_return_terminator.txt @@ -0,0 +1,5 @@ +Subject: app_read + +A new option 'e' has been added to allow Read() to return the +terminator as the dialed digits in the case where only the terminator +is entered.