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.